본문 바로가기

dev_AI_framework

optimizer — SGD / Momentum / Adam (CUDA)

1) 파일 구조

  • optimizer_types.cuh
    • enum class OptimizerType { SGD, MOMENTUM, ADAM };
    • 문자열/정수 변환 유틸 및 디버그용 출력 연산자.
  • optimizer_config.cuh
    • 기능 토글 매크로 정의 (빌드 전역에서 제어 가능)
      • WEIGHT_DECAY_ENABLE (0/1)
      • NESTEROV_ENABLE (0/1)
      • AMSGRAD_ENABLE (0/1)
      • GRAD_CLIP_ENABLE (0/1) + GRAD_CLIP_THRESH
      • GLOBAL_NORM_CLIP_ENABLE (0/1)
      • DEBUG_KERNEL (0/1)
  • optimizer_kernels.cu / optimizer_kernels.cuh
    • 커널 구현(SGD/Momentum/Adam) 및 호스트 런처 optimizer_update_cuda(...).
    • (선택) 글로벌 노름 클리핑용 리덕션/스케일 커널 포함.

빌드 팁: 기능 토글은 optimizer_config.cuh에서 기본값을 두되, 필요 시 NVCC 컴파일 옵션으로 -DWEIGHT_DECAY_ENABLE=1 처럼 재정의하세요.


4) 수치/안정성 규칙

  • 모든 커널에서 NaN/Inf grad는 무시(continue).
  • Adam bias‑correction: m̂ = m/(1-β₁ᵗ), v̂ = v/(1-β₂ᵗ).
  • 분모 보호: sqrt(max(v̂, 1e-12)) + eps.
  • value_clip()는 클리핑 + NaN 가드.

 

5) 메모리/버퍼 계약

  • param/grad/velocity/m/v/vhat_max는 모두 float32, C‑contiguous.
  • 크기는 동일: size = rows*cols.
  • Python 측에서 파라미터별 버퍼를 보관하며, 런처에 포인터를 전달.
  • 글로벌 노름 클리핑의 임시 버퍼(예: grad_scaled, d_partial):
    • 현재 샘플 구현은 함수 내부 static/cudaMalloc을 사용 → 멀티‑스트림/멀티‑파라미터 동시 업데이트 시 레이스 위험.
    • 권장: (1) 외부에서 워크스페이스 전달 인터페이스 추가, (2) 파라미터별 scratch, (3) 스트림별 allocator 사용.