MLOps 과정 | 실험 추적 + 모델 버전 관리 + Champion/Challenger
python retrain.py를 실행하면...
| 지금까지 우리가 한 것 | MLflow가 해주는 것 |
|---|---|
print(f"정확도: {accuracy}") | 모든 실험 자동 기록 & 웹 UI에서 비교 |
joblib.dump() → S3 업로드 | Model Registry (v1, v2, v3...) |
if new > old: deploy | Champion/Challenger 별칭 |
| 터미널 출력만 보고 판단 | 웹 UI에서 그래프로 비교 |
| Git (코드 관리) | MLflow (모델 관리) |
|---|---|
| Repository | Experiment (실험 저장소) |
| Commit | Run (학습 실행 기록) |
git log | MLflow UI (실험 히스토리) |
git diff | Compare (실험 비교) |
| Release Tag (v1.0) | Registered Model (Version 1) |
| main branch | Champion alias (운영 모델) |
pip install mlflow
mlflow --version
# mlflow, version 3.x.x
# 터미널 1: MLflow 서버 실행 (닫지 마세요!)
cd 01-loan-api-server
mlflow server --host 0.0.0.0 --port 5000
# retrain.py 상단에 3줄만 추가
import mlflow
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("loan-approval-retrain")
mlflow.autolog()
# ... 기존 retrain.py 코드 그대로 ...
# pipeline.fit(X_train, y_train) 실행 시 자동 기록!
with mlflow.start_run():
# 파라미터 기록
mlflow.log_params({
"n_estimators": 100,
"max_depth": 6,
"learning_rate": 0.1,
})
# 모델 학습
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
# 메트릭 기록
mlflow.log_metrics({
"accuracy": accuracy_score(y_test, y_pred),
"f1_score": f1_score(y_test, y_pred),
"train_size": len(X_train),
})
# 태그 (검색/필터링용)
mlflow.set_tag("trigger", "drift_detected")
# 모델 아티팩트 저장
mlflow.sklearn.log_model(pipeline, artifact_path="model")
# 터미널 2: (MLflow 서버는 터미널 1에서 실행 중)
cd 01-loan-api-server
python retrain.py
[STEP 4] 모델 학습 (XGBoost)
새 모델 정확도: 0.8400
F1 Score: 0.8215
MLflow Run ID: a1b2c3d4e5f6...
loan-approval-retrain 실험에 Run이 기록되어 있습니다!
# 1차: 기본 설정
python retrain.py
# 2차: n_estimators=200으로 변경 후
python retrain.py
# 3차: max_depth=4로 변경 후
python retrain.py
loan-approval-retrain방법 1: UI에서
loan-approval방법 2: 코드에서
# 한 줄만 추가!
mlflow.sklearn.log_model(
pipeline,
artifact_path="model",
registered_model_name="loan-approval"
)
from mlflow import MlflowClient
client = MlflowClient("http://localhost:5000")
# 별칭 설정
client.set_registered_model_alias("loan-approval", "champion", version=3)
client.set_registered_model_alias("loan-approval", "challenger", version=4)
# 별칭으로 모델 로드
model = mlflow.pyfunc.load_model("models:/loan-approval@champion")
transition_model_version_stage() 관련 자료를 보면# 기존 Champion과 비교
try:
champ = client.get_model_version_by_alias("loan-approval", "champion")
champ_run = client.get_run(champ.run_id)
champ_acc = float(champ_run.data.metrics["accuracy"])
except Exception:
champ_acc = 0.0 # 첫 등록
# 비교 후 승격
if new_accuracy > champ_acc:
client.set_registered_model_alias("loan-approval", "champion", new_version)
print(f"Champion 승격! Version {new_version}")
upload_to_s3() # → Lambda → ECS 자동 재배포
else:
client.set_registered_model_alias("loan-approval", "challenger", new_version)
print(f"기존 Champion 유지. v{new_version}은 Challenger.")
[STEP 1] 데이터 로드 및 병합
합친 데이터: 2000건
[STEP 4] 모델 학습 (XGBoost)
새 모델 정확도: 0.8400
MLflow Run ID: a1b2c3d4e5f6...
[STEP 5] MLflow Champion 비교
현재 Champion (v1) 정확도: 0.8200
새 모델 정확도: 0.8400
Champion 승격! Version 2
S3 업로드 완료!
→ Lambda → ECS 자동 재배포 시작
cd 01-loan-api-server
# 1. 드리프트 감지 (Module 9)
python detect_drift_evidently.py
# 2. 재학습 + MLflow 기록 + Champion 비교 + S3 배포
python retrain.py
# 3. MLflow UI에서 확인
# http://localhost:5000
| 항목 | MLflow 없이 | MLflow 적용 |
|---|---|---|
| 실험 기록 | 터미널 → 사라짐 | 영구 저장 & 검색 |
| 성능 비교 | 수동 숫자 비교 | 웹 UI 그래프 |
| 모델 버전 | 파일명으로 구분 | v1, v2, v3... |
| 배포 관리 | if문 비교 | Champion/Challenger |
| 재현성 | 파라미터 기억 필요 | 자동 기록 |
# 1. MLflow 설치 & 서버 실행
pip install mlflow
mlflow server --host 0.0.0.0 --port 5000
# 2. retrain.py에 MLflow 연동 후 실행
python retrain.py
# 3. 하이퍼파라미터 바꿔가며 3번 실행
# 4. MLflow UI에서 비교 & 모델 등록
# 5. Champion/Challenger 별칭 설정