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 사용.
'dev_AI_framework' 카테고리의 다른 글
| GPU 구현, CPU 구현 비교 (0) | 2025.08.28 |
|---|---|
| RNN 추가 - OpStruct 벡터 API 로 확장 + 레거시 호환ㅂ (3) | 2025.08.25 |
| cnn — Conv2D CUDA Kernels (NCHW) (0) | 2025.08.23 |
| bias — Row/Col-wise Bias Add Kernels (0) | 2025.08.23 |
| activation - CUDA 활성화 커널 모듈 (2) | 2025.08.23 |