전문가 병렬 배포

전문가 병렬 배포 (Expert Parallel Deployment)

MoE(Mixture-of-Experts) 모델은 전문가(expert)라고 불리는 여러 작은 네트워크로 구성돼요. 전문가 병렬(Expert Parallelism, EP)은 이 전문가들을 서로 다른 GPU에 배치해서, 지역성과 효율성, 전반적인 처리량을 높이는 기법이에요. 특히 데이터 병렬과 함께 쓸 때 시너지가 커요. 이 페이지에서 자세히 알아볼게요.

출처: vLLM 공식 문서 — serving/expert_parallel_deployment

vLLM은 EP를 지원해요. MoE 모델의 전문가를 별도 GPU에 배치해 지역성·효율성·전반적 처리량을 높이죠. EP는 보통 데이터 병렬(DP)과 함께 쓰여요. DP는 EP 없이도 독립적으로 쓸 수 있지만, EP는 DP와 함께 쓸 때 더 효율적이에요. 데이터 병렬에 대한 자세한 내용은 여기를 참고하세요.

사전 요구사항 (Prerequisites)

EP를 쓰기 전에 필요한 의존성을 설치해야 해요. vLLM 쪽에서 이를 더 쉽게 만들기 위해 노력 중이에요.

분리 서빙(disaggregated serving) 의 경우 install_gdrcopy.sh 스크립트로 gdrcopy를 설치하세요 (예: install_gdrcopy.sh "${GDRCOPY_OS_VERSION}" "12.8" "x64"). 사용 가능한 OS 버전은 여기에서 찾을 수 있어요.

백엔드 선택 가이드 (Backend Selection Guide)

vLLM은 EP용 통신 백엔드를 여러 개 제공해요. --all2all-backend로 선택하세요.

백엔드 사용 사례 특징 가장 적합한 경우
deepep_high_throughput 멀티노드 prefill 연속 레이아웃의 Grouped GEMM, prefill 최적화 Prefill 위주 워크로드, 고처리량 시나리오
deepep_low_latency 멀티노드 decode CUDA graph 지원, masked 레이아웃, decode 최적화 Decode 위주 워크로드, 저지연 시나리오
flashinfer_nvlink_one_sided MNNVL 시스템 FlashInfer의 일방향 A2A 전략, 멀티노드 NVLink 고처리량 워크로드
flashinfer_nvlink_two_sided MNNVL 시스템 FlashInfer의 양방향 A2A 전략, 멀티노드 NVLink 노드 간 NVLink가 있는 시스템

단일 노드 배포 (Single Node Deployment)

설정 (Configuration)

--enable-expert-parallel 플래그로 EP를 켜요. EP 크기는 자동으로 계산돼요.

EP_SIZE = TP_SIZE × DP_SIZE

여기서:

  • TP_SIZE: Tensor parallel 크기
  • DP_SIZE: Data parallel 크기
  • EP_SIZE: Expert parallel 크기 (자동 계산)

EP 활성화 시 레이어 동작 (Layer Behavior with EP Enabled)

EP를 켜면 MoE 모델의 서로 다른 레이어가 다르게 동작해요.

레이어 유형 동작 사용되는 병렬화
전문가(MoE) 레이어 모든 EP rank에 걸쳐 샤딩 크기 TP × DP의 Expert Parallel (EP)
어텐션 레이어 TP 크기에 따라 다름 아래 참고

어텐션 레이어 병렬화:

  • TP = 1일 때: 어텐션 가중치가 모든 DP rank에 복제돼요 (데이터 병렬).
  • TP > 1일 때: 각 DP 그룹 안의 TP rank에 걸쳐 어텐션 가중치가 tensor 병렬로 샤딩돼요.

예를 들어 TP=2, DP=4 (총 8개 GPU)일 때:

  • 전문가 레이어는 크기 8의 EP 그룹을 형성하고, 전문가가 모든 GPU에 분산돼요.
  • 어텐션 레이어는 4개의 각 DP 그룹 안에서 TP=2를 사용해요.

데이터 병렬 배포와의 핵심 차이: --enable-expert-parallel이 없으면 MoE 레이어는 tensor 병렬(크기 TP × DP의 TP 그룹 형성)을 사용해요. dense 모델과 유사하죠. EP를 켜면 전문가 레이어가 expert 병렬로 전환돼, MoE 모델에 더 나은 효율성과 지역성을 제공할 수 있어요.

예시 명령 (Example Command)

다음 명령은 DeepSeek-V3-0324 모델을 1-way tensor 병렬, 8-way (어텐션) 데이터 병렬, 8-way expert 병렬로 서브해요. 어텐션 가중치는 모든 GPU에 복제되고, 전문가 가중치는 GPU들에 분산돼요.

8개 GPU가 있는 H200(또는 H20) 노드에서 작동해요. H100이라면 더 작은 모델을 서브하거나 멀티노드 배포 섹션을 참고하세요.

# Single node EP deployment
vllm serve deepseek-ai/DeepSeek-V3-0324 \
    --tensor-parallel-size 1 \       # Tensor parallelism across 1 GPU
    --data-parallel-size 8 \         # Data parallelism across 8 processes
    --enable-expert-parallel         # Enable expert parallelism

멀티노드 배포 (Multi-Node Deployment)

멀티노드 배포에는 DeepEP 통신 커널을 두 모드 중 하나로 사용해요 (위 백엔드 선택 가이드 참고).

