[flashinfer] FlashInfer의 새로운 TGV GEMM 백엔드: CuTeDSL을 활용한 Blackwell 최적화
PR 링크: flashinfer-ai/flashinfer#3281 상태: Merged | 변경: +1527 / -68
들어가며
최신 GPU 아키텍처인 Blackwell(SM100) 환경에서 GEMM(General Matrix Multiply) 연산의 지연 시간을 최소화하는 것은 LLM 추론 성능의 핵심입니다. 이번 FlashInfer 업데이트에서는 기존 C++ 기반의 TGV(Train à Grande Vitesse) 커널을 CuTeDSL(cute_ext)로 포팅하여 flashinfer.mm_bf16 및 bmm_bf16의 기본 백엔드로 통합했습니다. 이 변경사항은 특히 중소 규모 배치에서 발생하는 DRAM 대역폭 병목을 해결하고, 2-CTA(Cooperative Thread Array) 모드를 통해 SMEM 활용도를 극대화하는 것을 목표로 합니다.
코드 분석
1. flashinfer/gemm/gemm_base.py: 통합 러너 및 디스패치 로직
기존 C++ 커널과 새로운 cute_ext 구현체 사이의 유연한 전환을 위해 통합 러너가 도입되었습니다. _TGV_DEBUG_USE_CPP 플래그를 통해 디버깅 및 벤치마킹 목적으로 C++ 백엔드를 강제할 수 있습니다.
# Before: C++ 기반의 단일 경로만 존재
# After: cute_ext와 C++ 간의 동적 디스패치 지원
_TGV_DEBUG_USE_CPP: bool = False
@functools.cache
def _tgv_gemm_runner(dtype: torch.dtype, use_sm_100f: bool):
# ... (중략)
class TGVRunner(TunableRunner):
def forward(self, inputs, tactic=-1, ...):
if _TGV_DEBUG_USE_CPP and a.dim() == 2:
return _get_cpp_runner().forward(...)
from .kernels.tgv_gemm_cute_ext import run_tgv_cute_ext
return run_tgv_cute_ext(a, b, bias, out, bool(pdl), tactic)
2. flashinfer/gemm/kernels/tgv_gemm_cute_ext.py: CuTeDSL 커널 구현
핵심은 2-CTA 모드의 도입입니다. 이는 2x1 클러스터를 사용하여 두 개의 CTA가 하나의 타일을 공동으로 연산함으로써, SMEM 용량을 224KB 수준까지 극한으로 활용합니다.
# 2-CTA 모드 핵심 로직
# SM100_TMA_LOAD_2SM을 통해 peer CTA의 로드 완료 신호를 리더 CTA로 전달
if use_2cta:
# 2x1 cluster, CtaGroup.TWO
# leader-only k-loop, multicast commits (mask=0b11)
# TMEM alloc/dealloc with is_two_cta=True
왜 이게 좋은가
이번 최적화의 핵심은 PDL(Pipeline Data Loading)과 2-CTA 모드의 결합입니다.
- 성능 향상: 벤치마크 결과, PDL을 적용한 TGV는 모든 형상(shape)에서 cuBLAS 대비 1.11배에서 최대 2.17배의 성능 향상을 보였습니다. 특히 작은 배치 사이즈에서 대역폭 병목을 효과적으로 제거합니다.
- SMEM 효율성: 29개의 커스텀 전술(tactic) 테이블을 통해
cta_m,cta_n조합을 최적화하여 SM100의 228KB SMEM 예산을 98%까지 활용합니다. - 교훈: 하드웨어 가속기(TMA, mbarrier)를 직접 제어하는 CuTeDSL을 사용하면, 고정된 라이브러리(cuBLAS)가 대응하기 어려운 특정 추론 워크로드에 대해 훨씬 더 세밀한 튜닝이 가능합니다.
리뷰 과정에서 논의된 바와 같이, 2-CTA 모드는 DRAM 지연 시간에 민감한 중간 배치 사이즈(BS 32/64)에서 가장 큰 효과를 발휘하며, 이는 현대적인 LLM 추론 엔진이 지향해야 할 방향성을 잘 보여줍니다.
References
- CuTe Documentation — CuTeDSL 및 커널 프로그래밍 관련 공식 자료
참고 자료
- https://github.com/NVIDIA/cutlass/tree/main/test/unit/cute
- https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#tma-descriptor
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [flashinfer] FlashInfer의 BF16 GEMM 성능 극대화: CUDA Graph와 Cold L2 Cache 도입
- [flashinfer] FlashInfer의 TRTLLM-Gen MoE 라우팅 최적화: 레지스터 압박 해소와 성능 극대화
- [flashinfer] FlashInfer MLA 커널 최적화: num_heads < 128 환경에서의 성능 극대화
- [sglang] SGLang의 FP4 GEMM 성능 최적화: CuTe DSL 백엔드 도입
- [flashinfer] FlashInfer, MoE 및 FP8 GEMM 성능 향상을 위한 커널 업데이트
PR Analysis 의 다른글
- 이전글 [sglang] SGLang: performance_mode=speed에서 torch.compile 기본 활성화로 성능 최적화
- 현재글 : [flashinfer] FlashInfer의 새로운 TGV GEMM 백엔드: CuTeDSL을 활용한 Blackwell 최적화
- 다음글 [uv] Interning을 통한 uv의 Simple API 파싱 최적화: 메모리와 속도 두 마리 토끼 잡기
댓글