为 vLLM 推理服务启用 Expert Parallel

简介

本文档展示了一个单节点、以 YAML 为先的入门示例,用于在 InferenceService 中启用 vLLM Expert Parallel (EP)

Expert Parallel 是 vLLM 上游为 Mixture-of-Experts (MoE) 模型提供的一项能力。它在 vLLM 中仍然处于 experimental 状态,相关参数名称或默认值可能会在未来版本中发生变化。

WARNING

本页面重点介绍一个用于快速上手 Expert Parallel 的单节点配置示例。有关性能调优、容量规划以及分布式部署的详细信息,请参阅官方 vLLM 文档。

何时使用 Expert Parallel

当你正在提供 MoE 模型服务,并且希望 vLLM 将 expert 层切分到各个 GPU 上,而不是依赖默认的 expert 层分组行为时,Expert Parallel 就会派上用场。

对于单节点部署,上游 vLLM 的模式如下:

  • 使用 --enable-expert-parallel 启用 EP。
  • 保持示例运行在单个 node 上。
  • 使用 --data-parallel-size 覆盖该 node 上的 GPU。
  • 在本示例中使用 --tensor-parallel-size 1,这样 attention 层会在 data parallel ranks 之间保持复制,而不是通过 tensor parallelism 进行切分。

如果你提供的是 dense 模型,或者当前运行时镜像不包含上游 vLLM 所需的 EP 相关依赖,那么本指南并不是合适的起点。

前提条件和限制

  • 你可以访问已安装 KServe 的 Kubernetes 集群。
  • 你有一个可以创建 InferenceService 资源的 namespace。
  • 你已经在平台上可用一个 vLLM 服务运行时。
  • 你使用的运行时镜像已经包含 vLLM EP 所需的上游依赖。
  • 你的模型是 MoE 模型,并且已经可通过配置的 storageUri 被服务访问。
  • 你的目标 node 上有多个可见 GPU。本示例使用检测到的 GPU 数量作为单节点 data parallel size。

如果你当前的 vLLM 镜像尚未包含所需的 EP 依赖,请先扩展或重建运行时镜像。有关平台相关的运行时自定义,请参阅 Extend Inference Runtimes。有关上游依赖列表和后端指导,请参阅 References 中的官方 vLLM EP 部署指南。

EP 配置概览

通过添加 --enable-expert-parallel 标志来启用 EP。在上游 vLLM 中,expert parallel size 会自动计算:

EP_SIZE = TP_SIZE x DP_SIZE

其中:

  • TP_SIZE:tensor parallel size
  • DP_SIZE:data parallel size
  • EP_SIZE:expert parallel size,由 vLLM 自动计算

这意味着你不需要单独设置 EP size 参数。相反,你只需要选择 tensor parallel size 和 data parallel size,vLLM 会根据这些设置推导出实际的 expert parallel group size。

启用 EP 后的层行为

当为 MoE 模型启用 EP 时,不同类型的层会使用不同的并行策略:

层类型行为使用的并行方式
Expert (MoE) 层在所有 EP ranks 之间切分Expert Parallel,大小为 TP x DP
Attention 层行为取决于 TP_SIZE根据 TP_SIZE 使用 Tensor Parallel 或 Data Parallel

对于 attention 层:

  • TP_SIZE = 1 时,attention 权重会在所有 data parallel ranks 之间复制。
  • TP_SIZE > 1 时,attention 权重会在每个 data parallel group 内通过 tensor parallelism 进行切分。

例如,如果 TP_SIZE = 2DP_SIZE = 4,那么该服务总共会使用 8 个 GPU:

  • expert 层会形成一个大小为 8 的 EP group,expert 会分布到所有 GPU 上。
  • attention 层会在 4 个 data parallel groups 中的每个组内使用大小为 2 的 tensor parallelism。

与常规的 data parallel 部署相比,主要区别在于 MoE 层的分布方式。没有 --enable-expert-parallel 时,MoE 层会遵循 tensor parallel grouping 行为。启用 EP 后,expert 层会切换为 expert parallelism,这种机制专为 MoE 风格的 expert 切分而设计。

上游命令与平台映射

上游单节点示例使用的命令类似如下:

vllm serve deepseek-ai/DeepSeek-V3-0324 \
  --tensor-parallel-size 1 \
  --data-parallel-size 8 \
  --enable-expert-parallel

