포스트

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

log_model이 남기는 flavor와 환경 정보, 입력 스키마를 기록하는 signature, 그리고 수동 로깅을 한 줄로 대체하는 autolog의 동작 범위와 사용 기준을 정리합니다.

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

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

log_model은 log_artifact와 다르다

모델 파일을 log_artifact로 올려도 저장은 됩니다. 차이는 log_model이 모델을 “다시 실행 가능한 형태”로 저장한다는 점입니다.

1
2
3
4
5
6
7
8
9
10
from mlflow.models import infer_signature

signature = infer_signature(X_val, model.predict(X_val))

mlflow.sklearn.log_model(
    model,
    name="model",
    signature=signature,
    input_example=X_val[:3],
)

이 호출이 run 아래에 남기는 것은 모델 파일 하나가 아니라 폴더입니다.

1
2
3
4
5
model/
├── MLmodel              # 모델 메타데이터: flavor, signature
├── model.pkl            # 직렬화된 모델
├── requirements.txt     # 재현용 의존성 목록
└── input_example.json   # 입력 예시
  • flavor: 이 모델을 어떤 인터페이스로 로딩할 수 있는지의 목록입니다. sklearn으로 저장한 모델은 sklearn flavor와 pyfunc flavor를 함께 가져서, scikit-learn 없이도 공통 인터페이스(pyfunc)로 로딩할 수 있습니다
  • requirements.txt: 학습 당시의 라이브러리 버전이 자동 기록됩니다. 서빙 환경을 맞출 때의 기준이 됩니다

signature: 입력 스키마의 계약

signature는 모델이 받는 입력의 컬럼과 dtype 기록입니다. 없어도 저장되지만, 있어야 서빙 시점에 잘못된 입력이 스키마 검증에서 걸립니다. 학습 때 20개 컬럼이었는데 서빙 요청이 19개로 오는 사고를 에러 메시지 한 줄로 바꿔주는 장치라서, infer_signature로 만들어 붙이는 것을 기본 습관으로 권합니다.

저장한 모델은 pyfunc 인터페이스로 다시 불러옵니다.

1
2
loaded = mlflow.pyfunc.load_model("runs:/<run_id>/model")
loaded.predict(X_val[:3])

runs:/<run_id>/model URI가 “그 run이 남긴 그 모델”을 가리킵니다. run_id 대신 이름과 버전으로 가리키는 방법이 4편의 Model Registry입니다.

autolog

지원 프레임워크를 쓴다면 2편의 수동 로깅 대부분을 한 줄로 대체할 수 있습니다.

1
2
3
mlflow.autolog()

model = RandomForestRegressor(**params).fit(X_tr, y_tr)   # 이 호출이 자동 기록된다

fit() 호출을 가로채서 파라미터 전체, 학습 지표, 모델(signature 포함)을 자동으로 남깁니다. scikit-learn, LightGBM, XGBoost, PyTorch Lightning, Keras 등을 지원합니다.

사용 기준은 이렇게 잡으면 됩니다.

  • autolog로 시작합니다. 기록 누락이 없고 코드가 짧아집니다
  • 통제가 필요해지면 명시적 로깅을 섞습니다. autolog는 학습 지표를 남기지만, 별도 검증셋 지표나 커스텀 지표는 직접 log_metric 해야 합니다. 두 방식은 같은 run 안에서 공존합니다
  • 순수 PyTorch 학습 루프는 처음부터 수동입니다. autolog는 fit() 같은 진입점을 가로채는 방식이라, 직접 짠 for 루프는 대상이 아닙니다. epoch마다 log_metric(step=...)을 직접 넣습니다

이 편의 요약

  • 모델은 log_artifact가 아니라 log_model로 저장합니다. flavor, 의존성, signature가 함께 남습니다
  • signature는 서빙 사고를 입력 검증 에러로 바꿔주는 계약입니다. infer_signature로 만들어 붙입니다
  • autolog로 시작하고, 커스텀 지표는 명시적 로깅으로 보강합니다

다음 편에서는 run 안의 모델에 이름과 버전을 붙이는 Model Registry를 다룹니다.

다음 글: MLflow 해부 (4) Model Registry: 버전, alias, 서빙

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