[vllm] vLLM의 GLM-5.3-Flash 성능 최적화: CuTe DSL 기반 Skinny-GEMM 도입
PR 링크: vllm-project/vllm#62956 상태: Merged | 변경: +259 / -3
들어가며
최신 대규모 언어 모델(LLM) 서빙에서 디코딩 단계의 지연 시간(Latency)은 전체 성능을 결정짓는 핵심 요소입니다. 특히 GLM-5.3-Flash와 같은 모델은 어텐션 프로젝션, 공유 전문가(Shared Experts), LM Head 등의 연산이 BF16 GEMV(General Matrix-Vector multiplication)에 크게 의존하며, 기존의 cuBLAS는 이러한 'Skinny'(M이 작은) 행렬 연산에서 최적의 성능을 내지 못하는 경우가 많습니다. 본 PR은 vLLM에서 CuTe DSL을 활용한 Skinny-GEMM 커널을 도입하여, 특정 하드웨어(SM121) 환경에서 디코딩 성능을 15% 이상 개선한 사례를 다룹니다.
코드 분석
1. Skinny-GEMM 계획 정의 (vllm/model_executor/kernels/linear/cute_dsl/skinny_gemm_plans.py)
이 파일은 하드웨어 능력(Capability)과 행렬 형태(N, K)에 따른 최적의 커널 설정을 관리합니다.
# Before: cuBLAS 기반의 일반적인 Linear 연산 사용
# After: 특정 N, K 조합에 대해 최적화된 SkinnyGemmConfig 적용
SM121_SKINNY_GEMM_PLANS: dict[tuple[int, int], SkinnyGemmPlan] = {
(2048, 4096): {
1: SkinnyGemmConfig(1, 32, 1, k_unroll=4, static_k=4096),
2: SkinnyGemmConfig(2, 64, 1, k_unroll=4, vector_width=4, static_k=4096),
},
# ...
}
2. 레이어 최적화 적용 (vllm/model_executor/layers/utils.py)
maybe_use_skinny_gemm 함수를 통해 특정 레이어가 Skinny-GEMM을 사용할 수 있는지 판단하고, cuda_unquantized_gemm에서 이를 실제 커널 호출로 연결합니다.
# Before: 항상 F.linear 사용
# After: 조건 충족 시 커스텀 연산 호출
def cuda_unquantized_gemm(...):
if bias is None and getattr(layer, "use_skinny_gemm", False) and x.is_cuda:
return torch.ops.vllm.cuda_skinny_unquantized_gemm(x, weight)
return torch.nn.functional.linear(x, weight, bias)
왜 이게 좋은가
이번 최적화의 핵심은 '범용 라이브러리(cuBLAS)에서 특화된 커널(CuTe DSL)로의 전환'입니다.
- 성능 수치: Concurrency 1 환경에서 TPOT(Time Per Output Token)이 64.0ms에서 54.1ms로 약 15% 감소했습니다. 특히 M=1인 상황에서 cuBLAS 대비 최대 1.73배의 속도 향상을 보였습니다.
- 범용성: 코드 리뷰 과정에서 논의된 바와 같이, 모델별로 파편화되어 있던 로직을
vllm/model_executor/layers/utils.py로 일반화하여 향후 다른 모델에서도 쉽게 재사용할 수 있도록 리팩토링되었습니다. - 교훈: LLM 서빙에서 'Skinny GEMM'은 메모리 대역폭과 연산 효율 사이의 병목을 해결하는 핵심입니다. 하드웨어의 특성(SM121)에 맞춰 블록 사이즈와 벡터 폭을 튜닝하는 것은 단순한 라이브러리 호출보다 훨씬 강력한 성능 이득을 가져옵니다.
리뷰어 피드백 반영
리뷰어들은 단순히 성능 개선뿐만 아니라, 유지보수성을 위해 다음 사항들을 요구했습니다.
- 테스트 코드:
test_bf16_skinny_gemm.py를 통해 모든 계획(Plan)이 유효한지, 레이어 마킹이 정확한지 검증하는 유닛 테스트를 추가했습니다. - 리팩토링: 모델별로 흩어져 있던 로직을 공통 모듈로 이동시켜 코드 중복을 제거했습니다.
이러한 체계적인 접근은 vLLM과 같은 대규모 오픈소스 프로젝트에서 성능과 안정성을 동시에 확보하는 모범 사례를 보여줍니다.
참고 자료
- https://pytorch.org/docs/stable/generated/torch.nn.functional.linear.html
- https://github.com/vllm-project/vllm
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [vllm] vLLM, Qwen 3.8B 모델의 성능을 3배까지 향상시킨 최적화 분석
- 현재글 : [vllm] vLLM의 GLM-5.3-Flash 성능 최적화: CuTe DSL 기반 Skinny-GEMM 도입
- 다음글 [flashinfer] FlashInfer: Gated DeltaNet 역전파 최적화 분석 (HV=3H 및 Adjoint Pre-scan)
댓글