MLFlow
때는 바야흐로 군대에 있을 시기인 2023년 5월, 필자는 군 e러닝 강좌 기말과제로 딥러닝을 통해 부동산 가격 예측을 하는 프로젝트를 진행했다. 이때가 아마 딥러닝을 나름의 실전(?)으로 처음 경험한 시기였고, 당시엔 당장 이번 년도 초반까지만 해도 Colab 외에는 마땅히 쓸 줄 아는 개발 환경도 없었다.
하지만 프로젝트가 점차 복잡해지고, 다양한 하이퍼파라미터 실험과 모델 버전 관리를 하다 보니 자연스레 느낀 점이 있었다. 바로 “내가 지금 뭘 했고, 그 결과가 어땠는지 기억조차 안 난다” 는 것이다. Colab 셀 수십 개를 오가며 코드를 수정하고 결과를 확인하다 보면, 어떤 실험이 효과가 있었고 어떤 모델이 성능이 더 좋았는지 일일이 메모해두지 않으면 금방 잊혀진다.
이때 등장한 것이 바로 MLflow였다. MLflow는 실험 추적, 모델 저장 및 배포 등 머신러닝 프로젝트 전반을 체계적으로 관리할 수 있게 해주는 오픈소스 플랫폼이다. 단순히 로그를 남기는 수준을 넘어서, 실험의 각 버전을 기록하고, 모델의 성능을 시각화하며, 나아가 REST API 형태로 배포까지 가능하게 해준다. 특히 로컬 환경이나 클라우드 어디에서든 손쉽게 구성할 수 있어, Colab을 넘어선 실전 MLOps의 첫걸음으로서 최적이었다. 따라서 이번 시간에는 MLflow가 하는 기능, 그리고 사용하는 방법에 대해서 논의해보고자 한다.
MLflow의 기능
일단 내 ML 프로젝트의 진행 방식을 돌아보자. 공감이 되었으면 좋겠다.
1. 데이터를 열심히 잘 모은다.
2. 모델링을 하고 성능을 어딘가에 체크한다.
3. 하다가 열받아서, 모델링하다가 힘드니까 성능 체크 패러미터 기록 안하고 무지성으로 테스트해본다.
4. 그와중에 잘 나왔던 거 패러미터 뭐였지? 하면서 원숭이로 복귀
5. 하다가 또 열받으니까 git 혼자 다시 파서 해보기
6. 어 그러다가 1 또는 2에서 잘못됐었네?? ㅋㅋ 반복
이런 행동들을 막아주는 첫 걸음 중 하나가 자동으로 로깅이 될 수 있도록 해주는 서비스를 이용하는 것이고, 그러한 서비스들 중에서 MLflow라는 것이 있는 것이다. MLflow의 기능 및 특징을 아래의 표로 확인해보자.
| 기능 | 설명 |
| 1. Tracking (실험 추적) | - 하이퍼파라미터, 메트릭, 아티팩트(모델, 이미지 등) 자동 기록- 실험별 비교 UI 제공- 로컬 및 원격 서버 사용 가능 |
| 2. Projects (재현 가능한 프로젝트) | - Conda 또는 Docker 기반의 환경 정의 지원- YAML 파일(MLproject)을 통해 파이프라인 표준화- 코드 공유 및 재현성 확보 |
| 3. Models (모델 저장 및 배포) | - 다양한 포맷(TensorFlow, PyTorch, Scikit-learn 등) 지원- 모델을 .pkl 또는 .mlmodel 포맷으로 저장- REST API, CLI, Python SDK로 로드/서빙 가능 |
| 4. Registry (모델 레지스트리) | - 모델 버전 관리 및 단계별 전환 (Staging, Production 등)- 승인 프로세스 및 모델 설명 추가 가능- 협업 시 신뢰성 확보 |
| 5. UI (웹 인터페이스) | - http://localhost:5000 에서 실험 결과 시각화- 메트릭 그래프, 파라미터 비교, 아티팩트 다운로드 지원 |
| 6. 다중 프레임워크 호환 | - PyTorch, TensorFlow, XGBoost, LightGBM, sklearn 등 지원- 커스텀 모델도 pyfunc 형식으로 통합 가능 |
| 7. 로컬 및 클라우드 호환 | - 로컬 머신, AWS S3, Azure Blob, GCP 등 연동 가능- Databricks와도 자연스럽게 통합 |
| 8. 경량 MLOps 시작점 | - Kubeflow, SageMaker, Airflow 등 무겁지 않고 가볍게 시작 가능- 작은 프로젝트도 관리 구조화에 용이 |

