국문과 유목민

[일일 리포트] Day 20 (Docker/MLFlow) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일 리포트] Day 20 (Docker/MLFlow)

논곰 2022. 2. 16. 12:50

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

Docker

Docker는 가상화를 위한 Container 기술을 쉽게 사용할 수 있게 나온 도구이다. Container는 이전 가상화 기술인 VM(Virtual Machine)이 가지고 있는 무겁다는 단점을 덜어주고, 좀 더 경량화 된 프로세스의 개념으로 가상화를 할 수 있게 만든 기술이다. 따라서 우리는 OS가 달라서 생기는 문제나 Local과 Production 서버의 환경 불일치 문제 등을 해소하고 어느 환경에서나 동일한 환경으로 프로그램을 실행할 수 있다.

  • Docker Image: 컨테이너를 실행할 때 사용할 수 있는 '템플릿' Read만 가능하다.
  • Docker Container: Docker Image를 활용해 실행된 인스턴스이며 Write가 가능하다.
  • Docker 할 수 있는 일: 다른 사람이 만든 소프트웨어를 가져와서 바로 사용할 수 있다.
VM과 Docker의 차이점을 설명할 수 있다면 더 좋다. 하이퍼바어지의 유무, 독립된 실행, 경량화된 프로세스

Docker 실행하기

생성 (mysql image를 예로)

  • docker pull "이미지 이름:태그": (docker pull mysql:8)
  • docker images : 다운받은 이미지 목록 확인

실행

  • docker run “이미지 이름:태그": 다운받은 이미지 기반으로 Docker Container 만들고 실행
    -docker run --name mysql-tutorial -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:8
    • --name:컨테이너 이름
    • -e: 환경변수 설정
    • -d: 데몬 모드, 백그라운드 모드
    • -p: 포트 지정(로컬 호스트:컨테이너 이미지 내부)[로컬 호스트: 우리 컴퓨터 / 컨테이너: 컨테이너 이미지 내부]
  • docker ps: 실행한 컨테이너 확인
  • docker exec -it “컨테이너 이름(혹은 ID)” /bin/bash: 컴퓨터 엔진에서 SSH와 접속하는 것과 유사
  • mysql -u root -p: MySQL프로세스로 들어가기

종료 및 삭제

  • docker stop “컨테이너 이름(ID)” : 실행중인 컨테이너를 중지
  • docker ps -a: 작동을 멈춘 컨테이너를 확인
  • docker rm :컨테이너 이름(ID)": 멈춘 컨테이너만 삭제할 수 있다. [-f 입력 시 삭제가능]

docker run할 때 파일 공유 방법

Volume Mount: Host와 Container의 저장소를 공유해야 한다. -v옵션을 사용하며, -p(Port)처럼 사용한다.

  • -v Host_Folder:Contaienr_Folder
  • 예: docker run -it -p 8888:8888 -v /some/host/folder/for/work:/home/jovyan/workspace jupyter/minimal-notebook

Dockerhub

  • Dockerhub에 공개된 모든 이미지를 다운받을 수 있음, MySQL도 Dockerhub에서 다운로드 가능. Dockerhub에 왠만한 오픈소스들이 공개되어 있고, 우리는 필요한 이미지를 찾아 실행할 수 있다.

Docker Image 만들기

  1. pip freeze: 설치한 라이브러리를 모두 보여준다.
    • pip list --not-required --format=freeze: 의존성에 따라 설치된 라이브러리는 보이지 않음
  2. pip로 설치한 라이브러리를 모두 requirements.txt에 저장
    • pip freeze > requirements.txt
  3. Dockerfile을 만들어서 작성
# Dockerfile
FROM python:3.8.7-slim-buster
COPY . /app
WORKDIR /app
# 파이썬 애플리케이션 통상적으로 아래 두 값을 지정
ENV PYTHONPATH=/app
ENV PYTHONBUFFERED=1

RUN pip install pip==21.2.4 &&\
    pip install -r requirements.txt
CMD ["python", "main.py"]​
  • FROM “이미지 이름:태그": 이미지 빌드에 사용할 베이스 이미지 지정
  • COPY: 로컬 내 디렉토리 및 파일을 컨테이너 내부로 복사
  • WORKDIR: RUN, CMD 등을 실행할 컨테이너 내 디렉토리 지정
  • ENV “환경변수 이름=값": 컨테이너 내 환경변수 지정
  • RUN “실행할 리눅스 명령어": 애플리케이션 실행에 필요한 여러 리눅스 명령어들을 실행. 한번에 실행할 명령어가 여러 개인 경우 && \로 이어줌
  • CMD ["실행할 명령어", "인자", ...]: docker run으로 이 이미지를 기반으로 컨테이너를 만들 때 바로 실행할 명령어 지정

