본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 30. · 30 Views
MLflow로 실험 추적 및 모델 관리
머신러닝 실험을 체계적으로 추적하고 모델을 효율적으로 관리하는 MLflow의 핵심 기능을 배웁니다. 초급 개발자도 쉽게 따라할 수 있는 실무 중심의 가이드입니다.
목차
1. MLflow 시작하기
김개발 씨는 회사에서 첫 번째 머신러닝 프로젝트를 맡았습니다. 열심히 모델을 학습시키고 파라미터를 조정했지만, 일주일이 지나자 문제가 생겼습니다.
"저번에 잘 나왔던 설정이 뭐였더라?" 수십 개의 주피터 노트북 파일 사이에서 길을 잃어버린 것입니다.
MLflow는 머신러닝 실험의 모든 것을 기록하고 관리해주는 오픈소스 플랫폼입니다. 마치 연구 노트를 꼼꼼히 작성하는 과학자처럼, 모든 실험 과정을 자동으로 추적합니다.
이를 통해 어떤 파라미터로 어떤 결과가 나왔는지 언제든지 확인할 수 있습니다.
다음 코드를 살펴봅시다.
# MLflow 설치 및 기본 설정
import mlflow
# 실험 이름 설정 - 프로젝트별로 구분합니다
mlflow.set_experiment("house_price_prediction")
# 실행 시작 - 하나의 학습 과정을 기록합니다
with mlflow.start_run():
# 하이퍼파라미터 기록
mlflow.log_param("learning_rate", 0.01)
mlflow.log_param("epochs", 100)
# 결과 메트릭 기록
mlflow.log_metric("accuracy", 0.95)
mlflow.log_metric("loss", 0.05)
print("실험이 성공적으로 기록되었습니다!")
김개발 씨는 입사 6개월 차 주니어 데이터 사이언티스트입니다. 첫 머신러닝 프로젝트에 배정되어 열정적으로 모델을 만들었습니다.
학습률을 바꿔보고, 에포크 수도 조정하고, 다양한 실험을 진행했습니다. 그런데 문제가 생겼습니다.
"저번 주에 정확도 98%가 나왔는데, 그때 설정이 뭐였지?" 노트북 파일은 model_v1.ipynb, model_v2_final.ipynb, model_v3_진짜최종.ipynb처럼 늘어만 갔습니다. 선배 개발자 박시니어 씨가 김개발 씨의 고민을 듣고 웃으며 말했습니다.
"MLflow 써봤어요? 저도 예전에 똑같은 문제로 고생했는데, 이거 쓰고 나서 인생이 편해졌어요." MLflow란 정확히 무엇일까요?
쉽게 비유하자면, MLflow는 머신러닝 실험을 위한 실험 노트입니다. 과학자가 모든 실험 과정을 꼼꼼히 기록하듯이, MLflow는 우리의 모든 학습 과정을 자동으로 기록해줍니다.
MLflow가 없던 시절에는 어땠을까요? 개발자들은 엑셀 파일에 파라미터를 적거나, 파일 이름에 설정값을 넣거나, 주석으로 결과를 남기곤 했습니다.
시간이 지나면 어떤 설정이 최적이었는지 찾기 어려웠습니다. MLflow를 사용하면 이 모든 문제가 해결됩니다.
mlflow.set_experiment로 실험 이름을 정하고, mlflow.start_run으로 새로운 실행을 시작합니다. 이 안에서 일어나는 모든 일이 자동으로 기록됩니다.
코드를 살펴보겠습니다. log_param은 학습에 사용한 설정값을 기록합니다.
학습률, 에포크 수, 배치 크기 같은 것들입니다. log_metric은 결과값을 기록합니다.
정확도, 손실값, F1 스코어 같은 성능 지표입니다. 실제 현업에서는 이렇게 활용됩니다.
새로운 모델을 개발할 때 수십, 수백 번의 실험을 진행합니다. MLflow가 모든 것을 기록해두면, 나중에 웹 UI에서 실험들을 비교하고 최적의 설정을 찾을 수 있습니다.
주의할 점도 있습니다. start_run 컨텍스트 매니저를 사용하지 않고 직접 run을 시작하면, 반드시 mlflow.end_run을 호출해야 합니다.
그렇지 않으면 실행이 종료되지 않은 상태로 남습니다. 박시니어 씨의 조언을 들은 김개발 씨는 바로 MLflow를 도입했습니다.
일주일 후, 팀장님이 물었습니다. "저번에 좋았던 모델 설정이 뭐였죠?" 김개발 씨는 자신 있게 MLflow 대시보드를 열어 보여줬습니다.
실전 팁
💡 - 실험 이름은 프로젝트명_날짜 형식으로 체계적으로 관리하세요
- 모든 중요한 파라미터는 빠짐없이 log_param으로 기록하세요
2. 파라미터와 메트릭 추적
김개발 씨가 MLflow를 사용하기 시작한 지 며칠이 지났습니다. 그런데 학습 과정에서 손실값이 어떻게 변하는지 궁금해졌습니다.
"에포크마다 손실이 줄어드는 걸 그래프로 볼 수 있으면 좋겠는데..." 박시니어 씨가 웃으며 다가왔습니다. "메트릭 스텝 기능 써봤어요?"
MLflow는 단순히 최종 결과만 기록하는 것이 아닙니다. 학습 과정 중간중간의 변화도 추적할 수 있습니다.
log_metric의 step 파라미터를 활용하면 에포크별, 배치별 메트릭 변화를 그래프로 시각화할 수 있습니다. 이를 통해 모델이 제대로 학습되고 있는지 한눈에 파악할 수 있습니다.
다음 코드를 살펴봅시다.
import mlflow
mlflow.set_experiment("training_progress_tracking")
with mlflow.start_run(run_name="학습과정_추적_예제"):
# 여러 파라미터를 한 번에 기록
params = {
"model_type": "RandomForest",
"n_estimators": 100,
"max_depth": 10,
"random_state": 42
}
mlflow.log_params(params)
# 에포크별 메트릭 기록 - step으로 순서 지정
for epoch in range(5):
train_loss = 1.0 / (epoch + 1) # 감소하는 손실값
val_accuracy = 0.7 + (epoch * 0.05) # 증가하는 정확도
mlflow.log_metric("train_loss", train_loss, step=epoch)
mlflow.log_metric("val_accuracy", val_accuracy, step=epoch)
김개발 씨는 모델 학습을 시작했습니다. 콘솔에 에포크마다 손실값이 출력됩니다.
숫자가 점점 줄어드는 것을 보며 안심했지만, 학습이 끝나고 나니 중간 과정이 기억나지 않았습니다. "학습 중간에 갑자기 손실이 튀었던 것 같은데, 몇 번째 에포크였지?" 이런 정보를 추적하지 않으면 문제가 생겼을 때 원인을 찾기 어렵습니다.
박시니어 씨가 알려준 방법은 간단했습니다. log_metric을 호출할 때 step 파라미터를 함께 전달하면 됩니다.
step은 순서를 나타내는 숫자로, 보통 에포크 번호나 배치 번호를 사용합니다. log_params라는 편리한 함수도 있습니다.
파라미터가 여러 개일 때 일일이 log_param을 호출하는 대신, 딕셔너리로 한 번에 전달할 수 있습니다. 코드가 훨씬 깔끔해집니다.
코드를 자세히 살펴보겠습니다. 먼저 params 딕셔너리에 모든 설정값을 담습니다.
모델 종류, 트리 개수, 최대 깊이 등을 한곳에 정리합니다. 그리고 **mlflow.log_params(params)**로 한 번에 기록합니다.
다음으로 학습 루프 안에서 매 에포크마다 메트릭을 기록합니다. train_loss와 val_accuracy를 각각 현재 에포크 번호와 함께 저장합니다.
step=epoch가 핵심입니다. 이렇게 기록된 데이터는 MLflow UI에서 그래프로 시각화됩니다.
손실이 줄어드는 곡선, 정확도가 올라가는 곡선을 한눈에 볼 수 있습니다. 학습이 안정적으로 진행되는지, 과적합이 발생하는지 쉽게 판단할 수 있습니다.
실무에서는 이 기능이 매우 유용합니다. 밤새 학습을 돌려놓고 아침에 출근해서 그래프를 확인합니다.
중간에 문제가 있었다면 어느 시점에서 발생했는지 정확히 알 수 있습니다. 주의할 점이 있습니다.
step 값은 반드시 정수여야 합니다. 또한 같은 메트릭 이름에 같은 step 값을 두 번 기록하면 나중 값이 덮어씁니다.
김개발 씨는 이제 학습을 돌릴 때마다 step을 함께 기록합니다. MLflow UI를 열어 그래프를 확인하는 것이 아침 루틴이 되었습니다.
실전 팁
💡 - 메트릭 이름은 train_loss, val_loss처럼 일관된 네이밍 규칙을 사용하세요
- step은 에포크뿐 아니라 글로벌 스텝 수로도 활용할 수 있습니다
3. 아티팩트 저장하기
김개발 씨의 모델이 드디어 완성되었습니다. 정확도도 높고, 손실도 낮습니다.
그런데 한 가지 고민이 생겼습니다. "모델 파일을 어디에 저장하지?
나중에 이 실험의 모델을 다시 불러오려면 어떻게 해야 하지?" 파라미터와 메트릭만으로는 부족했습니다.
아티팩트는 실험과 관련된 모든 파일을 말합니다. 학습된 모델, 시각화 그래프, 설정 파일, 데이터 샘플 등이 모두 아티팩트입니다.
MLflow는 이런 파일들을 실험 기록과 함께 저장하고 관리할 수 있습니다. 나중에 특정 실험의 결과물을 그대로 재현할 수 있게 됩니다.
다음 코드를 살펴봅시다.
import mlflow
import json
import matplotlib.pyplot as plt
mlflow.set_experiment("artifact_example")
with mlflow.start_run(run_name="아티팩트_저장_예제"):
mlflow.log_param("model_type", "XGBoost")
# 설정 파일을 아티팩트로 저장
config = {"threshold": 0.5, "features": ["age", "income"]}
with open("config.json", "w") as f:
json.dump(config, f)
mlflow.log_artifact("config.json")
# 시각화 그래프를 아티팩트로 저장
plt.figure(figsize=(8, 6))
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.title("Training Progress")
plt.savefig("training_plot.png")
mlflow.log_artifact("training_plot.png")
# 디렉토리 전체를 아티팩트로 저장
mlflow.log_artifacts("./model_files", artifact_path="models")
김개발 씨가 열심히 만든 모델이 완성되었습니다. accuracy 0.95라는 좋은 성능이 나왔습니다.
파라미터도 기록했고, 메트릭도 저장했습니다. 그런데 정작 모델 파일은 로컬 폴더 어딘가에 있습니다.
일주일 후 팀장님이 말했습니다. "저번에 만든 모델 배포해볼까요?" 김개발 씨는 당황했습니다.
"어... 그 모델이 어디 있더라?" 폴더를 뒤졌지만 여러 버전의 모델 파일이 섞여 있었습니다.
박시니어 씨가 해결책을 알려줬습니다. "아티팩트로 저장하면 돼요.
실험 기록이랑 모델 파일이 함께 묶여서 관리됩니다." 아티팩트란 실험과 관련된 모든 부산물입니다. 마치 과학자가 실험 노트에 사진과 그래프를 함께 붙여놓듯이, MLflow도 파일들을 실험 기록에 첨부할 수 있습니다.
log_artifact 함수는 단일 파일을 저장합니다. 설정 파일, 그래프 이미지, 학습된 모델 파일 등 무엇이든 가능합니다.
파일 경로만 전달하면 MLflow가 알아서 복사해서 보관합니다. 코드를 보면 먼저 config.json 파일을 만들고 log_artifact로 저장합니다.
다음으로 matplotlib으로 그래프를 그려서 이미지로 저장한 뒤, 이것도 아티팩트로 등록합니다. log_artifacts는 복수형입니다.
디렉토리 전체를 한 번에 저장할 때 사용합니다. 모델 관련 파일이 여러 개일 때 유용합니다.
artifact_path 파라미터로 저장될 위치를 지정할 수 있습니다. MLflow UI에서 실험을 클릭하면 Artifacts 탭이 있습니다.
저장한 모든 파일을 확인할 수 있고, 다운로드도 가능합니다. 어떤 실험에서 어떤 모델이 나왔는지 완벽하게 추적됩니다.
실무에서는 모델 파일뿐 아니라 다양한 것들을 저장합니다. 학습에 사용한 데이터의 샘플, 피처 중요도 그래프, 혼동 행렬 시각화 등입니다.
나중에 왜 이런 결과가 나왔는지 분석할 때 큰 도움이 됩니다. 주의할 점도 있습니다.
너무 큰 파일을 저장하면 저장소 용량 문제가 생길 수 있습니다. 학습 데이터 전체보다는 샘플만 저장하는 것이 좋습니다.
김개발 씨는 이제 모든 실험에서 모델 파일을 아티팩트로 저장합니다. 팀장님이 "저번 모델 어디 있어요?"라고 물으면 MLflow 링크를 보내드립니다.
실전 팁
💡 - 모델 파일, 설정 파일, 시각화 그래프는 필수로 아티팩트에 저장하세요
- artifact_path를 활용해 폴더 구조를 체계적으로 관리하세요
4. 모델 로깅과 불러오기
김개발 씨가 아티팩트로 모델을 저장하는 방법을 배웠습니다. 그런데 한 가지 불편한 점이 있었습니다.
모델을 저장할 때 pickle로 직렬화하고, 불러올 때 다시 역직렬화하고... 라이브러리 버전이 다르면 에러도 납니다.
"더 편한 방법 없나요?"
MLflow는 머신러닝 모델을 저장하고 불러오는 표준화된 방법을 제공합니다. mlflow.sklearn, mlflow.pytorch, mlflow.tensorflow 등 주요 프레임워크별 전용 모듈이 있습니다.
이 방식을 사용하면 모델과 함께 환경 정보도 자동으로 저장되어, 어디서든 동일하게 모델을 불러올 수 있습니다.
다음 코드를 살펴봅시다.
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# 샘플 데이터 생성
X, y = make_classification(n_samples=1000, n_features=10)
mlflow.set_experiment("model_logging_example")
with mlflow.start_run(run_name="RandomForest_모델"):
# 모델 학습
model = RandomForestClassifier(n_estimators=100, max_depth=5)
model.fit(X, y)
# 모델 로깅 - sklearn 전용 함수 사용
mlflow.sklearn.log_model(model, "random_forest_model")
# 정확도 기록
accuracy = model.score(X, y)
mlflow.log_metric("train_accuracy", accuracy)
# 현재 실행의 run_id 저장
run_id = mlflow.active_run().info.run_id
print(f"Run ID: {run_id}")
# 저장된 모델 불러오기
loaded_model = mlflow.sklearn.load_model(f"runs:/{run_id}/random_forest_model")
predictions = loaded_model.predict(X[:5])
김개발 씨는 RandomForest 모델을 만들었습니다. 이전에는 joblib이나 pickle로 모델을 저장했습니다.
그런데 동료가 모델을 불러오려 할 때 문제가 생겼습니다. scikit-learn 버전이 달라서 에러가 발생한 것입니다.
"모델만 저장하면 안 되고, 환경도 함께 저장해야 해요." 박시니어 씨의 조언이었습니다. 그래서 requirements.txt도 만들고, conda 환경 파일도 만들고...
번거로운 작업이 늘어났습니다. MLflow는 이 문제를 우아하게 해결합니다.
mlflow.sklearn.log_model을 사용하면 모델과 함께 필요한 모든 정보가 자동으로 저장됩니다. 어떤 라이브러리가 필요한지, 버전은 무엇인지 MLflow가 알아서 기록합니다.
코드를 살펴보겠습니다. 먼저 make_classification으로 샘플 데이터를 만듭니다.
RandomForestClassifier를 학습시킨 후, mlflow.sklearn.log_model을 호출합니다. 첫 번째 인자는 모델 객체, 두 번째 인자는 저장할 이름입니다.
저장된 모델을 불러올 때는 mlflow.sklearn.load_model을 사용합니다. runs:/{run_id}/모델이름 형식의 URI로 특정 실험의 모델을 정확히 지정할 수 있습니다.
MLflow가 모델을 저장하면 여러 파일이 함께 생성됩니다. MLmodel 파일에는 모델 메타데이터가, conda.yaml에는 환경 정보가, model.pkl에는 실제 모델이 담깁니다.
이 모든 것이 자동입니다. 실무에서 이 기능은 매우 중요합니다.
데이터 사이언티스트가 만든 모델을 ML 엔지니어가 배포할 때, 환경 차이로 인한 문제를 최소화할 수 있습니다. 모델과 환경이 하나의 패키지로 묶여 있기 때문입니다.
sklearn 외에도 pytorch, tensorflow, xgboost, lightgbm 등 다양한 프레임워크를 지원합니다. 각각 mlflow.pytorch.log_model, mlflow.tensorflow.log_model 형식으로 사용합니다.
주의할 점이 있습니다. log_model을 호출하면 모델이 아티팩트로 저장됩니다.
같은 이름으로 두 번 저장하면 에러가 발생합니다. 이름을 다르게 하거나 새로운 run을 시작해야 합니다.
김개발 씨는 이제 모든 모델을 이 방식으로 저장합니다. 동료들도 쉽게 모델을 불러와 테스트할 수 있게 되었습니다.
실전 팁
💡 - 모델 이름은 model_v1보다 모델종류_날짜 형식이 더 명확합니다
- run_id는 나중에 모델을 찾을 때 필요하니 로그로 출력해두세요
5. MLflow UI 활용하기
김개발 씨가 열심히 실험을 기록했습니다. 파라미터도, 메트릭도, 모델도 다 저장했습니다.
그런데 이것들을 어떻게 확인할 수 있을까요? 터미널에서 파일을 일일이 열어볼 수는 없습니다.
"시각적으로 보면서 비교하고 싶은데..." 박시니어 씨가 미소를 지었습니다. "UI 띄워봤어요?"
MLflow는 웹 기반의 UI를 제공합니다. mlflow ui 명령어 하나로 로컬에서 대시보드를 실행할 수 있습니다.
모든 실험을 한눈에 보고, 실행들을 비교하고, 메트릭 그래프를 확인할 수 있습니다. 코드 한 줄 없이 마우스 클릭만으로 실험 결과를 분석할 수 있습니다.
다음 코드를 살펴봅시다.
# 터미널에서 MLflow UI 실행
# mlflow ui --port 5000
# Python에서 프로그래밍 방식으로 실험 조회
import mlflow
from mlflow.tracking import MlflowClient
# 클라이언트 생성
client = MlflowClient()
# 모든 실험 목록 조회
experiments = client.search_experiments()
for exp in experiments:
print(f"실험: {exp.name}, ID: {exp.experiment_id}")
# 특정 실험의 모든 실행 조회
runs = client.search_runs(
experiment_ids=["1"], # 실험 ID
order_by=["metrics.accuracy DESC"], # 정확도 높은 순 정렬
max_results=5 # 상위 5개만
)
for run in runs:
print(f"Run ID: {run.info.run_id}")
print(f" Accuracy: {run.data.metrics.get('accuracy', 'N/A')}")
print(f" Parameters: {run.data.params}")
김개발 씨가 지난 한 달간 수십 번의 실험을 진행했습니다. 어떤 실험이 가장 좋은 결과를 냈는지 확인하고 싶었습니다.
로그 파일을 하나씩 열어보기에는 너무 많습니다. 박시니어 씨가 터미널에 명령어 하나를 입력했습니다.
mlflow ui. 잠시 후 브라우저에서 멋진 대시보드가 열렸습니다.
모든 실험이 테이블로 정리되어 있었습니다. MLflow UI는 기본적으로 localhost:5000에서 실행됩니다.
--port 옵션으로 다른 포트를 지정할 수도 있습니다. 팀원들과 공유하려면 --host 0.0.0.0 옵션을 추가하면 됩니다.
UI의 왼쪽에는 실험 목록이 있습니다. 실험을 클릭하면 해당 실험의 모든 실행이 표시됩니다.
각 실행의 파라미터, 메트릭, 시작 시간 등을 한눈에 볼 수 있습니다. 특히 유용한 기능은 비교입니다.
여러 실행을 선택하고 Compare 버튼을 누르면, 파라미터와 메트릭을 나란히 비교할 수 있습니다. 어떤 설정이 더 좋은 결과를 냈는지 명확해집니다.
코드에서 MlflowClient를 사용하면 프로그래밍 방식으로도 같은 일을 할 수 있습니다. search_experiments로 모든 실험을 조회하고, search_runs로 특정 실험의 실행들을 검색합니다.
order_by 파라미터가 강력합니다. 메트릭 기준으로 정렬할 수 있어서, 가장 좋은 결과를 낸 실행을 쉽게 찾습니다.
metrics.accuracy DESC는 정확도 높은 순으로 정렬하라는 의미입니다. 실무에서는 자동화 스크립트에서 MlflowClient를 활용합니다.
예를 들어 "정확도 95% 이상인 모델만 자동 배포"같은 파이프라인을 만들 수 있습니다. 최고 성능 모델을 코드로 찾아서 다음 단계로 넘기는 것입니다.
주의할 점이 있습니다. UI가 표시하는 데이터는 mlruns 폴더에 저장된 것입니다.
이 폴더를 삭제하면 모든 기록이 사라집니다. 중요한 실험은 백업해두세요.
김개발 씨는 이제 매일 아침 MLflow UI를 열어 어제 돌린 실험들을 확인합니다. 커피 한 잔과 함께 실험 결과를 분석하는 것이 루틴이 되었습니다.
실전 팁
💡 - mlflow ui --host 0.0.0.0으로 실행하면 같은 네트워크의 팀원들도 접속할 수 있습니다
- search_runs의 filter_string 파라미터로 조건 검색도 가능합니다
6. 모델 레지스트리 사용하기
김개발 씨의 모델이 프로덕션에 배포될 준비가 되었습니다. 그런데 문제가 있습니다.
실험용 모델과 프로덕션 모델을 어떻게 구분할까요? 새 버전이 나오면 이전 버전은 어떻게 관리할까요?
"모델도 버전 관리가 필요해요." 박시니어 씨가 말했습니다. "모델 레지스트리를 써보세요."
모델 레지스트리는 프로덕션 수준의 모델을 관리하는 중앙 저장소입니다. 실험에서 만든 모델 중 배포할 것을 선택해서 등록하고, 버전을 관리하고, 스테이지를 지정할 수 있습니다.
Staging, Production, Archived 같은 스테이지로 모델의 생명주기를 체계적으로 관리합니다.
다음 코드를 살펴봅시다.
import mlflow
from mlflow.tracking import MlflowClient
client = MlflowClient()
# 모델 레지스트리에 새 모델 등록
model_uri = "runs:/abc123def456/random_forest_model"
model_name = "house_price_predictor"
# 모델 등록 (처음이면 생성, 이미 있으면 새 버전 추가)
result = mlflow.register_model(model_uri, model_name)
print(f"등록된 버전: {result.version}")
# 모델 버전에 설명 추가
client.update_model_version(
name=model_name,
version=result.version,
description="RMSE 0.15 달성, 2024년 1월 학습 데이터 사용"
)
# 스테이지 변경 - 프로덕션으로 승격
client.transition_model_version_stage(
name=model_name,
version=result.version,
stage="Production"
)
# 프로덕션 모델 불러오기
production_model = mlflow.pyfunc.load_model(
model_uri=f"models:/{model_name}/Production"
)
김개발 씨의 모델이 좋은 성능을 보여서 실제 서비스에 적용하기로 했습니다. 그런데 배포 후에도 모델은 계속 개선됩니다.
새 모델이 더 좋으면 교체해야 하고, 문제가 생기면 이전 버전으로 롤백해야 합니다. 코드 버전 관리에 Git을 사용하듯이, 모델 버전 관리에는 모델 레지스트리를 사용합니다.
MLflow의 모델 레지스트리는 모델의 전체 생명주기를 관리하는 중앙 저장소입니다. 등록 과정은 간단합니다.
실험에서 만든 모델의 URI를 mlflow.register_model에 전달하면 됩니다. 같은 이름으로 등록하면 버전이 자동으로 올라갑니다.
첫 등록은 버전 1, 그다음은 버전 2가 됩니다. 코드를 살펴보겠습니다.
model_uri는 실험에서 저장한 모델의 위치입니다. runs:/{run_id}/모델이름 형식입니다.
model_name은 레지스트리에서 사용할 이름입니다. 보통 역할을 나타내는 이름을 사용합니다.
update_model_version으로 설명을 추가할 수 있습니다. 이 버전이 어떤 데이터로 학습되었는지, 성능은 어떤지 기록해두면 나중에 유용합니다.
가장 중요한 기능은 스테이지입니다. None, Staging, Production, Archived 네 가지 상태가 있습니다.
새로 등록된 모델은 None 상태입니다. 테스트를 거쳐 Staging으로, 검증이 완료되면 Production으로 승격합니다.
transition_model_version_stage로 스테이지를 변경합니다. Production으로 설정하면 이 모델이 현재 서비스에서 사용되는 버전임을 의미합니다.
이전 Production 모델은 자동으로 None이나 Archived로 변경됩니다. 모델을 불러올 때도 스테이지를 활용합니다.
models:/{모델이름}/Production URI를 사용하면 현재 프로덕션 버전을 자동으로 불러옵니다. 버전 번호를 몰라도 됩니다.
실무에서 이 기능은 CI/CD 파이프라인과 연동됩니다. 새 모델이 테스트를 통과하면 자동으로 Staging으로 등록하고, 수동 승인 후 Production으로 올립니다.
문제가 생기면 이전 버전을 다시 Production으로 바꿔 롤백합니다. 주의할 점이 있습니다.
Production 스테이지의 모델을 바꾸면 서비스에 바로 반영됩니다. 충분한 테스트 없이 변경하면 안 됩니다.
김개발 씨는 이제 모델 배포도 자신 있게 합니다. 버전 관리가 되니 실수해도 금방 복구할 수 있습니다.
실전 팁
💡 - 프로덕션 승격 전에 반드시 Staging에서 충분히 테스트하세요
- 모델 버전마다 description에 학습 데이터 정보를 기록해두세요
7. 자동 로깅 활용하기
김개발 씨가 MLflow에 익숙해졌습니다. 그런데 매번 log_param, log_metric을 호출하는 게 귀찮아졌습니다.
"학습할 때마다 비슷한 코드를 반복하는데, 자동으로 안 되나요?" 박시니어 씨가 웃으며 말했습니다. "autolog라는 게 있어요."
mlflow.autolog는 머신러닝 프레임워크와 통합되어 학습 과정을 자동으로 기록합니다. sklearn, pytorch, tensorflow, xgboost 등 주요 프레임워크를 지원합니다.
한 줄의 코드만 추가하면 파라미터, 메트릭, 모델이 자동으로 로깅됩니다. 보일러플레이트 코드를 대폭 줄일 수 있습니다.
다음 코드를 살펴봅시다.
import mlflow
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_iris
# 자동 로깅 활성화 - 이 한 줄이 핵심!
mlflow.autolog()
# 데이터 준비
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2
)
# 실험 설정
mlflow.set_experiment("autolog_demo")
# 모델 학습 - 자동으로 모든 것이 기록됨
model = GradientBoostingClassifier(
n_estimators=50,
learning_rate=0.1,
max_depth=3
)
model.fit(X_train, y_train)
# 테스트 점수도 자동 기록됨
score = model.score(X_test, y_test)
print(f"테스트 정확도: {score}")
# log_param, log_metric, log_model 호출이 필요 없습니다!
김개발 씨는 열심히 MLflow를 사용했습니다. 그런데 매번 같은 패턴이 반복되었습니다.
log_param으로 하이퍼파라미터를 기록하고, fit 후에 log_metric으로 성능을 기록하고, 마지막에 log_model로 모델을 저장하고. "이거 자동화 안 돼요?" 개발자답게 반복 작업을 싫어하는 김개발 씨의 질문이었습니다.
**mlflow.autolog()**가 바로 그 해답입니다. 이 함수를 호출하면 MLflow가 머신러닝 라이브러리의 학습 과정을 감시합니다.
모델이 학습될 때 자동으로 필요한 정보를 기록합니다. 코드를 보면 놀라울 정도로 간단합니다.
mlflow.autolog() 한 줄만 추가하면 됩니다. 그 이후로는 평소처럼 모델을 학습시키기만 하면 됩니다.
GradientBoostingClassifier에 전달한 n_estimators, learning_rate, max_depth가 자동으로 파라미터에 기록됩니다. fit이 끝나면 학습 메트릭이 기록됩니다.
모델 자체도 자동으로 저장됩니다. sklearn만 지원하는 게 아닙니다.
mlflow.pytorch.autolog(), mlflow.tensorflow.autolog(), mlflow.xgboost.autolog() 등 프레임워크별 전용 함수도 있습니다. 각 프레임워크에 맞는 정보를 수집합니다.
autolog가 기록하는 정보는 생각보다 많습니다. sklearn의 경우 모든 하이퍼파라미터, 학습/검증 메트릭, 모델 시그니처, 심지어 피처 중요도까지 자동으로 저장됩니다.
실무에서 autolog는 실험 초기 단계에 특히 유용합니다. 빠르게 여러 모델을 테스트할 때 일일이 로깅 코드를 작성할 필요가 없습니다.
나중에 더 세밀한 제어가 필요하면 수동 로깅으로 전환하면 됩니다. 주의할 점도 있습니다.
autolog는 모든 학습에 자동으로 적용됩니다. 테스트 코드에서도 기록이 남을 수 있습니다.
비활성화하려면 **mlflow.autolog(disable=True)**를 호출하세요. 또 하나, autolog가 기록하는 항목을 커스터마이징할 수 있습니다.
**mlflow.autolog(log_models=False)**처럼 특정 항목만 제외할 수 있습니다. 김개발 씨는 이제 프로토타이핑 단계에서 autolog를 적극 활용합니다.
빠르게 실험하고, 나중에 필요한 부분만 수동으로 추가합니다.
실전 팁
💡 - 실험 초기에는 autolog로 빠르게, 나중에 필요하면 수동 로깅 추가
- log_input_examples=True 옵션으로 입력 데이터 샘플도 저장할 수 있습니다
8. 원격 추적 서버 설정
김개발 씨와 팀원들이 함께 프로젝트를 진행합니다. 그런데 각자 자기 컴퓨터에서 MLflow를 실행하니 실험 결과가 공유되지 않습니다.
"제가 어제 좋은 결과 냈는데, 보여드리려면 제 컴퓨터로 와야 해요..." 팀 협업에는 중앙 서버가 필요했습니다.
MLflow는 원격 추적 서버를 지원합니다. 팀원 모두가 하나의 서버에 실험을 기록하고 공유할 수 있습니다.
서버는 데이터베이스에 메타데이터를, 오브젝트 스토리지에 아티팩트를 저장합니다. MLFLOW_TRACKING_URI 환경변수만 설정하면 로컬 코드가 자동으로 원격 서버에 연결됩니다.
다음 코드를 살펴봅시다.
# 원격 서버 시작 (서버 측)
# mlflow server \
# --backend-store-uri postgresql://user:pass@localhost/mlflow \
# --default-artifact-root s3://my-mlflow-bucket \
# --host 0.0.0.0 \
# --port 5000
# 클라이언트 측 설정 방법 1: 환경변수
import os
os.environ["MLFLOW_TRACKING_URI"] = "http://mlflow-server:5000"
# 클라이언트 측 설정 방법 2: 코드에서 직접 설정
import mlflow
mlflow.set_tracking_uri("http://mlflow-server:5000")
# 연결 확인
print(f"Tracking URI: {mlflow.get_tracking_uri()}")
# 이제 평소처럼 실험하면 원격 서버에 기록됨
mlflow.set_experiment("team_project")
with mlflow.start_run():
mlflow.log_param("developer", "김개발")
mlflow.log_metric("accuracy", 0.92)
print("원격 서버에 기록되었습니다!")
김개발 씨 팀은 5명의 데이터 사이언티스트로 구성되어 있습니다. 각자 다른 모델을 실험하고 있었습니다.
그런데 서로의 결과를 비교하기가 어려웠습니다. 각자의 노트북에 실험 기록이 흩어져 있었기 때문입니다.
"중앙 서버를 하나 세우면 어때요?" 박시니어 씨의 제안이었습니다. MLflow는 로컬뿐 아니라 원격 서버에도 기록을 저장할 수 있습니다.
원격 서버 구성은 세 가지 요소로 이루어집니다. 첫째는 추적 서버 자체입니다.
둘째는 메타데이터를 저장할 데이터베이스입니다. SQLite, PostgreSQL, MySQL 등을 사용합니다.
셋째는 아티팩트를 저장할 스토리지입니다. S3, Azure Blob, GCS 등을 사용합니다.
서버 시작 명령어를 보겠습니다. --backend-store-uri는 메타데이터 저장소를 지정합니다.
PostgreSQL 연결 문자열을 사용했습니다. --default-artifact-root는 아티팩트 저장소입니다.
S3 버킷을 지정했습니다. 클라이언트에서 연결하는 방법은 두 가지입니다.
첫 번째는 환경변수 MLFLOW_TRACKING_URI를 설정하는 것입니다. 모든 MLflow 호출이 자동으로 이 서버를 사용합니다.
두 번째는 코드에서 **mlflow.set_tracking_uri()**를 직접 호출하는 것입니다. 연결되면 나머지는 동일합니다.
set_experiment, start_run, log_param, log_metric 모든 것이 그대로 작동합니다. 차이점은 기록이 로컬이 아닌 원격 서버에 저장된다는 것입니다.
팀원 모두가 같은 서버를 바라보면 마법이 일어납니다. 누군가 실험을 기록하면 다른 팀원도 바로 볼 수 있습니다.
실험 비교, 최고 성능 모델 찾기가 팀 차원에서 가능해집니다. 실무에서는 보통 Kubernetes나 Docker로 서버를 운영합니다.
인증 시스템을 추가해서 접근을 제어하기도 합니다. 회사 내부 네트워크에서만 접속 가능하게 설정하는 경우가 많습니다.
주의할 점이 있습니다. 원격 서버에 연결하면 네트워크 지연이 발생합니다.
대량의 메트릭을 자주 기록하면 학습 속도가 느려질 수 있습니다. 배치로 모아서 기록하는 것이 좋습니다.
김개발 씨 팀은 이제 하나의 MLflow 서버를 공유합니다. 아침 스탠드업 미팅에서 MLflow UI를 띄워놓고 실험 결과를 함께 검토합니다.
실전 팁
💡 - 프로덕션 서버는 반드시 데이터베이스 백업을 설정하세요
- 아티팩트 저장소 용량을 주기적으로 모니터링하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.