한번 모델이 학습된 후 저장된 파일들을 확인해보면서 어떤 구성 요소가 있고, 어떻게 이용하는 것인지 천천히 확인해보자.
MLflow가 학습 모델에 관해 제공하는 파일들!
Trained Model
├── artifacts
│ └── model
│ ├── MLmodel
│ ├── conda.yaml
│ ├── data
│ │ ├── model.pth
│ │ └── pickle_module_info.txt
│ ├── metadata
│ │ ├── MLmodel
│ │ ├── conda.yaml
│ │ ├── python_env.yaml
│ │ └── requirements.txt
│ ├── python_env.yaml
│ └── requirements.txt
├── meta.yaml
├── metrics
│ ├── test_acc
│ └── train_loss
├── params
│ ├── batch_size
│ ├── learning_rate
│ └── num_epochs
└── tags
├── mlflow.log-model.history
├── mlflow.runName
├── mlflow.source.git.commit
├── mlflow.source.name
├── mlflow.source.type
└── mlflow.user
- artifacts/model
🔹 data/
- model.pth:
→ 핵심 모델 가중치 파일. PyTorch의 torch.save(model.state_dict())와 유사한 내용이 들어있으며, 실제 추론 등에 사용된다. - pickle_module_info.txt:
→ torch.save()는 내부적으로 pickle을 사용하기 때문에, 어떤 pickle 모듈 버전으로 직렬화했는지 기록된다. 모델 재사용 시 호환성 확인용으로 사용된다.
🔹 metadata/
MLflow 내부의 메타 정보 파일들이 저장되어 있다.
- MLmodel:
→ 모델 형식과 flavor(예: pytorch, pyfunc) 정보가 담긴 핵심 설정 파일
모델 로딩 시 mlflow.pyfunc.load_model() 등이 이걸 기반으로 작동한다. - conda.yaml / python_env.yaml:
→ 해당 모델을 실행하기 위한 Python 환경 및 라이브러리 리스트.
conda.yaml: Conda 환경용
python_env.yaml: Python 가상환경이나 pip 기반 재현용 - requirements.txt:
→ Python 환경에서 필요한 패키지 명세 (pip install -r requirements.txt로 재현 가능)
- metrics/
모델 학습 후 기록된 성능 지표들이 들어가 있다. - params/
실험 재현성을 위해, params/에는 사용된 하이퍼패러미터가 기록되어 있다. - tags/
메타데이터로 활용되는 태그 정보들이다.- mlflow.runName: 실험 이름
- mlflow.source.git.commit: 관련 커밋 해시
- mlflow.user: 실험 수행자
- mlflow.source.name: 실행한 Python 파일명
→ 실험 출처 추적과 협업에 유용하다.
- meta.yaml
- 전체 실험 및 아티팩트 관련 메타데이터가 YAML 포맷으로 정리되어 있고, 각 컴포넌트가 어떻게 연결돼 있는지 로딩 시 참조한다.
실습(Github)
https://github.com/wognsths/mlflow-torchserve
GitHub - wognsths/mlflow-torchserve: Tracking machine learning flow with mlflow, and serving with torchserve
Tracking machine learning flow with mlflow, and serving with torchserve - wognsths/mlflow-torchserve
github.com
사실 너무 쉬워서, 딱히 실습을 할 것은 없다. README.md 확인하면서 해보자. Torchserve로 웹에 올리는 것도 해놓았으니 확인해봐도 좋다!