docker build “Dockerfile이 위치한 경로” -t “이미지 이름:태그”: 이미지 빌드

docker images: 빌드를 마치면 방금 빌드한 이미지 확인 가능

docker run “이미지 이름:태그”: 방금 만든 이미지를 실행

 

여기까지 진행을 하면 다른 터미널을 열어 curl로 애플리케이션이 잘 작동하는지 확인할 수 있다. 그 외에 Dockerfile에서 사용하는 것

  • EXPOSE : 컨테이너 외부에 노출할 포트 지정
  • ENTRYPOINT : 이미지를 컨테이너로 띄울 때 항상 실행하는 커맨드

MLFlow

머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스이다. 관련 오픈소스 중 제일 빠르게 성장하고 있다. MLFlow는 다음과 같은 기능을 가지고 있다. 

  1. Experiment Management&Tracking
    • 머신러닝 관련 “실험”들을 관리하고, 각 실험의 내용들을 기록할 수 있음
    • 각 실험을 실행하는데 사용한 소스 코드, 하이퍼 파라미터, Metric, 부산물(모델 Artifact, Chart Image) 등을 저장한다.
  2. Model Registry
    • MLflow로 실행한 머신러닝 모델을 Model Registry(모델 저장소)에 등록할 수 있음
    • 모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감(Version 1 → 2 3..)
    • Model Registry에 등록된 모델은 다른 사람들에게 쉽게 공유 가능하고, 쉽게 활용할 수 있음 
  3. Model Serving
    • Model Registry에 등록한 모델을 REST API 형태의 서버로 Serving 할 수 있음
    • Input = Model의 Input
    • Output = Model의 Output
    • 직접 Docker Image 만들지 않아도 생성할 수 있음

MLFlow Component

1) MLflow Project머신러닝 프로젝트 코드를 패키징하기 위한 표준  

2) MLflow Tracking: 머신러닝 코드 실행, 로깅을 위한 API, UI  
3) MLflow Model:모델은 모델 파일과 코드로 저장 다양한 플랫폼에 배포할 수 있는 여러 도구 제공  
4) MLflow Registry: MLflow Model의 전체 Lifecycle에서 사용할 수 있는 중앙 모델 저장소
  

- 설치: pip install mlflow

Experiment

 MLflow에서 제일 먼저 Experiment를 생성해야 한다. 하나의 Experiment는 진행하고 있는 머신러닝 프로젝트 단위로 구성한다. 정해진 Metric으로 모델을 평가하며, 하나의 Experiment는 여러 Run(실행)을 가짐

- Experimemt 생성

  • mlflow experiments create --experiment-name my-first-experiment
  • ls-al: 폴더 확인하면 mlruns 폴더가 생김

- Experiment 리스트 확인
- mlflow experiments list

MLProject

프로젝트(MLProject)

MLflow를 사용한 코드의 프로젝트 메타 정보를 저장한다. 프로젝트를 어떤 환경에서 어떻게 실행시킬지 정의하는 것으로 패키지 모듈의 상단에 위치하며 `MLProject`라는 고정된 이름 사용

 

Run(실행)
- 보통 Run은 모델 학습 코드를 실행하는데 사용한다. 하나의 Run은 코드를 1번 실행한 것을 의미하며, 이는 한번의 코드 실행 = 하나의 Run 생성한다고 할 수 있다. Run을 하면 여러가지 내용이 기록되게 된다.

MLflow Tracking

Run에서 로깅하는 것들

  • Source : 실행한 Project의 이름
  • Version : 실행 Hash
  • Start & end time
  • Parameters : 모델 파라미터
  • Metrics : 모델의 평가 지표, Metric을 시각화할 수 있음
  • Tags : 관련된 Tag
  • Artifacts : 실행 과정에서 생기는 다양한 파일들(이미지, 모델 Pickle 등)

UI실행: mlflow ui

MLflow autolog: 로그를 별도로 설정하지 않고, 자동적으로 로그를 생성 mlflow.sklearn.autolog()

  • Run으로 실행
  • mlflow run logistic_regression_with_autolog --experiment-name my-first-experiment --no-conda
  • 주의사항: MLflow에서 지원해주는 프레그레임 워크들이 존재한다

