학습 진행률 모니터링
Platform이 학습 진행 상황을 자동으로 추적하고 표시하는 방법을 설명합니다.
개요
KeyNet Platform은 hyperparameter와 MLflow 메트릭을 연동하여 학습 진행률을 자동으로 추적합니다. 별도의 설정 없이 --epochs 파라미터와 mlflow.log_metrics의 step 값만으로 현재 몇 번째 epoch이 진행 중인지 실시간으로 확인할 수 있습니다.
Epoch 자동 감지
Platform은 hyperparameter 중에서 epoch 또는 epochs라는 이름을 가진 파라미터를 자동으로 감지합니다.
*epoch* 으로 매치되는 하이퍼 파라미터 중 가장 큰 값을 찾아 사용합니다.
가능한 epoch 이나 epochs 정도로 직관적인 이름을 사용하는 것을 권장합니다.
감지 후 동작
감지된 epoch 값은 다음과 같이 사용됩니다:
- 최대 step 설정: 선언된 값이 학습의 최대 step으로 설정됩니다
- 진행률 계산 기준: MLflow의
step값과 비교하여 진행률을 계산합니다 - UI 표시: "N/M epoch 완료" 형태로 실시간 진행률을 표시합니다
예시:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--epochs", type=int, default=10) # Platform이 자동 감지
args = parser.parse_args()
Platform은 --epochs=10으로 실행되면 최대 step을 10으로 설정하고, 각 epoch마다 진행률을 업데이트합니다.
진행률 추적 방법
학습 루프에서 mlflow.log_metrics의 step 파라미터에 현재 epoch을 전달하면 Platform이 자동으로 진행률을 추적합니다.
핵심 코드
import mlflow
# 학습 루프 (1부터 시작)
for epoch in range(1, args.epochs + 1):
# 한 epoch 학습 수행
train_loss = train_one_epoch(model, train_loader)
val_loss = validate(model, val_loader)
# Platform 진행률 추적의 핵심: step=epoch
mlflow.log_metrics({
"train_loss": train_loss,
"val_loss": val_loss,
}, step=epoch) # 현재 epoch을 step으로 전달
동작 원리:
Platform은 --epochs 값(예: 10)을 최대 step으로 설정하고, mlflow.log_metrics의 step 값을 추적하여 진행률을 계산합니다:
step=1→ "1/10 epoch" (10%)step=2→ "2/10 epoch" (20%)step=10→ "10/10 epoch" (100%)
step 파라미터에 현재 epoch 번호를 전달하는 것이 진행률 추적의 핵심입니다. step=0부터 시작하거나 다른 값을 사용하면 진행률이 부정확하게 표시됩니다.
Platform UI에서 확인
학습 상세 페이지의 실시간 로그 탭에서 진행률을 실시간으로 확인할 수 있습니다.
표시되는 정보:
- 진행률: "5/10 epoch" (현재/전체)
- 퍼센트: 50%
- Epoch별 메트릭: Train Loss, Validation Loss, Accuracy 등
예상 로그:
Epoch 1/10: Train Loss=0.3456, Train Acc=89.23% | Val Loss=0.1234, Val Acc=96.45%
Epoch 2/10: Train Loss=0.2134, Train Acc=93.56% | Val Loss=0.0987, Val Acc=97.12%
...
Epoch 10/10: Train Loss=0.0512, Train Acc=98.45% | Val Loss=0.0456, Val Acc=98.92%
주의사항
Step은 1부터 시작
MLflow step은 1부터 시작해야 진행률이 정확하게 표시됩니다:
# ✅ 올바른 방법
for epoch in range(1, args.epochs + 1): # 1, 2, 3, ..., 10
mlflow.log_metrics(metrics, step=epoch)
# ❌ 잘못된 방법
for epoch in range(args.epochs): # 0, 1, 2, ..., 9
mlflow.log_metrics(metrics, step=epoch)
파라미터 이름 정확히 일치
Hyperparameter 이름이 epoch 또는 epochs가 아니면 자동 감지되지 않습니다:
# ✅ 자동 감지됨
parser.add_argument("--epochs", type=int, default=10)
parser.add_argument("--epoch", type=int, default=10)
# ❌ 자동 감지 안 됨
parser.add_argument("--num-epochs", type=int, default=10)
parser.add_argument("--training-epochs", type=int, default=10)
Step 기반 학습
Transformer 등 일부 모델은 epoch이 아닌 step 단위로 학습합니다. 이 경우에도 동일하게 적용할 수 있습니다:
parser.add_argument("--epochs", type=int, default=1000) # 실제로는 training step 수
for step in range(1, args.epochs + 1):
loss = train_one_step(model, batch)
mlflow.log_metrics({"loss": loss}, step=step)
Platform은 이름을 "epoch"으로 표시하지만, 실제로는 step 카운터로 동작합니다.
다음 단계
학습 진행률 모니터링을 이해했다면:
- Hyperparameter 설정: Epoch 파라미터 등록 방법
- MNIST 튜토리얼: 진행률 추적이 포함된 전체 워크플로우
- YOLO 튜토리얼: 복잡한 메트릭 추적 예시
- MLflow 문서: 메트릭 로깅 및 시각화 심화 학습