Experiment Tracking
실험 추적은 모든 ML 학습 실행의 파라미터, 코드 및 데이터 버전, 메트릭, 아티팩트를 기록해 실행 결과를 비교하고 재현할 수 있도록 합니다.
실험 추적은 각 머신러닝 학습 실행에 대한 모든 정보, 즉 코드 버전, 데이터 버전, 설정, 환경, 시간에 따른 메트릭, 가중치와 플롯 같은 출력 파일을 검색 가능한 하나의 저장소에 기록하는 작업입니다. 수십 가지 학습률, 증강 설정, 모델 크기를 시험하는 프로젝트에서는 디스크에 저장된 실행 결과가 서로 비슷해 보일 수 있습니다. 추적을 사용하면 각 결과의 설정을 보존하므로 몇 달 뒤에도 최적의 실행을 비교하고 재현하며 출처를 확인할 수 있습니다. 2015년 TensorFlow와 함께 출시된 TensorBoard는 실시간 학습 곡선을 표준으로 만들었고, Databricks는 2018년 MLflow를 오픈 소스로 공개하면서 추적을 최초의 세 가지 구성 요소 중 하나로 포함했습니다. Weights & Biases, Comet, ClearML, DVC도 널리 사용되는 추적 도구입니다.
추적 도구가 기록하는 정보#
각 실행에는 고유 ID가 부여되며 관련 실행을 묶은 이름 있는 그룹인 실험에 속합니다. 일반적인 실행 기록에는 다음 정보가 포함됩니다:
- 하이퍼파라미터: 학습률, 배치 크기, 최적화 도구, 모델 아키텍처, 무작위 시드, 학습에 영향을 주는 기타 모든 설정입니다.
- 메트릭: 단계 또는 에폭별로 기록한 학습 및 검증 손실과 점수, GPU 메모리와 사용률 같은 시스템 메트릭입니다.
- 아티팩트: 체크포인트, 혼동 행렬, 샘플 예측, 설정 파일입니다.
- 계보: 실행 결과를 생성한 Git 커밋, 데이터셋 버전, 패키지 버전, 하드웨어, 작성자입니다.
로깅은 각 값에 대해 클라이언트 호출을 수행하거나, 별도 코드 없이 프레임워크의 파라미터와 메트릭을 수집하는 자동 로깅 통합을 통해 이루어집니다. 팀의 공유 추적 서버는 모든 노트북, 클라우드 머신, CI 작업의 실행 정보를 수집합니다. 대시보드에서는 선택한 실행의 손실 곡선을 겹쳐 보고 모든 파라미터나 메트릭으로 필터링할 수 있으므로 과적합 같은 문제를 한눈에 파악할 수 있습니다.
Ultralytics YOLO 학습은 각 실행의 인수를 args.yaml에 기록하고 에폭별 손실과 메트릭을 results.csv에 기록합니다. 기본 통합은 패키지를 설치하면 MLflow, Comet, ClearML, DVC에 동일한 값을 전송하며, yolo settings를 통해 TensorBoard와 Weights & Biases를 활성화할 수 있습니다. project 및 name 학습 인수는 MLflow에서 실험 및 실행 이름이 되므로 YOLO26 탐색 결과를 추적 도구에서 체계적으로 확인할 수 있습니다.
실행 비교 및 재현#
대시보드는 실행 전반에 걸쳐 지표와 파라미터를 비교하는 그래프를 그리거나, 각 실행의 설정을 점수에 연결하는 평행 좌표 차트를 표시합니다. 이를 통해 스윕에서 중요한 설정을 확인할 수 있습니다. Ultralytics Platform에서는 프로젝트가 오버레이된 지표 및 손실 곡선과 나란히 비교하는 표를 사용해 모델을 비교할 수 있으며, 실행 비교 및 우승 모델 선택 강의에서는 이 비교를 스크립트 기반 승격 게이트로 구현합니다. 실행을 재현하려면 하이퍼파라미터뿐 아니라 코드 커밋, 정확한 데이터 스냅샷, 패키지 버전, 난수 시드도 기록해야 합니다. GPU 커널과 데이터 로드 순서가 달라지면 다른 조건이 동일해도 결과가 약간 바뀔 수 있기 때문입니다.
이 MLflow 스크립트는 scikit-learn의 손글씨 숫자 데이터셋에서 깊이가 네 가지인 의사결정 트리를 학습합니다. 깊이는 파라미터로, 검증 정확도는 메트릭으로 기록한 다음, 실험을 표처럼 조회합니다:
import mlflow
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# Store runs in a local SQLite file and group them under one experiment
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("digits-tree-depth")
X_train, X_val, y_train, y_val = train_test_split(*load_digits(return_X_y=True), random_state=0)
# One tracked run per setting: the parameter goes in, the metric comes out
for depth in [2, 4, 8, 16]:
with mlflow.start_run(run_name=f"depth-{depth}"):
model = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(X_train, y_train)
mlflow.log_param("max_depth", depth)
mlflow.log_metric("val_accuracy", model.score(X_val, y_val))
# Query the experiment like a table, best run first
runs = mlflow.search_runs(order_by=["metrics.val_accuracy DESC"])
print(runs[["params.max_depth", "metrics.val_accuracy"]])새 데이터베이스에서는 표에 검증 정확도 0.838의 깊이 16이 먼저 표시되고, 이어서 깊이 8은 0.818, 깊이 4는 0.533, 깊이 2는 0.318로 표시됩니다. 같은 폴더에서 mlflow ui을 --backend-store-uri sqlite:///mlflow.db과 함께 실행하면 브라우저에서 동일한 실행 결과를 확인할 수 있습니다.
실험 추적과 관련 실무 비교#
실험 추적은 머신러닝 운영(MLOps)의 한 단계이며, 다음 세 가지 실무와 혼동되는 경우가 많습니다:
- 모델 레지스트리: 배포할 가치가 있는 소수의 학습 모델을 보관하며, 각 버전을 해당 모델을 생성한 추적 실행과 연결합니다.
- 모델 모니터링: 추적이 개발 단계에서 역할을 마친 뒤, 프로덕션에 배포된 모델의 입력, 출력, 정확도를 감시합니다.
- 하이퍼파라미터 튜닝: Optuna 및 Ray Tune과 같은 탐색 도구는 다수의 실행을 자동으로 시작하고, 추적 도구는 모든 실행을 저장하고 순위를 매깁니다.










