1하이퍼파라미터 최적화
하이퍼파라미터 튜닝은 모델 성능을 극대화하는 핵심 과정입니다. 학습률, 배치 크기, 레이어 수 등 수백 개의 조합 중 최적 값을 찾아야 합니다. 제조 AI에서는 도메인 특성상 데이터가 제한적이므로 효율적인 탐색 전략이 필수입니다.
Optuna는 베이지안 최적화를 사용하여 하이퍼파라미터 공간을 효율적으로 탐색합니다. Ray Tune은 분산 환경에서 대규모 실험을 병렬로 실행할 수 있습니다.
Grid Search
모든 조합을 시도하는 전수 탐색 방법입니다.
- 장점: 간단하고 확실
- 단점: 시간 소요가 매우 큼
- 사용: 파라미터가 2-3개일 때
Random Search
무작위로 조합을 샘플링합니다.
- 장점: Grid보다 효율적
- 단점: 최적값 보장 없음
- 사용: 초기 탐색 단계
Bayesian Optimization
이전 결과를 활용해 다음 시도를 결정합니다.
- 장점: 가장 효율적
- 단점: 구현 복잡도 높음
- 사용: 제한된 예산의 실험
# Optuna 기반 하이퍼파라미터 자동 최적화
# 1. 탐색할 하이퍼파라미터 정의
def objective(trial):
config = {
'num_layers': trial.suggest_int(2, 5),
'hidden_dim': trial.suggest_categorical([128, 256, 512]),
'learning_rate': trial.suggest_float(1e-5, 1e-2, log=True),
'batch_size': trial.suggest_categorical([16, 32, 64]),
'dropout': trial.suggest_float(0.1, 0.5)
}
# 모델 학습 및 검증
model = DefectModel(config)
trainer.fit(model, train_loader, val_loader)
return val_accuracy # 최대화할 지표
# 2. Study 생성 및 최적화 실행
study = optuna.create_study(
direction='maximize', # 정확도 최대화
sampler=TPESampler(), # 베이지안 최적화
pruner=MedianPruner() # 성능 낮으면 조기 종료
)
study.optimize(objective, n_trials=50)
# 3. 결과 확인
print(f"최적 정확도: {study.best_value}")
print(f"최적 파라미터: {study.best_params}")
Optuna의 Pruner는 성능이 낮은 시도를 조기에 중단합니다. MedianPruner는 중간값보다 낮은 성능의 실험을 자동으로 종료하여 탐색 시간을 50% 이상 단축합니다.
2분산 학습 전략
제조 데이터는 고해상도 이미지, 긴 시계열 등 크기가 큽니다. 단일 GPU로는 학습이 불가능하거나 너무 오래 걸리는 경우가 많습니다. 분산 학습(Distributed Training)은 여러 GPU나 서버에서 병렬로 학습하여 시간을 단축합니다.
PyTorch DDP (DistributedDataParallel)
PyTorch의 공식 분산 학습 방법으로, 각 GPU가 전체 모델의 복사본을 가지고 서로 다른 데이터 배치를 처리합니다. 그래디언트만 동기화하여 통신 오버헤드를 최소화합니다.
Data Parallel
배치를 GPU 수만큼 분할하여 병렬 처리. 가장 간단하지만 통신 병목 발생.
DDP (권장)
각 프로세스가 독립적으로 동작. 효율적인 그래디언트 동기화로 확장성 우수.
FSDP
모델 파라미터를 샤딩하여 메모리 효율 극대화. 초대형 모델에 적합.
DeepSpeed
Microsoft의 분산 학습 라이브러리. ZeRO 최적화로 메모리 사용량 1/8 감소.
# 분산 학습 핵심 개념
# 1. 분산 환경 초기화
setup_distributed(rank, world_size):
init_process_group(backend='nccl') # GPU 간 통신
set_device(rank) # GPU 할당
# 2. 모델 래핑
model = model.to(gpu_rank)
model = DistributedDataParallel(model)
# 3. 데이터 분산 (각 GPU에 다른 배치)
sampler = DistributedSampler(dataset, num_replicas=world_size)
dataloader = DataLoader(dataset, sampler=sampler)
# 4. 학습 루프
for epoch in epochs:
sampler.set_epoch(epoch) # 셔플 재현성
for batch in dataloader:
with autocast(): # Mixed Precision (FP16)
output = model(batch)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
# 모든 GPU의 메트릭 집계
all_reduce(metrics, op=SUM)
metrics /= world_size
# 5. 체크포인트 저장 (Rank 0만)
if rank == 0:
save(model.module.state_dict())
# 실행: torchrun --nproc_per_node=4 train.py
# Linear Scaling Rule: GPU 수에 비례하여 학습률 조정
# lr_new = lr_base × num_gpus
분산 학습 시 effective batch size가 증가하므로 학습률도 비례하여 조정해야 합니다. Linear Scaling Rule: lr_new = lr_base × num_gpus
3전이 학습과 파인튜닝
전이 학습(Transfer Learning)은 대규모 데이터셋으로 사전 학습된 모델을 제조 도메인에 맞게 조정하는 기법입니다.
Feature Extraction
사전 학습된 모델을 고정하고 마지막 레이어만 학습합니다.
- 데이터: 매우 적음 (100-1000개)
- 속도: 빠름
- 성능: 보통
Fine-tuning (권장)
사전 학습된 모델의 일부 레이어를 함께 학습합니다.
- 데이터: 적음 (1000-10000개)
- 속도: 보통
- 성능: 좋음
Full Training
전체 모델을 처음부터 학습합니다.
- 데이터: 많음 (100000개+)
- 속도: 느림
- 성능: 최고
# 전이 학습 3단계 전략
# 1단계: Feature Extraction (고정)
backbone = load_pretrained('efficientnet_b3')
freeze(backbone) # 백본 가중치 고정
classifier = Linear(feature_dim → num_classes)
train(classifier, epochs=10, lr=1e-3)
# 2단계: Fine-tuning (일부 해동)
unfreeze(backbone.last_2_blocks) # 마지막 2블록 해동
train(model, epochs=20, lr=1e-4) # 낮은 학습률
# 3단계: Full Fine-tuning (전체 해동)
unfreeze(backbone) # 전체 해동
train(model, epochs=30, lr=1e-5) # 매우 낮은 학습률
# 핵심: 점진적으로 학습률을 낮추면서 더 많은 레이어 학습
4실험 관리와 모델 레지스트리
MLflow를 사용하여 실험을 체계적으로 관리하고, 모델 버전을 추적합니다.
# MLflow 실험 관리 흐름
# 1. 실험 시작
mlflow.set_experiment("defect_detection")
with mlflow.start_run():
# 2. 하이퍼파라미터 로깅
mlflow.log_params({
"model": "efficientnet_b3",
"lr": 1e-3,
"batch_size": 32
})
# 3. 학습 메트릭 로깅
for epoch in epochs:
train_loss, val_acc = train_epoch()
mlflow.log_metrics({
"train_loss": train_loss,
"val_acc": val_acc
}, step=epoch)
# 4. 모델 저장
mlflow.pytorch.log_model(model, "model")
# 5. 모델 레지스트리 등록
mlflow.register_model(
model_uri,
name="defect_detector",
tags={"stage": "staging"}
)
None: 실험 단계 | Staging: 검증 테스트 중 | Production: 실제 배포 | Archived: 더 이상 사용 안함
5학습 모니터링
학습 과정을 실시간으로 모니터링하여 문제를 조기에 발견합니다.
# 학습 중 모니터링 항목
# 1. Loss 추적
if loss > threshold or isnan(loss):
alert("Loss 이상 감지")
# 2. 그래디언트 체크
grad_norm = compute_grad_norm(model)
if grad_norm > 100: # Gradient Explosion
alert("그래디언트 폭발")
if grad_norm < 1e-7: # Gradient Vanishing
alert("그래디언트 소실")
# 3. GPU 모니터링
if gpu_memory_usage > 90%:
alert("메모리 부족")
if gpu_utilization < 50%:
alert("GPU 활용률 낮음 - 데이터 로딩 병목")
# 4. 검증 메트릭 추적
if val_loss increasing for 5 epochs:
early_stop() # 과적합 방지
# 5. 체크포인트 저장
if val_acc > best_val_acc:
save_checkpoint(model, "best_model.pt")