[onnxruntime] ONNX Runtime: INT8-KV 캐시를 위한 고성능 Tensor-Core DynamicSparseAttention 최적화
PR 링크: microsoft/onnxruntime#33707 상태: Merged | 변경: +2474 / -27
들어가며
최근 대규모 언어 모델(LLM)의 추론 성능을 극대화하기 위해 INT8-KV 캐시 활용이 필수적입니다. 하지만 기존의 CUDA-core 기반 커널은 연산 효율성 측면에서 한계가 있었습니다. 본 PR은 microsoft/onnxruntime에 Qwen3.8-Flash-Next 모델을 위한 Tensor-Core 기반의 DynamicSparseAttention 커널을 도입하여, prefill 및 decode 단계에서 획기적인 성능 향상을 달성했습니다. 또한 HyperConnectionLowRankMix의 Sigmoid 함수를 분기 없는(branch-free) 방식으로 개선하여 연산 효율을 높였습니다.
코드 분석
1. DynamicSparseAttention: INT8-KV 캐시를 위한 Tensor-Core 커널
기존의 BF16-dequantizing 커널은 공유 메모리에서 데이터를 BF16으로 변환하는 과정에서 오버헤드가 발생했습니다. 새로운 커널은 INT8 데이터를 그대로 공유 메모리에 유지하고, ldmatrix를 통해 레지스터로 직접 로드하여 FP16 mma 연산을 수행합니다.
Before (BF16-dequantizing):
// 기존 방식: 공유 메모리에서 dequantize 후 BF16 연산
__global__ void DynamicSparseAttentionPrefillKernel(...) {
// ... dequantize K/V to BF16 in shared memory ...
// ... BF16 mma ...
}
After (Tensor-Core INT8):
// 개선된 방식: INT8 데이터를 직접 레지스터로 로드하여 FP16 mma 수행
template<bool kSplitK>
__global__ void DynamicSparseAttentionInt8TcKernel(...) {
// ... cp.async to shared memory (INT8) ...
// ... ldmatrix to registers (INT8) ...
// ... convert to FP16 in registers ...
// ... mma.sync.aligned.m16n8k16.row.col.f32.f16.f16.f32 ...
}
2. HyperConnectionLowRankMix: 분기 없는 Sigmoid
기존 Sigmoid 구현은 조건문에 따라 분기가 발생하여 warp 내에서 실행 효율이 저하되었습니다. 이를 수학적으로 동일한 분기 없는 코드로 변경했습니다.
Before:
// 분기 발생: v의 부호에 따라 다른 연산 수행
float SigmoidF32(float v) {
if (v >= 0) return 1.0f / (1.0f + expf(-v));
else return expf(v) / (1.0f + expf(v));
}
After:
// 분기 없는 구현: expf(-fabsf(v))를 활용하여 동일 결과 도출
float SigmoidF32(float v) {
float e = expf(-fabsf(v));
return (v >= 0 ? 1.0f : e) / (1.0f + e);
}
왜 이게 좋은가
- 성능 향상: H200 GPU 기준, Tensor-Core decode 커널은 기존 CUDA-core 커널 대비 3.3배에서 5.6배 더 빠릅니다. prefill 커널 또한 2.7~3.0배의 성능 향상을 보입니다.
- 정밀도 유지: FP32 누적 연산과
2^15확률 스케일링을 통해 INT8 연산임에도 불구하고 FP64 참조값과 매우 근접한 정확도를 유지합니다. - 분기 제거: Sigmoid 연산에서 분기를 제거함으로써 warp divergence를 방지하고, 특히 prefill 단계에서 연산 효율을 극대화했습니다.
교훈: LLM 추론 최적화에서는 데이터의 메모리 레이아웃을 Tensor-Core가 선호하는 형태로 유지하고, 연산 경로에서 분기를 최소화하는 것이 성능의 핵심입니다.
참고 자료
- torch.compile — 이 PR에서 최적화한 컴파일 함수의 공식 문서
- ONNX Runtime CUDA EP
참고 자료
- https://pytorch.org/docs/stable/generated/torch.compile.html
- https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [onnxruntime] ONNX Runtime: INT4 Paged KV Cache 도입을 통한 메모리 최적화
- [flashinfer] FlashInfer: sm_107a 아키텍처를 위한 Fused Decode List Scorer 프리페칭 최적화
- [onnxruntime] ONNX Runtime CUDA Paged Attention: BF16/INT8 추론 21배 가속 최적화 분석
- [onnxruntime] ONNX Runtime CUDA QMoE 및 FP8 최적화: 성능 향상 및 메모리 효율성 증대
- [onnxruntime] ONNX Runtime CUDA Packed Sparse Attention 최적화: 성능 향상의 비결
PR Analysis 의 다른글
- 이전글 [flashinfer] FlashInfer: Gated DeltaNet 역전파 최적화 분석 (HV=3H 및 Adjoint Pre-scan)
- 현재글 : [onnxruntime] ONNX Runtime: INT8-KV 캐시를 위한 고성능 Tensor-Core DynamicSparseAttention 최적화
- 다음글 [flashinfer] FlashInfer Cake GDN: Blackwell SM107a에서 게이트 스트리밍 프리필 최적화 확장으로 최대 1.12배 성능 향상
댓글