MLOps·머신러닝 운영/MLflow를 활용한 머신러닝 실험 관리

MLflow Run

Data Jun 2025. 10. 22. 22:49

머신러닝 실험을 진행할 때, 모델을 반복적으로 학습하고 하이퍼파라미터를 조정하다 보면
“이게 어떤 설정에서 나왔던 결과였지?” 하는 순간이 자주 생깁니다.
MLflow의 Run 기능은 바로 이 문제를 해결하기 위한 핵심입니다.
이번 포스트에서는 MLflow Run의 구조와 주요 함수(start_run, end_run, active_run, last_active_run)를
실제 코드 예시와 함께 알아보겠습니다.

 

 

1. Run이란 무엇인가?

Run은 머신러닝 워크플로의 단일 실행(single execution) 을 의미합니다.
즉, 하나의 학습 시도(실험)를 run 단위로 기록하고,
그 안에는 parameters, metrics, artifacts 등 추적하고 싶은 모든 정보가 담깁니다.

MLflow에서는 다음과 같은 함수들을 통해 run을 관리합니다:

  • mlflow.start_run()
  • mlflow.end_run()
  • mlflow.active_run()
  • mlflow.last_active_run()

✅ 핵심 요약
Run은 머신러닝 실험의 “로그 단위”이며, 모든 학습 결과를 체계적으로 저장하는 기본 단위입니다.

 

 

2. mlflow.start_run() — 새로운 실험 시작하기

mlflow.start_run()은 새로운 Run을 시작합니다.
이 함수를 호출하면 MLflow는 백엔드에 run metadata (예: experiment ID, run ID, timestamp)를 생성하고,
그 이후의 모든 로그(log_param, log_metric, log_artifact)를 해당 run에 연결합니다.

import mlflow

with mlflow.start_run():
    mlflow.log_param("learning_rate", 0.01)
    mlflow.log_metric("accuracy", 0.95)

start_run()은 컨텍스트 매니저(with 블록)로 사용하는 것이 가장 안전합니다.
블록이 종료되면 자동으로 run이 닫히므로 end_run()을 직접 호출할 필요가 없습니다.

 

3. start_run()의 주요 파라미터

 

mlflow.start_run()은 여러 옵션을 제공합니다:

인자 설명
run_name 커스텀 Run 이름 지정
experiment_id 연결한 Experiment ID
run_id 기존 Run을 이어서 실행
nested True일 경우 부모 Run 안에서 중첩 실행 가

이 함수는 ActiveRun 객체를 반환하며, 현재 활성화된 Run을 나타냅니다.

with mlflow.start_run(run_name="Parent Run"):
    for i in range(3):
        with mlflow.start_run(run_name=f"Child Run {i}", nested=True):
            mlflow.log_param("child_param", i)
            mlflow.log_metric("child_accuracy", 0.90 + i * 0.01)

중첩 Run(nested run)을 활용하면 하이퍼파라미터 탐색 등 반복 실험을 구조적으로 관리할 수 있습니다.

 

4. 명시적 실행 vs 컨텍스트 실행

Run을 실행하는 방법은 두 가지입니다.

 

4.1 명시적 방식

mlflow.start_run(run_name="My Run")
mlflow.log_param("param1", 5)
mlflow.log_metric("accuracy", 0.95)
mlflow.end_run()

 

4.2 컨텍스트 매니저 방식(추천)

with mlflow.start_run(run_name="My Run with Context"):
    mlflow.log_param("param2", 10)
    mlflow.log_metric("f1_score", 0.90)

컨텍스트 방식은 코드 블록이 끝날 때 자동으로 end_run()이 호출되므로
예외 발생이나 중단 상황에서도 안전하게 로그가 저장됩니다.

 

5. mlflow.end_run() — Run 명시적으로 종료하기

mlflow.end_run()은 현재 활성화된 Run을 명시적으로 종료합니다.
일반적으로는 with 블록을 사용하는 경우 자동으로 호출되므로 필요하지 않지만,
명시적으로 Run을 시작했을 때는 반드시 호출해야 합니다.

mlflow.start_run()
# ... 학습 및 로그 코드 ...
mlflow.end_run()

언제 쓸까?

  • start_run()을 직접 호출했을 때
  • with 문이 아닌 함수형 구조에서 여러 run을 제어할 때

 

6.  mlflow.active_run() / mlflow.last_active_run()

  • mlflow.active_run()
    현재 활성화된 run의 ActiveRun 객체를 반환합니다.
    run이 존재하지 않으면 None을 반환합니다.
  • mlflow.last_active_run()
    가장 최근에 실행된 run을 반환합니다.
    이미 종료된 run이라도 마지막으로 사용된 run을 확인할 수 있습니다.
active = mlflow.active_run()
print(active.info.run_id if active else "No active run")

last = mlflow.last_active_run()
print(last.info.run_id if last else "No previous run")

 

활용 포인트

  • 여러 Run을 자동화 스크립트에서 순차적으로 제어할 때
  • 이전 Run의 ID를 기반으로 모델을 이어서 학습할 때

 

정리하면

 

함수 역할 비고
mlflow.start_ run() 새로운 실험 시작 컨텍스트 블록 사용 권장
mlflow.end_run() 활성 Run 종료 명시적 실행 시 필수
mlflow.active_run() 현재 활성  Run 반환 None 가능
mlflow.last_active_run() 마지막 Run 반환 종료된 Run도 가

MLflow의 Run 기능은 단순한 로그 수집기가 아닙니다.
모델 개발 과정을 “데이터화”하여
누가, 언제, 어떤 설정으로 학습했는지를 완벽히 재현할 수 있는 실험 관리 체계를 제공합니다.

🔧 데이터 사이언티스트에게 MLflow는 “모델 버전관리 + 실험 추적의 표준 도구”입니다.