MLflow: MLOps의 첫걸음
Source: Dev.to
죄송합니다만, 번역하려는 전체 텍스트를 제공해 주시면 해당 내용을 한국어로 번역해 드리겠습니다. 코드 블록이나 URL은 그대로 유지하고, 나머지 내용만 번역해 드리겠습니다.
소개
머신러닝 모델에서 뛰어난 지표를 달성하는 것은 쉬운 일이 아닙니다. 어떤 하이퍼파라미터를 사용했는지 기억나지 않아 결과를 재현하지 못한다고 상상해 보세요.
MLOps 세계로 들어가면 “모델을 학습했고 성공했다”는 단계에서 벗어나 다음을 할 수 있습니다:
- 실험 추적
- 실행 비교
- 아티팩트 저장
- 자신 있게 프로세스 반복
MLOps는 ML 프로젝트에 DevOps 원칙을 적용하는 실천입니다. 이는 개발 및 학습 단계에서 재현성부터 배포와 모니터링에 이르기까지 ML 프로젝트의 수명주기를 관리하는 것을 포함합니다.
전통적인 소프트웨어 개발에서는 코드 버전 관리(예: Git)만으로 충분한 경우가 많습니다. 하지만 ML에서는 결과가 코드 + 데이터 + 하이퍼파라미터에 의존합니다.
전용 도구를 사용하면 실험 과정이 혼란스러워지기 전에 모델에 대한 감사와 협업을 용이하게 할 수 있습니다. 구조화된 히스토리가 없으면 어떤 AI 프로젝트든 재현성과 확장성을 저해합니다.
MLflow란?
MLflow는 MLOps를 적용하여 머신러닝 프로젝트의 라이프사이클을 정리하는 데 도움을 줍니다. 간단한 프로젝트라도 각 훈련마다 수행된 모든 작업의 히스토리를 자동으로 생성합니다.
실제로 MLflow를 사용하면 다음과 같은 질문에 답할 수 있습니다:
- 어떤 파라미터 조합이 가장 좋은 메트릭을 만들었는가?
- 언제 훈련을 실행했고 결과는 무엇이었는가?
- 해당 실행에서 훈련된 모델은 어디에 저장되었는가?
MLflow는 이러한 관리를 표준화하기 위해 등장했습니다. 이 문서에서는 세 가지 핵심 기록 유형에 초점을 맞춥니다:
| 유형 | 설명 |
|---|---|
| 파라미터 | 설정 입력값 (예: learning_rate, n_estimators) |
| 메트릭 | 성능 결과 (예: accuracy, log_loss) |
| 아티팩트 | 바이너리 출력 (예: .pkl 혹은 .onnx 형식으로 저장된 모델) |
MLflow는 즉흥적인 실험을 감사 가능하고 표준화된 기록 시스템으로 전환합니다.
MLflow 간단 설정
백엔드 스토어
SQLite (mlflow.db) – 메타데이터(실험, 실행, 파라미터, 메트릭)를 저장합니다.
아티팩트 스토어
파일 스토어 (mlruns/) – 아티팩트(모델, 플롯 등)를 저장합니다.
설치
pip install mlflow
서버 시작
mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--default-artifact-root ./mlruns \
--host 0.0.0.0 \
--port 5000
파라미터 설명
| 파라미터 | 설명 |
|---|---|
mlflow server | MLflow 서비스를 시작합니다 |
--backend-store-uri | SQLite는 가볍고 첫 번째 반복에 이상적입니다 |
--default-artifact-root | 아티팩트가 저장될 디렉터리 |
--host와 --port | 서버가 제공될 주소( UI에서도 사용됨 ) |
SQLite + 파일 스토어를 사용할 때, MLflow 디렉터리에는 두 가지 주요 구성 요소가 나타납니다:
mlflow.db– 메타데이터(실험, 실행, 파라미터, 메트릭)를 포함한 SQLite 데이터베이스.mlruns/– 아티팩트와 실행 내용(모델, 플롯 등)이 들어 있는 폴더.
Python과 통합
mlflow 라이브러리는 코드에 거의 영향을 주지 않고 서버에 연결할 수 있게 해줍니다. URI를 설정하고 mlflow.start_run()을 사용하면 됩니다.
import mlflow
import mlflow.sklearn
from sklearn.metrics import accuracy_score, recall_score
# Conecta ao tracking server
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("Customer_Churn_Experiment")
with mlflow.start_run():
# ----- Treinamento do modelo -----
# model = ... (seu código de treinamento aqui)
# Log de parâmetros
mlflow.log_param("max_depth", 10)
mlflow.log_param("n_estimators", 100)
# Avaliação
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
rec = recall_score(y_test, y_pred)
# Log de métricas
mlflow.log_metric("accuracy", acc)
mlflow.log_metric("recall", rec)
# Log do artefato (modelo)
mlflow.sklearn.log_model(model, "random_forest_model")
첫 실행 시 어떤 일이 일어나나요?
Customer_Churn_Experiment실험이 자동으로 생성됩니다.- 런(run)이 기록됩니다.
- 파라미터, 메트릭, 아티팩트가 트래킹 서버로 전송됩니다.
결과 시각화
MLflow UI에서 다음을 볼 수 있습니다:
- 추적된 Params 및 Metrics
- 각 실행의 아티팩트 목록
제가 기록한 파라미터와 메트릭 예시:
| 파라미터 | 값 |
|---|---|
n_estimators | 100 |
max_depth | 10 |
| 메트릭 | 값 |
|---|---|
accuracy | 0.85 |
recall | 0.78 |
이를 통해 터미널에서 print에 의존하지 않고 서로 다른 실행을 비교할 수 있습니다.
사용 사례: 하이퍼파라미터 비교
max_depth와 n_estimators를 변경하여 두 번째 인터랙션을 수행했습니다. 개선될 것으로 기대했지만 UI를 확인했을 때 accuracy 메트릭이 떨어졌습니다.
교훈
| 축 | MLflow가 보여준 내용 |
|---|---|
| 추적성 | 하이퍼파라미터 변경이 과적합을 초래했다는 실증적 증거 |
| 기술적 비교 | UI가 두 실행을 시각적으로 비교할 수 있게 함 |
| 재현성 | 이전 버전의 아티팩트가 기록되어 배포 준비가 됨 |
일반적인 이점
- 전환점: 모델 수명 주기에서 추적성을 관리하는 방식을 변화시킵니다.
- 검사 용이성: 명령줄에서 직접 SQLite를 조회할 수 있습니다.
- 고급 MLOps의 기반: 추적은 첫 번째 단계일 뿐이며, 이어서 Model Registry와 Model Serving이 따라옵니다.
실험 추적을 마스터하는 것은 향후 **Continuous Training (CT)**을 구현하기 위한 기반이 됩니다.
저장소
이 프로젝트의 전체 코드는 제 GitHub에서 확인할 수 있습니다:
mlops‑tel (SEU_USUARIO를 자신의 사용자 이름으로 교체하십시오).
co-churn-predict
그리고 당신은: 일상에서 MLflow를 이미 사용하고 있나요? 당신의 관점에서 모델의 완전한 재현성을 보장하기 위한 가장 큰 도전 과제는 무엇이라고 생각하나요?
댓글에서 토론해요!