포스트

MLflow 해부 (5) 조회와 자동화: search_runs와 재학습 연동

search_runs의 filter_string 문법으로 run을 코드에서 조회하고, 직전 champion보다 좋을 때만 새 모델을 승격하는 재학습 파이프라인 패턴을 만듭니다.

MLflow 해부 (5) 조회와 자동화: search_runs와 재학습 연동

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

UI 밖에서 기록 다루기

UI는 사람이 볼 때의 인터페이스이고, 자동화는 조회 API 위에서 만듭니다. 중심은 search_runs입니다. 결과가 pandas DataFrame으로 와서 후처리가 바로 됩니다.

1
2
3
4
5
6
7
8
9
import mlflow

runs = mlflow.search_runs(
    experiment_names=["demo"],
    filter_string="metrics.mae < 20 and tags.data_version = 'v1'",
    order_by=["metrics.mae ASC"],
    max_results=5,
)
print(runs[["run_id", "metrics.mae", "params.max_depth"]])

filter_string 문법은 SQL의 WHERE와 비슷하고, 접두사로 영역을 지정합니다.

접두사대상
metrics.지표metrics.mae < 20
params.파라미터 (문자열 비교)params.max_depth = '8'
tags.태그tags.data_version = 'v1'
attributes.run 속성attributes.status = 'FINISHED'

파라미터는 전부 문자열로 저장되기 때문에 params.max_depth = '8'처럼 따옴표가 필요합니다. 숫자 비교가 되는 것은 metrics뿐입니다.

승격 자동화 패턴

registry와 조회를 붙이면 재학습 파이프라인의 마지막 단계가 만들어집니다. “새 run이 현재 champion보다 좋을 때만 등록하고 승격”하는 패턴입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from mlflow import MlflowClient

client = MlflowClient()
NAME, METRIC = "demand-model", "mae"

def promote_if_better(new_run_id: str) -> bool:
    new_mae = client.get_run(new_run_id).data.metrics[METRIC]

    champion = client.get_model_version_by_alias(NAME, "champion")
    champ_mae = client.get_run(champion.run_id).data.metrics[METRIC]

    if new_mae >= champ_mae:
        return False   # 개선 없음, 등록하지 않는다

    version = mlflow.register_model(f"runs:/{new_run_id}/model", NAME).version
    client.set_registered_model_alias(NAME, "champion", version)
    return True
  • 비교 기준을 champion의 “등록 당시 지표”가 아니라 champion run의 기록에서 다시 읽습니다. registry가 run의 포인터라는 4편의 구조 덕에 가능한 방식입니다
  • 개선이 없으면 등록 자체를 하지 않아 registry에 의미 없는 버전이 쌓이지 않습니다
  • 같은 데이터 기준으로 평가했는지는 코드가 보장하지 않습니다. 검증셋 버전을 태그로 남기고 filter로 맞추는 것이 안전장치입니다

파이프라인에 붙이는 자리

이 함수가 들어가는 자리는 주기 재학습 파이프라인의 끝입니다. Airflow 기준으로 “데이터 집계, 학습, 평가, 승격 판단”의 마지막 task가 됩니다. DAG 구성은 Airflow 해부 시리즈에서, 실제 프로젝트 적용은 NYC 택시 프로젝트 8편에서 다룹니다.

조회 API의 다른 쓰임도 같은 방식입니다.

  • 주간 실험 리포트: search_runs로 이번 주 run을 모아 지표 요약 표 생성
  • 실험 정리: 오래된 실패 run을 조회해서 일괄 삭제
  • 데이터 버전별 성능 추이: 태그로 필터링해 시계열로 비교

다음 편에서는 지금까지 로컬 파일로 쓰던 저장소를 팀용 원격 서버로 바꿉니다.

다음 글: MLflow 해부 (6) 운영: tracking server, 스토리지, 인증

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