본문 바로가기

dev_AI_framework

후에 구현할 기능 고민해보자...

체크리스트: 다음 최적화 후보

A) GEMM / Matmul 계열

  • cuBLASLt Epilogue로 Bias/활성화 Fuse (중·상 / 🔥효과 큼)
    • run_graph.cu MATMUL 분기 → cublasLtMatmul로 교체, CUBLASLT_EPILOGUE_BIAS(+ RELU_BIAS) 사용.
    • Sigmoid/Tanh는 별도 커널 유지.
  • dW “배치-리듀스(M=∑) 단일 단계화” (상 / 효과 큼·작은 행렬에서 특히)
    • 현재: StridedBatched로 dW_tmp 생성 → 최종 reduce.
    • 선택1) Grouped GEMM(cuBLASLt)로 dW_b 생성 단계 런치 감소.
    • 선택2) CUTLASS BRGEMM 또는 WMMA로 직접 커널 작성(진짜 BRGEMM).
  • 알고리즘 힌트/힐리스틱 캐시 (중 / 효과 중)
    • cuBLAS/Lt 알고리즘 선택 결과를 shape별로 캐시 → 재사용.

B) 메모리 & 런치 오버헤드

  • CUDA Graphs 캡처 (중 / 🔥효과 큼)
    • forward + loss + backward + optimizer를 그래프로 1회 캡처 → 각 step cudaGraphLaunch() 한 방.
  • 메모리 풀/재사용 (중 / 효과 중)
    • ensure_output() 경로에서 cudaMallocAsync + cudaMemPool 또는 커스텀 풀.
    • dW_tmp/중간 그래디언트 워크스페이스를 레이어 간 재사용.
  • 스트림 파이프라인 & H2D/D2H 오버랩 (중 / 효과 중)
    • Data preload(다음 배치 H2D) 스트림과 compute 스트림을 이벤트로 연결.
    • 작은 배치/짧은 네트워크에서 체감 큼.

C) 활성화/손실/백워드

  • Activation In-Place 스케일링 (하 / 효과 소~중)
    • backward에서 dY를 in-place로 스케일(예: ReLU 마스크) → 추가 버퍼/복사 제거.
  • dBias Epilogue(BGRAD) 활용 (중 / 효과 중)
    • 환경이 지원하면 cuBLASLt BGRAD epilogue로 sum(dY)를 GEMM 에필로그에서 바로 산출.
    • 미지원이면 현행 ones·GEMM 유지.
  • 작은 Reduce 커널 최적화 (하 / 효과 소)
    • add_inplace/sum_rows류 커널에 warp-level reduce, vectorized load, occupancy 조절.

D) 합성곱 경로

  • cuDNN 도입(Forward/Backward) (중·상 / 🔥효과 큼)
    • CONV2D forward/backward를 cuDNN으로 대체(autotune 결과 캐시).
    • shape 고정이면 cuDNN이 매우 유리.
  • im2col+GEMM 경로 튜닝 (중 / 효과 중)
    • 임시 메모리 풀, StridedBatched GEMM, epilogue 활용 등으로 최적화.

E) 정밀도 / 데이터 레이아웃

  • Mixed Precision 확대(FP16/BF16 + FP32 Accum) (중·상 / 🔥효과 큼)
    • 마스터 웨이트 FP32 유지 + Loss Scaling(동적) → 안정화.
  • TF32 정책 세분화 (하 / 효과 소~중)
    • 레이어별 정확도 민감도에 따라 TF32/FP32 혼용.
  • 레이아웃/정렬/패딩 점검 (하 / 효과 소~중)
    • row-major에서 leading dim 정렬(128/256B 정렬), N 다중수 padding으로 coalescing 최적화.

F) 옵티마이저

  • 멀티-텐서 Optimizer 커널 (중 / 효과 중)
    • Adam/Momentum/SGD를 파라미터 묶음으로 한 번에 업데이트(메모리 접근 coalesced).
  • Fused Adam 계열 (중·상 / 효과 중)
    • Apex/DeepSpeed 같은 접근 참고. (Windows 환경이면 직접 구현이 현실적)

G) 컴파일/빌드 & 런타임 세팅

  • -use_fast_math 선택적 적용 (하 / 효과 소, 정확도 주의)
  • 환경 변수/플래그 캐시 (하 / 효과 소)
    • cuBLAS math mode, cuDNN autotune 결과, 알고리즘 선택 결과를 shape key로 저장.

H) 프로파일링 & 회귀 방지

  • Nsight Systems/Compute 정례 프로파일 (하 / 효과 큼)
    • 체크: Tensor Core utilization, DRAM BW, L2 Hit, SM Eff., 런치 횟수/간격, H2D/D2H 오버랩.
  • 마이크로벤치 스위트 (하 / 효과 큼)
    • 레이어별·배치별·shape별 타임 측정 자동화 + CSV 로그.
  • 수치 안정성 테스트 (하 / 효과 큼)
    • FP32 vs TF32/FP16 오차, loss scaling under/overflow 모니터, NaN guard.

“어디를 먼저?” 추천 순서

  1. CUDA Graphs 캡처 → 런치 오버헤드 바로 감소.
  2. 메모리 풀/재사용 + cudaMallocAsync → 할당/해제 비용/단편화 개선.
  3. cuBLASLt Epilogue(BIAS/+ReLU) → matmul+add(+relu)를 한 방에.
  4. dBias BGRAD(가능 시) → reduce GEMV 제거.
  5. cuDNN로 Conv 경로 교체 → 합성곱 포함 모델에서 크게 상승.
  6. Mixed Precision 확대 → 큰 모델/배치에서 체감 큼.
  7. 멀티-텐서 Optimizer → 클수록 효과 상승.