在 Alauda AI 中,这些相同的标志通常会通过 InferenceService 容器命令传递。换句话说:

  • vllm serve ... 会变成在 spec.predictor.model.command 中启动的命令
  • --tensor-parallel-size--data-parallel-size--enable-expert-parallel 会追加到 vLLM 启动命令中
  • 模型位置、运行时名称以及 Kubernetes 资源会通过 storageUriruntimeresources 来表达

这就是为什么下面的示例重点说明如何将 EP 相关标志放入平台的 InferenceService YAML 中。

配置单节点 InferenceService

创建一个名为 deepseek-v3-ep.yaml 的 YAML 文件,内容如下:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  annotations:
    aml-model-repo: DeepSeek-V3-0324
    serving.knative.dev/progress-deadline: 2400s
    serving.kserve.io/deploymentMode: Standard
  labels:
    aml.cpaas.io/runtime-type: vllm
  name: deepseek-v3-ep
  namespace: <your-namespace>
spec:
  predictor:
    minReplicas: 1
    maxReplicas: 1
    model:
      command:
        - bash
        - -c
        - |
          set -ex

          GPU_COUNT=$(python3 -c "import torch; print(torch.cuda.device_count())")
          if [ "${GPU_COUNT}" -lt 2 ]; then
            echo "Expert Parallel requires multiple visible GPUs on the same node"
            exit 1
          fi

          MODEL_PATH="/mnt/models/${MODEL_NAME}"
          if [ ! -d "${MODEL_PATH}" ]; then
            MODEL_PATH="/mnt/models"
          fi

          python3 -m vllm.entrypoints.openai.api_server \
            --port 8080 \
            --served-model-name {{.Name}} {{.Namespace}}/{{.Name}} \
            --model "${MODEL_PATH}" \
            --dtype ${DTYPE} \
            --gpu-memory-utilization ${GPU_MEMORY_UTILIZATION} \
            --tensor-parallel-size 1 \
            --data-parallel-size "${GPU_COUNT}" \
            --enable-expert-parallel
        - bash
      env:
        - name: DTYPE
          value: half
        - name: GPU_MEMORY_UTILIZATION
          value: '0.95'
        - name: MODEL_NAME
          value: '{{ index .Annotations "aml-model-repo" }}'
      modelFormat:
        name: transformers
      protocolVersion: v2
      resources:
        limits:
          cpu: '8'
          memory: 32Gi
          nvidia.com/gpu: '8'
        requests:
          cpu: '4'
          memory: 16Gi
      runtime: <your-vllm-runtime>
      storageUri: hf://<your-model-path>
    securityContext:
      seccompProfile:
        type: RuntimeDefault

应用该清单:

kubectl apply -f deepseek-v3-ep.yaml -n <your-namespace>

这些标志为何重要

标志作用
--enable-expert-parallel为 MoE 模型启用 Expert Parallel。
--data-parallel-size "${GPU_COUNT}"在这个单节点示例中,将 node 上所有可见 GPU 用作 data parallel group。
--tensor-parallel-size 1与上游示例保持一致,并使 attention 层不进行 tensor parallel 切分。
TIP

请调整 GPU 资源字段,使其与集群中可用的资源键以及目标 node 上的 GPU 数量相匹配。本示例的关键在于 vLLM EP 参数是如何添加到 InferenceService 命令中的。如果你需要显式设置 all-to-all backend,请在添加 --all2all-backend 之前,先遵循上游 backend 选择指南。

查看已配置的 spec

应用清单后,请查看生成的 InferenceService spec,并确认 EP 相关参数已存在:

kubectl get inferenceservice deepseek-v3-ep -n <your-namespace> -o yaml

重点查看生成的 predictor 命令,并确认其中仍包含:

  • --enable-expert-parallel
  • --data-parallel-size
  • --tensor-parallel-size 1

此检查可确认预期的 vLLM 参数已应用到服务配置中。它不会验证运行时性能、backend 兼容性或多节点行为。

对于多节点部署

多节点 EP 部署需要额外的分布式运行时和网络配置,包括每个 node 的启动设置、node 角色以及 data-parallel 通信设置。

WARNING

本页面重点介绍单节点配置模式。如果你需要多节点 EP,请参阅官方 vLLM 指南,并根据你的集群拓扑和运行时环境调整部署模型。

参考资料