본문으로 건너뛰기

[vllm] vLLM의 Sequence Parallelism 최적화: DP 의존성 제거를 통한 성능 향상

PR 링크: vllm-project/vllm#47070 상태: Merged | 변경: +33 / -22

들어가며

vLLM은 고성능 추론 엔진으로서 다양한 병렬 처리 기법을 지원합니다. 기존 vLLM의 MoE(Mixture of Experts) 모델 구조에서는 Sequence Parallelism을 활성화하기 위해 반드시 Data Parallelism(DP)이 함께 구성되어야 한다는 제약이 있었습니다. 이는 DP가 없는 환경에서도 Sequence Parallelism을 통해 MoE의 연산 효율을 높이고자 하는 사용자들에게 불필요한 리소스 낭비와 복잡성을 야기했습니다. 본 PR은 이러한 DP 의존성을 제거하여, DP 없이도 Sequence Parallelism을 독립적으로 사용할 수 있도록 개선했습니다.

코드 분석

1. 설정 및 조건문 완화 (vllm/config/parallel.py)

기존에는 use_sequence_parallel_moe 속성이 data_parallel_size > 1을 강제했습니다. 이를 제거하여 DP 구성과 무관하게 Sequence Parallelism을 활성화할 수 있도록 변경했습니다.

# Before
def use_sequence_parallel_moe(self) -> bool:
    return (
        self.is_moe_model
        and self.enable_expert_parallel
        and self.tensor_parallel_size > 1
        and self.data_parallel_size > 1
    )

# After
def use_sequence_parallel_moe(self) -> bool:
    return (
        self.is_moe_model
        and self.enable_expert_parallel
        and self.tensor_parallel_size > 1
    )

2. 통신 관리자 초기화 로직 수정 (vllm/distributed/device_communicators/base_device_communicator.py)

All2All 통신 관리자가 DP 환경에서만 초기화되던 문제를 수정하여, Sequence Parallelism을 사용하는 경우에도 정상적으로 초기화되도록 변경했습니다.

# After
use_ep = (
    config.parallel_config.data_parallel_size > 1
    or config.parallel_config.use_sequence_parallel_moe
)

3. 모델 실행 컨텍스트 및 패딩 로직 (vllm/model_executor/models/deepseek_v2.py)

Sequence Parallelism 사용 시 텐서 크기가 TP(Tensor Parallel) 크기로 나누어떨어지지 않을 경우를 대비한 패딩 로직을 간결하게 개선했습니다.

# After
sp_pad = (-hidden_states.shape[0]) % tp_world_size
hidden_states = torch.nn.functional.pad(hidden_states, (0, 0, 0, sp_pad))

왜 이게 좋은가

이번 최적화의 핵심은 '불필요한 제약 조건의 제거'입니다. 기존에는 Sequence Parallelism을 쓰기 위해 강제로 DP를 설정해야 했고, 이는 중복된 통신과 메모리 오버헤드를 발생시켰습니다.

  1. 성능 향상: 벤치마크 결과, E2E Throughput이 약 1.9%에서 5.0%까지 향상되었습니다. 이는 DP 관련 오버헤드가 제거되면서 통신 효율이 개선되었기 때문입니다.
  2. 유연성: DP 구성이 어려운 환경에서도 MoE 모델의 Expert Parallelism을 효율적으로 활용할 수 있게 되었습니다.
  3. 교훈: 분산 시스템 설계 시, 특정 기능(Sequence Parallel)을 다른 기능(Data Parallel)에 강하게 결합(Coupling)하는 것은 확장성을 저해합니다. 의존성을 분리함으로써 더 넓은 범위의 하드웨어 구성에서 최적의 성능을 낼 수 있습니다.

리뷰어 피드백

리뷰 과정에서 CI 환경의 에러를 해결하기 위해 추가적인 PR이 병합되었습니다. 이는 복잡한 분산 환경에서 여러 병렬 기법이 섞일 때 발생할 수 있는 엣지 케이스(Edge Case)를 관리하는 것이 얼마나 중요한지 보여줍니다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글