1. 서론
ML 모델을 개발하다보면 마주치게되는 이슈들이 있습니다. ‘머신러닝 시스템 디자인 패턴’ 도서에서는 각 단계 별로 다음과 같은 이슈들을 제시합니다.
ML 모델 개발 시 각 단계 별 이슈들
- 데이터 수집, 분석 단계
- 수집된 데이터 어노테이션 및 관계 정리 (처음부터 시작하는 경우 시간, 비용이 가장 많이 필요한 단계)
- 해당 과제가 ML로 해결이 가능한 과제인지 생각해야 함
- 모델 선정, 파라미터 정리 단계
- 해당 과제를 위한 ML 모델 선정
- 데이터, 모델에 따른 파라미터 선정 (이 단계에서 POC를 통해 튜닝할 파라미터를 선정하기도 함)
- 평가 결과가 좋은 모델이 언제나 실제 시스템에서 사용할 수 있는 것은 아니므로, 비용, 속도를 고려한 타협이 필요함
- 전처리 단계
- 전처리 방식은 data dependent 함
- 새로운 데이터가 들어왔을 때 같은 전처리 방식을 적용할 수 있어야 함
- 학습 단계
- 처음부터 복잡한 모델로 학습하지 않도록 주의
- 복잡한 모델을 사용하게 될 경우, 추론 시스템에서 충분한 속도가 나오는지, 안정적인 결과가 나오는지 테스트하며 진행
- 평가 단계
- 잘 알려진 평가지표를 사용하면서도, 사용자 시점에서 위화감을 느끼지 않는 결과가 나와야 함
- 빌드 단계 (모델을 추론 시스템에 포함시키는 과정)
- 추론 시스템 환경에서 모델이 잘 작동하지 않는 경우 학습 단계로 돌아가야 함
- 인프라 최적화 작업 필요
- 시스템 평가 단계 (모델을 추론기로써 평가하는 과정)
- 안정성, 응답 속도 등 실제로 활용하는데 문제가 없는지 확인
각 단계의 이슈 각각을 해결하는 것은 상대적으로 어렵지 않지만, ML 개발 시 이 단계들을 처음부터 끝까지 반복해야 한다는 점 때문에 이슈들을 해결하는 데 애를 먹는 경우가 있습니다. 이 때문에 학습 파이프라인 프로세스를 만들 필요성이 생기게 되고, 데이터 수집 ~ 평가 단계를 하나의 파이프 라인으로 묶어 모델 버전 및 결과를 기록할 수 있도록 시스템을 구축할 수 있는 도구들이 나오게 되었습니다.
그 중 하나인 MLFlow는 머신러닝 모델 훈련을 위한 파이프라인을 구축하기 위한 오픈소스 플랫폼입니다. MLFlow는 Tracking, Project, Models, Registry의 4가지 컴포넌트로 구성되어 있는데, 각 컴포넌트의 역할은 아래와 같습니다.
2. MLFlow Components
Tracking : 파라미터, 평가 지표 로깅을 통해 여러 실험 결과들을 기록하고, 모델 파일, 데이터 셋, 그래프 등의 결과를 아티팩트로 저장하여, 실험 결과의 재현을 가능하게 합니다. 또한 코드 버저닝도 지원합니다.
# parameter logging 예시 import mlflow with miflow. start_run(): mlflow.log_param("alpha" , 0.1) mlflow.log_param("learning_rate" , 0.01) ...
Project: 코드를 재현 가능한 형식으로 패키징하여 재현 가능한 실험을 할 수 있도록 하는 시스템입니다. Conda 혹은 Docker를 통해 실행 환경이나 디펜던시를 관리합니다.
# MLproject 파일 예시 name: mlflow_tutorial conda_env: conda.yaml entry_points: main: parameters: alpha: float l1_ratio: {type: float, default: 0.1} command: "python train.py {alpha} {l1_ratio}"
Models: 다양한 라이브러리를 통해 만들어진 모델을 표준화된 포맷으로 저장하고 배포하는 기능을 제공합니다.
# 모델 로깅 예시 import mlflow.sklearn from sklearn.linear_model import LogisticRegression model = LogisticRegression () model. fit(X_train, y_train) # MLflow룰 활용한 모델 로깅 mlflow.sklearn.log_model(model, "my_model")
Registry: 중앙 모델 스토어를 통해 모델의 버전 관리 및 라이프사이클 관리를 담당합니다. 이를 통해 모델의 스테이지 관리, 프로덕션 이동을 체계적으로 관리할 수 있습니다.
# 모델 로드 및 정보 출력 예시 ... with mlflow.start_run(): mlflow.sklearn.log_model(model, "model") # MLFlow Registry에 모델 등록 model_uri = "runs:/{}/model".format(mlflow.active_run().info.run_id) mlflow.register_model(model_uri, "iris_classifier") # Registry에서 모델 로드 model_name = "iris_classifier" latest_versions = mlflow.search_registered_models(f"name='{model_name}'") # latest 모델 정보 출력 for version in latest_versions[0].latest_versions: print(f"Version: {version.version}, Stage: {version.current_stage}")
3. MLFlow 시작하기
먼저 파이썬 가상환경을 만들고, 아래 예시와 같은 폴더 구조를 만들어 줍니다.
. ├── MLproject # 프로젝트 정의 ├── conda.yaml # 디펜던시 정의 ├── data │ └── my_data.csv # 데이터 ├── requirements.txt └── train.py # 모델 훈련 코드
먼저 MLFlow를 아래와 같이 설치하고, MLFlow tracking server를 띄워봅니다. 기본 url 은
http://localhost:5000
입니다.# python 버전은 3.6 이상 사용 pip install mlflow mlflow --version mlflow ui
위와 같은 화면이 출력된다면, 정상적으로 MLflow tracking server를 실행한 것입니다.
mlflow ui
실행 시 mlruns
라는 디렉토리가 생성되고, 여기에 실험 관련 데이터를 저장하게 됩니다. 다음 글에서는 모델 훈련 및 로깅, 서빙 단계를 한 사이클로 실행해보면서 MLFlow 활용 방법을 알아보도록 하겠습니다.References
- 머신러닝 시스템 디자인 패턴
Share article