본문으로 건너뛰기

[vllm] vLLM Elastic EP의 CUDA Graph 재사용을 통한 리컨피규레이션 다운타임 97% 절감

PR 링크: vllm-project/vllm#54985 상태: Merged | 변경: +372 / -270

들어가며

vLLM의 Elastic Expert Parallelism(EP)은 클러스터 규모가 변할 때(Scale-up/down) 유연하게 대응할 수 있게 해주지만, 기존에는 리컨피규레이션 과정에서 CUDA Graph를 매번 재캡처하고 커널을 웜업하는 과정이 필요했습니다. 이로 인해 서비스가 일시적으로 중단되는 'Downtime'이 발생했습니다. 본 PR은 NIXL EP를 활용하여 기존 랭크(Rank)의 CUDA Graph와 런타임 상태를 재사용하고, 새로운 랭크의 웜업을 백그라운드에서 처리함으로써 이 문제를 해결했습니다.

코드 분석

1. NIXL EP 버퍼 상태 관리 및 재사용

기존에는 리컨피규레이션마다 모든 것을 새로 초기화했으나, 이제는 _NixlEPBufferState를 통해 메모리 주소를 유지합니다.

# vllm/distributed/device_communicators/all2all.py
@dataclass
class _NixlEPBufferState:
    buffer: Any
    max_num_ep_ranks: int
    connected_ep_size: int
    active_ep_size: int

이 구조체를 통해 기존 랭크의 fused-MoE 런타임과 CUDA Graph가 유지되며, EPLB 매핑 및 디스패치 출력 버퍼의 메모리 주소가 보존됩니다.

2. EPLB 매핑의 동적 리사이징

물리적 전문가(Physical Expert) 수가 변경될 때, 전체를 새로 할당하는 대신 미리 할당된 버퍼 내에서 뷰(View)를 조정합니다.

# vllm/distributed/eplb/eplb_state.py (Before -> After)
- state.physical_to_logical_map = phy2log
+ state.physical_to_logical_map_buffer = (phy2log if phy2log_storage is None else phy2log_storage)

이러한 변경을 통해 data_ptr()를 유지하며 메모리 재할당 비용을 제거했습니다.

왜 이게 좋은가

이 최적화의 핵심은 '상태의 지속성(Persistence)'입니다. 기존에는 리컨피규레이션 시점에 모든 CUDA Graph를 파괴하고 다시 생성(Recapture)해야 했기에 수십 초의 지연이 발생했습니다.

성능 개선 수치

DeepSeek-V3 모델을 16개에서 24개 GPU로 확장할 때, 기존 40.266초였던 다운타임이 1.019초로 약 97.5% 감소했습니다. 이는 실시간 서빙 환경에서 리컨피규레이션이 사용자 경험에 미치는 영향을 거의 무시할 수 있는 수준으로 낮췄음을 의미합니다.

교훈

  1. 메모리 주소 고정: CUDA Graph는 텐서의 메모리 주소에 의존합니다. 리컨피규레이션 시 버퍼를 재할당하지 않고 미리 확보된 공간을 재사용하는 전략은 그래프 재캡처를 피하는 가장 효과적인 방법입니다.
  2. 백그라운드 웜업: 새로운 랭크가 준비되는 동안 기존 랭크가 서비스를 지속하게 함으로써 가용성을 극대화했습니다.
  3. 리뷰 피드백 반영: 리뷰 과정에서 storage라는 모호한 명칭을 buffer로 변경하고, OOB(Out-of-Bounds) 접근 가능성을 검토하는 등 코드의 안정성을 높이는 논의가 활발히 이루어졌습니다.

결론

이번 PR은 vLLM의 Elastic EP가 단순한 기능적 확장을 넘어, 프로덕션 환경에서 요구되는 고가용성을 확보했음을 보여줍니다. 특히 CUDA Graph 재사용 전략은 분산 추론 시스템에서 리컨피규레이션 오버헤드를 줄이는 표준적인 패턴이 될 것입니다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글