본문으로 건너뛰기

[flashinfer] FlashInfer의 새로운 DeepSeek Sparse Attention(DSA) 훈련 커널 최적화 분석

PR 링크: flashinfer-ai/flashinfer#5704 상태: Merged | 변경: +39226 / -0

들어가며

최근 대규모 언어 모델(LLM)의 훈련에서 Sparse Attention은 연산 효율성을 극대화하기 위한 핵심 기술로 자리 잡았습니다. 특히 DeepSeek 모델에서 사용하는 Sparse MLA(Multi-Head Latent Attention) 구조는 고성능 커널을 요구합니다. 이번 PR(#5657)은 NVIDIA의 CAKE 팀이 개발한 64-query-head DSA(DeepSeek Sparse Attention) 훈련 커널을 FlashInfer에 통합하여, SM100(B200) 및 SM103(GB300) 아키텍처에서 SOTA 성능을 달성하는 것을 목표로 합니다.

코드 분석

1. flashinfer/dsa_sparse_attention.py

이 파일은 사용자에게 노출되는 API 엔트리 포인트입니다. dsa_sparse_attention 및 dsa_sparse_attention_varlen 함수는 @flashinfer_experimental_api 데코레이터를 통해 실험적 기능임을 명시하며, torch.autograd.Function을 통해 역전파(backward)를 지원합니다.

# Before: 해당 기능 부재
# After:
@flashinfer_experimental_api
def dsa_sparse_attention(q_latent, q_rope, kv_latent, k_rope, indices, ...):
    # ... (입력 검증 및 바인딩)
    return dsa_sparse_attention_func.apply(...)

2. flashinfer/experimental/cake_dsa_train/

이 디렉토리에는 커널의 핵심인 cake_backend가 포함되어 있습니다. 특히 주목할 점은 Binding Cache의 도입입니다. 매번 커널을 호출할 때마다 발생하는 오버헤드를 줄이기 위해, 입력 텐서의 메타데이터를 기반으로 실행 계획을 캐싱합니다.

# 실행 계획 바인딩 및 캐싱 로직
if FLASHINFER_CAKE_DSA_TRAIN_BINDING_CACHE:
    key = (data_ptr, shape, stride, dtype)
    if key in cake_backend.BINDING_CACHE:
        return cake_backend.BINDING_CACHE[key]

3. DRAM regime을 위한 Key-range passes

메모리 대역폭 한계(DRAM regime)를 극복하기 위해, FP32 dK/dV 누적기가 L2 캐시를 초과할 경우 커널을 여러 패스로 나누어 실행합니다.

// bwd_main_pass: 키 범위를 나누어 실행하여 L2 캐시 효율 극대화
for (int pass = 0; pass < num_passes; ++pass) {
    bwd_compact(pass_range);
    bwd_main_pass(pass_range, dq_partial);
}

왜 이게 좋은가

이번 최적화는 단순히 커널 속도를 높이는 것을 넘어, 메모리 사용량과 수치적 안정성(Numerical Stability)을 동시에 확보했습니다.

  1. 성능 향상: B200 GPU 기준, 기존 SOTA 대비 훈련 단계(Training Step)에서 약 1.02배에서 1.36배의 속도 향상을 보였습니다. 특히 doc_131072와 같은 대규모 시퀀스에서 성능 우위가 뚜렷합니다.
  2. 메모리 효율성: Binding Cache를 통해 불필요한 할당을 제거하고, key-range passes를 통해 대규모 행렬 연산 시 L2 캐시 미스를 방지했습니다.
  3. 수치적 결정론(Determinism): dq 계산을 행당 한 번 수행하도록 설계하여, 실행 시마다 결과가 달라지는 문제를 해결했습니다.

교훈: 고성능 커널 개발 시, 단순히 연산 커널(Compute Kernel)의 최적화뿐만 아니라, 호스트 측의 바인딩 오버헤드 제거(Binding Cache)와 메모리 계층 구조(L2 Cache)를 고려한 데이터 접근 패턴 최적화가 필수적임을 보여줍니다.

참고 자료

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글