MLflow Hyper Parameter Tuning: autolog와 하이퍼 파라미터 튜닝을 같이 진행할 수 있다.

MLFlow

 MLflow Architecture 

  • 파이썬 코드: 모델을 만들고 학습하는 코드 mlflow run으로 실행
  • Tracking Server: 파이썬 코드가 실행되는 동안 Parameter, Metric, Model 등 메타 정보 등을 파일 혹은 DB에 저장
  • Artifact Store: 파이썬 코드가 실행되는 동안 생기는 Model File, Image 등의 아티팩트를 파일 혹은 Storage에 저장

mlflow server 명령어로 Backend Store URI 지정

  • mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root $(pwd)/artifacts
  • 환경변수 지정
  • Experiments를 생성한 후, Run
  • 데이터를 확인할 수 있음

흐름

  1. 파이썬 코드에서 mlflow run
  2. Trackingg Server에 기록 요청
  3. Trackingg Server가 DB에 기록
  4. 파이썬 코드에서 아티팩트 발생 시 Artifact Store에 아티팩트 저장

실제 활용 사례

MLflow Tracking Server는 하나로 통합해서 운영한다. Tracking Server를 하나만 배포하고, 팀 내 모든 Researcher가 이 Tracking Server에 실험 기록할 수 있게 한다. 배포할 때는 Docker Image, Kubernetes 등에 진행 (회사의 인프라에 따라 다름)


로그나 모델이 한 곳에 저장되므로, 팀 내 모든 실험을 공유할 수 있다. Artifact Storage와 DB 역시 하나로 운영한다. 이 두 저장소는 Tracking Server에 의해 관리된다.

  • Artifact Storage는 GCS나 S3 같은 스토리지 이용
  • DB는 CloudSQL이나 Aurora RDS 같은 DB 이용

▶ Review (생각)

 오늘 정리한 내용은 어제 강의를 들었던 'Docker'와 'MLflow'에 관한 내용이었다. 해당 부분은 모델링 보다는 초기 개발환경 세팅과 Product Surving단계에서 사용하게 될 부분이라는 생각을 했다.  그래서 당장은 사용하지 않더라도 추후 사용하게 될 미래의 나를 위해서 잘 정리해보려고 조금은 길게 쓴 감이 있다. 

 Docker의 경우 항상 구인을 보면 해당 skill의 필요성에 대해서 얘기하는 경우가 많았었던 것 같다. 그래서 계속해서 배우면 좋겠다는 생각을 했었는데, 기회가 없어서 미루다가 이번에 듣게 됐다. 도커를 설치하면서 이번에 알게 된 것은 기존에는 VI를 사용해서 우분투를 설치해야했기 때문에 프로그래밍 무거웠었느데 이번에 wsl2가 나오면서 윈도우에서도 가볍게 우분투를 사용할 수 있게 된 거 같아서 훨씬 좋다고 느꼈다. 물론 이렇게 사용하는 우분투의 경우 CLI환경이라 이에 익숙하지 않으면 힘들었을 것 같지만, Linux를 이전에 활용해보기도 해서 오히려 좋다는 생각을 했다.

 MLflow의 경우 아직 익숙하지 않고, 전체적인 모델 파이프라인을 구성해보지 않아서 그런가 솔직히 필요성을 직접적으로 느끼지 못했다. 하지만 머지 않아 해당 기술과 친숙하게 지내게 될 것 같다는 느낌을 받았다.

 

 이번 강의를 들으면서 느낀 것은 이전에 배웠던 것들을 하나씩 접할 때마다 점점 성장한다는 것이다. 이전에 도커를 VI로 구현했던 적이 있는데 그때에 비해 CLI환경에도 익숙해졌고, 이제는 컴퓨터의 프로세스에 대해서도 이해를 하고 있기에 도커의 필요성에 대해서도 좀 더 직접적으로 깨닫게 된 것 같다. 당장에 눈에 보이지 않을 지라도 배움을 통해서 꾸준한 성장이 있다는 것을 생각하고 조급해하지 말아야겠다.

 내일은 남은 강의들을 듣고 팀 구성 전 관심 있는 주제들에 대해서 공부하고, 알고리즘 문제를 풀어봐야겠다. 

'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글

[일일리포트] Day 22  (0) 2022.02.18
[일일리포트] Day 21  (0) 2022.02.17
[일일리포트] Day 19 (ProjectLifeCycle)  (0) 2022.02.15
[일일리포트] Day 18  (0) 2022.02.14
[4주차] 개인 회고  (0) 2022.02.11
Comments