본문으로 건너뛰기

[vllm] vLLM MoE 성능 최적화: flashinfer_nvlink_one_sided 도입

PR 링크: vllm-project/vllm#53311 상태: Merged | 변경: +7 / -3

들어가며

최근 대규모 언어 모델(LLM) 서빙에서 Mixture-of-Experts(MoE) 모델의 비중이 커짐에 따라, 전문가 간 통신(Expert Parallelism)의 효율성이 전체 추론 성능을 결정짓는 핵심 요소가 되었습니다. 특히 분산 환경에서의 All-to-All 통신은 병목 현상이 발생하기 쉬운 구간입니다. 이번 vLLM 업데이트에서는 기존의 allgather_reducescatter 방식을 대신하여, 고성능 NVLink 환경에 최적화된 flashinfer_nvlink_one_sided를 기본 백엔드로 채택함으로써 성능을 극대화했습니다.

코드 분석

1. ParallelConfig 설정 변경 (vllm/config/parallel.py)

가장 직접적인 변화는 기본 백엔드 설정의 변경입니다. 기존에는 범용적인 allgather_reducescatter가 사용되었으나, 이를 flashinfer_nvlink_one_sided로 변경하여 NVLink의 대역폭을 더 효율적으로 활용하도록 했습니다.

Before:

all2all_backend: All2AllBackend = "allgather_reducescatter"

After:

all2all_backend: All2AllBackend = "flashinfer_nvlink_one_sided"

이 변경은 단순히 기본값을 바꾸는 것을 넘어, FlashInfer가 제공하는 고성능 커널을 우선적으로 사용하도록 유도합니다.

2. 메모리 관리 최적화 (vllm/distributed/device_communicators/all2all.py)

FlashInfer의 NVLink 워크스페이스를 초기화하기 전에 메모리 캐시를 비워주는 로직이 추가되었습니다. 이는 메모리 단편화 문제를 방지하고, 대규모 통신 버퍼를 안정적으로 할당하기 위한 필수적인 조치입니다.

After:

# Release cached allocator blocks before FlashInfer reserves the
# symmetric MNNVL fabric workspace.
torch.accelerator.empty_cache()

왜 이게 좋은가

이번 최적화는 실제 벤치마크를 통해 그 가치를 증명했습니다. Qwen3.5 397B 모델을 GB200 클러스터에서 구동했을 때, flashinfer_nvlink_one_sided는 기존 대비 다음과 같은 성능 향상을 보였습니다.

  • Aggregated Serving (Prefill-only): 총 토큰 처리량(Total Token Throughput) +6.4% 향상.
  • Disaggregated Serving: 총 토큰 처리량 +8% 향상 및 디코드 엔드투엔드 속도 향상.

교훈:

  1. 하드웨어 가속기 활용: 범용 통신 라이브러리보다 특정 하드웨어(NVLink)의 특성을 고려한 전용 커널(FlashInfer)이 압도적인 성능을 냅니다.
  2. 메모리 관리의 중요성: 고성능 커널을 도입할 때는 torch.cuda.empty_cache()와 같은 메모리 관리 전략이 병행되어야 안정적인 초기화가 가능합니다.
  3. 벤치마크 기반 의사결정: 단순 이론적 성능이 아닌, 실제 서빙 시나리오(Aggregated vs Disaggregated)에서의 수치를 바탕으로 기본값을 변경하는 것이 운영 환경에서 매우 중요합니다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글