본문으로 건너뛰기

[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);
}

왜 이게 좋은가

  1. 성능 향상: H200 GPU 기준, Tensor-Core decode 커널은 기존 CUDA-core 커널 대비 3.3배에서 5.6배 더 빠릅니다. prefill 커널 또한 2.7~3.0배의 성능 향상을 보입니다.
  2. 정밀도 유지: FP32 누적 연산과 2^15 확률 스케일링을 통해 INT8 연산임에도 불구하고 FP64 참조값과 매우 근접한 정확도를 유지합니다.
  3. 분기 제거: Sigmoid 연산에서 분기를 제거함으로써 warp divergence를 방지하고, 특히 prefill 단계에서 연산 효율을 극대화했습니다.

교훈: LLM 추론 최적화에서는 데이터의 메모리 레이아웃을 Tensor-Core가 선호하는 형태로 유지하고, 연산 경로에서 분기를 최소화하는 것이 성능의 핵심입니다.

참고 자료

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글