출처 : 변성윤님 블로그.
출처 : 부스트캠프 AI Tech.
1. MLflow 개념 잡기
- MLflow가 없던 시절
- 사람들이 각자 자신의 코드를 Jupyter Notebook에서 작성
- 머신러닝 모델 학습시 사용한 Parameter, Metric을 따로 기록
- 개인 컴퓨터, 연구실 서버를 사용하다가 메모리 초과로 Memory Exceed 오류 발생 -> 중간에 끊긴 기록
- 학습하며 생긴 Weight File을 저장해 다른 동료들에게 공유
- Weight File 이름으로 Model Versioning을 하거나 아예 Versioning을 하지 않음
- 1) 실험을 추적하기 어렵다
- 2) 코드를 재현하기 어렵다
- 3) 모델을 패키징하고 배포하는 방법이 어렵다
- 4) 모델을 관리하기 위한 중앙 저장소가 없다
1.1 MLflow 란
- 머신러닝 실험, 배포를 쉽게 관리할 수 있는 오픈소스
- CLI, GUI(웹 인터페이스) 지원
- 코드 예시
import numpy as np
from sklearn.linear_model import LinearRegression
import mlflow
def main():
# enable autologging
mlflow.autolog(log_input_examples=True)
# prepare training data
X = np.array([1,1], [1,2], [2,2], [2,3]])
y = np.dot(X, np.array[1,2)) + 3
# train a model
model = LinearRegression()
with mlflow.start_run() as run:
model.fit(X,y)
print("Logged data and model in run {}".format(run.info.run_id))
if __name__ == "__main__":
main()
1.2 MLflow 의 핵심 기능
1.2.1 Experiment Management & Tracking
- 머신러닝 관련 “실험”들을 관리하고, 각 실험의 내용들을 기록할 수 있음
- 예를 들어, 여러 사람이 하나의 MLflow 서버 위에서 각자 자기 실험을 만들고 공유할 수 있음
- 실험을 정의하고, 실험을 실행할 수 있음. 이 실행은 머신러닝 훈련 코드를 실행한 기록
- 각 실행에 사용한 소스 코드, 하이퍼 파라미터, Metric, 부산물(모델 Artifact, Chart Image) 등을 저장
1.2.2 Model Registry
- MLflow로 실행한 머신러닝 모델을 Model Registry(모델 저장소)에 등록할 수 있음
- 모델 저장소에 모델이 저장될 때마다 해당 모델에 버전이 자동으로 올라감(Version 1 -> 2 -> 3..)
- Model Registry에 등록된 모델은 다른 사람들에게 쉽게 공유 가능하고, 쉽게 활용할 수 있음
1.2.3 Model Serving
- Model Registry에 등록한 모델을 REST API 형태의 서버로 Serving 할 수 있음
- Input = Model의 Input
- Output = Model의 Output
- 직접 Docker Image 만들지 않아도 생성할 수 있음
1.3 MLflow Components
1.3.1 MLflow Tracking
- 머신러닝 코드 실행, 로깅을 위한 API, UI
- MLflow Tracking을 사용해 결과를 Local, Server에 기록해 여러 실행과 비교할 수 있음
- 팀에선 다른 사용자의 결과와 비교하며 협업할 수 있음
1.3.2 MLflow Project
- 머신러닝 프로젝트 코드를 패키징하기 위한 표준
- Project
- 간단하겐 소스 코드가 저장된 폴더
- Git Repo
- 의존성과 어떻게 실행해야 하는지 저장
- MLflow Tracking API를 사용하면 MLflow는 프로젝트 버전을 모든 파라미터와 자동으로 로깅
1.3.3 MLflow Model
- 모델은 모델 파일과 코드로 저장
- 다양한 플랫폼에 배포할 수 있는 여러 도구 제공
- MLflow Tracking API를 사용하면 MLflow는 자동으로 해당 프로젝트에 대한 내용을 사용함
1.3.4 MLflow Registry
- MLflow Model의 전체 Lifecycle에서 사용할 수 있는 중앙 모델 저장소
1.4 MLflow 실습
step1. mlflow 설치
$ pip install mlflow
step2. Experiment(실험) 생성
- MLflow에서 제일 먼저 Experiment를 생성
- 하나의 Experiment는 진행하고 있는 머신러닝 프로젝트 단위로 구성
- 예) “개/고양이 이미지 분류 실험”, “택시 수요량 예측 분류 실험”
- 정해진 Metric으로 모델을 평가
- 예) RMSE, MSE, MAE, Accuracy
- 하나의 Experiment는 여러 Run(실행)을 가짐
$ mlflow experiments create --experiment-name my-first-experiment
- ls -al을 사용해 폴더 확인하면 mlruns라는 폴더가 생김
step3. Experiment 목록 확인
$ mlflow experiments list
step4. Experiment Setting
- 모델에 필요한 라이브러리 설치
- 폴더를 생성한 후, 머신러닝 코드 생성
$ pip install numpy sklearn
$ mkdir logistic_regression
$ vi logistic_regression/train.py
step5. MLProject 생성
- MLflow를 사용한 코드의 프로젝트 메타 정보 저장
- 프로젝트를 어떤 환경에서 어떻게 실행시킬지 정의
- 패키지 모듈의 상단에 위치
$ vi logistic_regresssion/MLProject
step6. Run (실행)
- 하나의 Run은 코드를 1번 실행한 것을 의미
- 보통 Run은 모델 학습 코드를 실행
- 즉, 한번의 코드 실행 = 하나의 Run 생성
- Run을 하면 여러가지 내용이 기록됨
- Run에서 로깅하는 것들
- Source : 실행한 Project의 이름 - Version : 실행 Hash
- Start & end time
- Parameters : 모델 파라미터
- Metrics : 모델의 평가 지표, Metric을 시각화할 수 있음
- Tags : 관련된 Tag
- Artifacts : 실행 과정에서 생기는 다양한 파일들(이미지, 모델 Pickle 등)
$ mlflow run logistic_regression --experiment-name my-first-experiment --no-conda
# mlflow 같은 경우, 실행할때 temporary conda environment를 만들어서 실행한다.
# 그냥 현재 환경에서 (그것이 conda, venv 등에 상관없이) 돌릴려면 --no-conda option 을 준다
# --no-conda 옵션은 conda 환경을 안돌린다는 뜻이 아니라, mlflow run 시 새로운 conda 환경을 setting 하지 않는다는 의미이다 .
$ mlflow run logistic_regression --experiment-name my-first-experiment
# 위의 경우는 mlflow run 시 새로운 일시적인 conda 환경을 만들어줍니다.
# 이때 MLProject 파일에 conda_env: conda.yaml 이 설정되어 있으면 해당 파일을 기준으로 conda 환경을 만들어 줍니다.
# conda.yaml 생성방법은 아래와 같습니다.
# 원하는 환경을 activate 한후
$ conda env export --name mlflow > conda.yaml
step7. UI 실행 및 확인
mlflow ui
1.5 Experiment / Run 관계
1.6 MLflow autolog // MLflow Parameter // MLflow Hyper Parameter Tuning
1.6.1. MLflow autolog
- 파라미터를 매번 명시해야 할까?
$ mlflow run logistic_regression_with_autolog --experiment-name my-first-experiment --no-conda
$ mlflow ui
- W/0 autolog
- W/ autolog
- 주의사항
- 모든 프레임워크에서 사용 가능한 것은 아님
- MLflow에서 지원해주는 프레임워크들이 존재
- 예) pytorch.nn.Module은 지원하지 않음(반면 Pytorch Lightning은 지원)
- 자세한 내용은 https://mlflow.org/docs/latest/tracking.html#id2 에서 확인
1.6.2. MLflow Parameter
- MLProject 에 직접 기입
- mlflow run 실행시 파라미터 지정
mlflow run logistic_regression_with_autolog_and_params -P sovler="saga" -P penalty="elasticnet" -P l1_ratio=0.01 --experiment-name my-first-experiment --no-conda
1.6.3. MLflow Hyper Parameter Tuning
- autolog와 하이퍼 파라미터 튜닝도 같이 할 수 있음
- 엄청 편함
$ mlflow run svc_with_hyperparams_tuning --experiment-name my-first-experiment --no-conda
2. MLflow 서버로 배포하기
2.1 MLflow Architecture
- 파이썬 코드
- Tracking Server
2.2 MLflow Tracking Server와 외부 Storage 사용하기
step1. mlflow server 명령어로 Backend Store URI 지정
$ mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root $(pwd)/artifacts
MLflow
step2. 환경변수 지정
$ export MLFLOW_TRACKING_URI="http://127.0.0.1:5000"
step3. Experiments를 생성한 후, Run
$ mlflow experiments create --experiment-name my-experiment
$ mlflow run svm --experiment-name my-experiment --no-conda
step4. url 에서 확인
2.2 MLflow 실제 활용 사례
- MLflow Tracking Server는 하나로 통합 운영
- Tracking Server를 하나 배포하고, 팀 내 모든 Researcher가 이 Tracking Server에 실험 기록
- 배포할 때는 Docker Image, Kubernetes 등에 진행(회사의 인프라에 따라 다름)
- 로그나 모델이 한 곳에 저장되므로, 팀 내 모든 실험을 공유할 수 있음
- Artifact Storage와 DB 역시 하나로 운영
- Artifact Storage는 GCS나 S3 같은 스토리지 이용
- DB는 CloudSQL이나 Aurora RDS 같은 DB 이용
- 이 두 저장소는 Tracking Server에 의해 관리
'MLOps' 카테고리의 다른 글
MLOps - 19. Airflow (0) | 2022.06.03 |
---|---|
MLOps - 18. BentoML (0) | 2022.06.02 |
MLOps - 16.Logging (0) | 2022.05.31 |
MLOps - 15. Docker (0) | 2022.05.30 |
MLOps - 14. FastAPI (0) | 2022.05.29 |
댓글