포스트

MLflow 해부 (2) Tracking 기초: 설치와 첫 기록

MLflow를 설치하고 experiment와 run 개념을 잡은 뒤, log_params, log_metric, log_artifact로 첫 실험을 기록하고 UI에서 run을 비교하는 기본 동선을 정리합니다.

MLflow 해부 (2) Tracking 기초: 설치와 첫 기록

MLflow 해부 시리즈의 2편입니다. 전체 목차는 0편에 있습니다.

설치와 UI 실행

1
2
uv add mlflow scikit-learn
uv run mlflow ui --port 5001

http://127.0.0.1:5001 에 접속하면 빈 experiment 목록이 보입니다. 이 상태의 저장소는 명령을 실행한 디렉토리 아래 mlruns/ 폴더입니다. 서버도 DB도 없는 파일 모드라서 혼자 쓰는 로컬 실험에는 이걸로 충분합니다.

기본 포트 5000을 피하는 이유가 있습니다. macOS는 AirPlay Receiver가 5000번을 선점하고 있어서, 5000으로 띄우면 브라우저가 MLflow 대신 403 응답을 받는 경우가 있습니다.

experiment와 run

기록의 단위 두 개를 먼저 구분합니다.

  • run: 학습 한 번의 실행. 파라미터, 지표, artifact가 여기에 묶입니다
  • experiment: 같은 문제를 푸는 run들의 묶음. “택시 수요 예측”이 experiment이고, 그 아래 서른 개의 run이 쌓이는 구조입니다

experiment를 지정하지 않으면 전부 Default로 들어가서 나중에 구분이 안 됩니다. 첫 줄에 set_experiment를 습관으로 붙입니다.

첫 기록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import mlflow
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split

X, y = make_regression(n_samples=1000, n_features=10, random_state=42)
X_tr, X_val, y_tr, y_val = train_test_split(X, y, random_state=42)

mlflow.set_experiment("demo")

params = {"n_estimators": 200, "max_depth": 8}

with mlflow.start_run(run_name="rf-baseline"):
    model = RandomForestRegressor(**params).fit(X_tr, y_tr)
    pred = model.predict(X_val)

    mlflow.log_params(params)
    mlflow.log_metric("mae", mean_absolute_error(y_val, pred))
    mlflow.set_tag("data_version", "v1")

    fig, ax = plt.subplots()
    ax.scatter(y_val, pred, s=4)
    fig.savefig("pred_vs_actual.png")
    mlflow.log_artifact("pred_vs_actual.png")
  • with mlflow.start_run(...) 블록이 run 하나의 경계입니다. 블록 안의 기록이 전부 이 run에 묶입니다
  • log_params는 dict를, log_param은 단일 값을 받습니다
  • set_tag는 지표도 파라미터도 아닌 부가 정보(데이터 버전, git commit)를 남기는 자리입니다
  • 그림과 파일은 log_artifact로 올립니다. 모델 저장은 3편log_model이 따로 담당합니다

epoch마다 변하는 지표는 step을 붙여 기록하면 UI에서 곡선으로 그려집니다.

1
2
for epoch in range(30):
    mlflow.log_metric("val_loss", loss, step=epoch)

UI 기본 동선

  • run 테이블: experiment를 열면 run들이 행으로, 파라미터와 지표가 열로 나옵니다. 지표 열을 정렬해 최고 run을 찾는 것이 기본 동선입니다
  • run 비교: run 여러 개를 체크하고 Compare를 누르면 파라미터 차이와 지표를 나란히 보여줍니다. parallel coordinates 그림에서 어떤 파라미터가 지표를 가르는지 확인합니다
  • run 상세: 개별 run의 Artifacts 탭에서 올린 그림과 파일을 브라우저로 봅니다

환경변수로 목적지 지정

코드에 set_tracking_uri를 하드코딩하는 대신 환경변수로 빼면, 같은 코드가 로컬과 원격 서버 어디로든 기록할 수 있습니다.

1
export MLFLOW_TRACKING_URI=http://127.0.0.1:5001

로컬 파일 모드와 원격 서버 모드의 차이는 6편에서 다룹니다. 다음 편은 모델을 기록하는 log_model과 자동 기록 autolog입니다.

다음 글: MLflow 해부 (3) 모델 기록: log_model, signature, autolog

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.