머신러닝 실험을 진행할 때, 모델을 반복적으로 학습하고 하이퍼파라미터를 조정하다 보면
“이게 어떤 설정에서 나왔던 결과였지?” 하는 순간이 자주 생깁니다.
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는 “모델 버전관리 + 실험 추적의 표준 도구”입니다.
'MLOps·머신러닝 운영 > MLflow를 활용한 머신러닝 실험 관리' 카테고리의 다른 글
| MLflow 산출물(Artifacts) 폴더 구조 이해하기 (0) | 2025.10.23 |
|---|---|
| MLflow Tracking 실험 관리 — 파라미터, 메트릭, 아티팩트, 태그 기록하기 (1) | 2025.10.22 |
| Docker Compose로 MLflow + MySQL 환경 구축하기 (0) | 2025.10.22 |
| MLflow Autolog 확장하기: Custom Logging으로 세부 실험 데이터 관리 (0) | 2025.10.21 |
| MLflow로 랜덤포레스트 분류 모델 자동 추적하기 (0) | 2025.10.21 |