예시: 2-노드 배포 (Example: 2-Node Deployment)

다음 예시는 deepep_low_latency 모드로 2개 노드에 DeepSeek-V3-0324를 배포해요.

# Node 1 (Primary - handles incoming requests)
vllm serve deepseek-ai/DeepSeek-V3-0324 \
    --all2all-backend deepep_low_latency \
    --tensor-parallel-size 1 \               # TP size per node
    --enable-expert-parallel \               # Enable EP
    --data-parallel-size 16 \                # Total DP size across all nodes
    --data-parallel-size-local 8 \           # Local DP size on this node (8 GPUs per node)
    --data-parallel-address 192.168.1.100 \  # Replace with actual IP of Node 1
    --data-parallel-rpc-port 13345 \         # RPC communication port, can be any port
    ...
# Node 2 (Secondary - worker only)
vllm serve deepseek-ai/DeepSeek-V3-0324 \
    --all2all-backend deepep_low_latency \
    --tensor-parallel-size 1 \               # TP size per node
    --enable-expert-parallel \               # Enable EP
    --data-parallel-size 16 \                # Total DP size across all nodes
    --data-parallel-size-local 8 \           # Local DP size on this node
    --data-parallel-start-rank 8 \           # Starting rank offset for this node
    --data-parallel-address 192.168.1.100 \  # IP of primary node (Node 1)
    --data-parallel-rpc-port 13345 \         # Same RPC port as primary
    --headless                               # No API server, worker only

핵심 설정 노트 (Key Configuration Notes)

  • Headless 모드: 보조 노드는 --headless 플래그로 실행돼요. 즉 모든 클라이언트 요청은 primary 노드가 처리해요.
  • Rank 계산: --data-parallel-start-rank는 이전 노드의 누적 로컬 DP 크기와 같아야 해요.
  • 부하 확장: 더 높은 요청 부하를 처리하려면 primary 노드에서 --api-server-count를 조절하세요.

네트워크 설정 (Network Configuration)

InfiniBand 클러스터에서 초기화가 멈추는 걸 방지하려면 이 환경 변수를 설정하세요.

export GLOO_SOCKET_IFNAME=eth0

이러면 초기 설정에 torch 분산 그룹 발견이 InfiniBand 대신 Ethernet을 쓰도록 해요.

전문가 병렬 로드 밸런서 (Expert Parallel Load Balancer, EPLB)

MoE 모델은 보통 각 전문가가 비슷한 수의 토큰을 받도록 학습되지만, 실제로는 전문가 간 토큰 분포가 크게 치우칠 수 있어요. vLLM은 EPLB로 전문가 매핑을 EP rank에 걸쳐 재분배해서 전문가 간 부하를 고르게 해요.

설정 (Configuration)

--enable-eplb 플래그로 EPLB를 켜요. 켜면 vLLM이 매 forward pass마다 부하 통계를 수집하고 주기적으로 전문가 분포를 재균형화해요.

EPLB 파라미터 (EPLB Parameters)

EPLB는 JSON 문자열을 받는 --eplb-config 인자로 설정해요. 사용 가능한 키와 설명은 다음과 같아요.

예를 들어:

vllm serve Qwen/Qwen3-30B-A3B \
  --enable-eplb \
  --eplb-config '{"window_size":1000,"step_interval":3000,"num_redundant_experts":2,"log_balancedness":true}'

점 표기법으로도 설정할 수 있어요.

vllm serve Qwen/Qwen3-30B-A3B \
        --enable-eplb \
        --eplb-config.window_size 1000 \
        --eplb-config.step_interval 3000 \
        --eplb-config.num_redundant_experts 2 \
        --eplb-config.log_balancedness true

예시 명령 (Example Command)

# Single node with EPLB load balancing
vllm serve deepseek-ai/DeepSeek-V3-0324 \
    --tensor-parallel-size 1 \       # Tensor parallelism
    --data-parallel-size 8 \         # Data parallelism
    --enable-expert-parallel \       # Enable EP
    --enable-eplb \                  # Enable load balancer
    --eplb-config '{"window_size":1000,"step_interval":3000,"num_redundant_experts":2,"log_balancedness":true}'

고급 설정 (Advanced Configuration)

문제 해결 (Troubleshooting)

각 GPU 노드에서 tools/ep_kernels/configure_system_drivers.sh를 실행하고 재부팅하세요. NVSHMEM API called before NVSHMEM initialization has completed 오류도 고쳐줘요.

  • NVSHMEM peer disconnect: 보통 네트워킹 설정 문제예요. Kubernetes로 배포한다면, 모든 pod이 hostNetwork: true, securityContext.privileged: true로 실행돼 Infiniband에 접근할 수 있는지 확인하세요.

벤치마킹 (Benchmarking)

시뮬레이터 플래그 VLLM_MOE_ROUTING_SIMULATION_STRATEGY=uniform_randomVLLM_RANDOMIZE_DP_DUMMY_INPUTS=1를 사용해 토큰 라우팅이 EP rank에 걸쳐 균형 잡히게 하세요.

분리 서빙 (Prefill/Decode 분리) (Disaggregated Serving)

클라이언트 오케스트레이션 예시 (Client Orchestration Example)

prefill 인스턴스에서는 "do_remote_prefill": False, "remote_engine_id": None(vLLM이 채움), "remote_block_ids": None(vLLM이 채움) 같은 필드를 사용해요.

더 알아보기 (Learn more)