[vllm] vLLM 컴파일 최적화: Transformers 모델을 위한 FusedAddRMSNorm 도입
PR 링크: vllm-project/vllm#48757 상태: Merged | 변경: +298 / -2
들어가며
최신 대규모 언어 모델(LLM)의 추론 성능을 극대화하기 위해 vLLM은 torch.compile 기반의 컴파일 파이프라인을 적극적으로 활용하고 있습니다. 하지만 Transformers 기반 모델들은 구조적으로 residual add와 RMSNorm을 별도의 연산으로 수행하는 경우가 많습니다. 이로 인해 메모리 대역폭을 낭비하게 되고, 이후 이어지는 연산들과의 융합(fusion) 기회를 놓치는 문제가 발생합니다. 본 PR은 이러한 연산들을 fused_add_rms_norm으로 정규화(canonicalize)하고, 중간에 끼어든 reshape 연산을 최적화하여 전체적인 추론 성능을 개선합니다.
코드 분석
1. vllm/compilation/passes/fusion/add_rms_fusion.py
핵심은 VllmPatternReplacement를 사용하여 기존의 분리된 연산 패턴을 하나의 융합된 연산으로 교체하는 것입니다.
Before (분리된 연산):
residual_out = residual + branch if self.residual_first else branch + residual
rms = vllm.ir.ops.rms_norm(residual_out, weight, self.epsilon)
After (융합된 연산):
return vllm.ir.ops.fused_add_rms_norm(branch, residual, weight, self.epsilon)
또한, RMSNormReshapeFusionPass를 통해 RMSNorm 이후의 reshape 연산을 앞으로 이동시켜, fused_add_rms_norm이 더 넓은 범위의 패턴과 매칭될 수 있도록 했습니다. 이는 특히 AllReduce + RMSNorm과 같은 복합 패턴을 발견하는 데 결정적인 역할을 합니다.
2. vllm/compilation/passes/pass_manager.py
새롭게 정의된 패스들을 PassManager에 등록하여 컴파일 시점에 자동으로 적용되도록 했습니다. 특히 model_config.using_transformers_backend()를 통해 Transformers 기반 모델에서만 이 최적화가 활성화되도록 게이트를 설정했습니다.
if enable_transformers_norm_canonicalization:
self.passes += [AddRMSNormFusionPass(config)]
# ...
self.passes += [RMSNormReshapeFusionPass(config)]
왜 이게 좋은가
이 최적화는 메모리 접근 횟수를 획기적으로 줄여줍니다. Add와 RMSNorm을 별도로 수행하면 중간 결과값을 메모리에 쓰고 다시 읽어야 하지만, 융합된 커널은 레지스터 수준에서 이를 처리합니다.
- 성능 수치: Qwen3-32B-FP8 모델(8xH100, TP8) 환경에서 출력 토큰 처리량이 +18.3% 증가하고, TPOT(Time Per Output Token)가 -15.7% 감소하는 놀라운 성과를 보였습니다.
- 교훈: 컴파일러 최적화에서 '패턴 매칭'의 순서는 매우 중요합니다.
AR+RMS융합이RMS+Quant보다 우선순위를 가짐으로써 더 큰 병목을 해결할 수 있었으며, 중간의reshape와 같은 사소한 연산을 정규화하는 것만으로도 전체 그래프의 융합 가능성을 크게 높일 수 있음을 보여줍니다.
리뷰어 피드백 반영
리뷰 과정에서 branch + residual과 residual + branch 순서에 상관없이 융합이 가능하도록 일반화하는 논의가 있었으며, 이는 AddRMSNormPattern 클래스에서 residual_first 파라미터를 통해 구현되었습니다. 또한, 컴파일 시간 증가(약 70%)라는 트레이드오프가 있지만, 추론 성능 향상폭이 이를 충분히 상쇄한다는 점이 확인되었습니다.
참고 자료
- https://pytorch.org/docs/stable/generated/torch.compile.html
- https://docs.vllm.ai/en/latest/models/engine_args.html
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [vllm] vLLM Transformers Modeling Backend 성능 최적화: 네이티브 수준의 속도 달성
- [ACE-Step-1.5] 외부 의존성을 걷어내고 성능을 잡다: ACE-Step 1.5의 커스텀 vLLM 엔진 도입기
- [vllm] vLLM에 Dots3 NOTE 모델 네이티브 지원 추가: 멀티모달 및 하이브리드 MLA 최적화
- [transformers] Hugging Face Transformers: NoRepeatNGramLogitsProcessor 벡터화 및 성능 최적화
- [vllm] vLLM Triton 커널 최적화: tl.constexpr 제거를 통한 JIT 컴파일 오버헤드 해결
PR Analysis 의 다른글
- 이전글 [flashinfer] FlashInfer, MoE 모델의 성능을 극적으로 향상시키는 융합 커널과 최적화된 스케줄러 도입
- 현재글 : [vllm] vLLM 컴파일 최적화: Transformers 모델을 위한 FusedAddRMSNorm 도입
- 다음글 [vllm] vLLM DeepSeek V4 모델의 불필요한 메모리 할당 및 복사 최적화 분석
댓글