본문으로 건너뛰기

학습 진행률 모니터링

Platform이 학습 진행 상황을 자동으로 추적하고 표시하는 방법을 설명합니다.

개요

KeyNet Platform은 hyperparameter와 MLflow 메트릭을 연동하여 학습 진행률을 자동으로 추적합니다. 별도의 설정 없이 --epochs 파라미터와 mlflow.log_metricsstep 값만으로 현재 몇 번째 epoch이 진행 중인지 실시간으로 확인할 수 있습니다.

Epoch 자동 감지

Platform은 hyperparameter 중에서 epoch 또는 epochs라는 이름을 가진 파라미터를 자동으로 감지합니다.

작동 방식

*epoch* 으로 매치되는 하이퍼 파라미터 중 가장 큰 값을 찾아 사용합니다. 가능한 epoch 이나 epochs 정도로 직관적인 이름을 사용하는 것을 권장합니다.

감지 후 동작

감지된 epoch 값은 다음과 같이 사용됩니다:

  1. 최대 step 설정: 선언된 값이 학습의 최대 step으로 설정됩니다
  2. 진행률 계산 기준: MLflow의 step 값과 비교하여 진행률을 계산합니다
  3. UI 표시: "N/M epoch 완료" 형태로 실시간 진행률을 표시합니다

예시:

train.py
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_metricsstep 파라미터에 현재 epoch을 전달하면 Platform이 자동으로 진행률을 추적합니다.

핵심 코드

train.py
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_metricsstep 값을 추적하여 진행률을 계산합니다:

  • step=1 → "1/10 epoch" (10%)
  • step=2 → "2/10 epoch" (20%)
  • step=10 → "10/10 epoch" (100%)
step=epoch가 핵심

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 step1부터 시작해야 진행률이 정확하게 표시됩니다:

# ✅ 올바른 방법
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 카운터로 동작합니다.

다음 단계

학습 진행률 모니터링을 이해했다면: