部署多机分布式推理服务

本文以Qwen3-32B模型为例,演示如何在ACK中使用vLLM框架及SGLang框架部署多机分布式模型推理服务。

背景知识

  • Qwen3-32B

    Qwen3-32B 是通义千问系列最新一代的大型语言模型,基于328亿参数的密集模型架构,兼具卓越的推理能力与高效的对话性能。其最大特色在于支持思考模式与非思考模式的无缝切换。在复杂逻辑推理、数学计算和代码生成任务中表现出众,而在日常对话场景下也可高效响应。模型具备出色的指令遵循、多轮对话、角色扮演和创意写作能力,并在Agent任务中实现领先的工具调用表现。原生支持32K上下文,结合YaRN技术可扩展至131K。同时,支持100多种语言,具备强大的多语言理解与翻译能力,适用于全球化应用场景。有关更多详细信息,请参阅博客GitHub文档

  • vLLM

    vLLM是一个高效、轻量的大型语言模型推理引擎,它采用创新的 PagedAttention 技术,高效管理KV缓存,支持连续批处理、CUDA/HIP 图加速、chunked prefillSpeculative decoding,显著提升服务吞吐与响应速度。支持多种量化格式(如 GPTQ、AWQ、INT4/8、FP8)及 FlashAttention 等优化内核。vLLM 兼容 Hugging FaceModeScope模型,支持TP、PP、DPEP并行,提供流式输出和 OpenAI 兼容 API。支持 NVIDIA、AMD、Intel 等多种硬件,覆盖 Qwen、Deepseek、Llama、E5-Mistral等主流模型,广泛应用于对话系统、内容生成、AI Agent 等场景,是构建大模型应用的理想选择。更多关于vLLM框架的信息,请参见vLLM GitHub

  • SGLang

    SGLang 是一个高性能的大型语言模型与多模态模型服务推理引擎,通过前后端协同设计,提升模型交互速度与控制能力。其后端支持 RadixAttention(前缀缓存)、零开销 CPU 调度、PD分离、Speculative decoding、连续批处理、PagedAttention、TP/DP/PP/EP并行、结构化输出、chunked prefill及多种量化技术(FP8/INT4/AWQ/GPTQ)和多LoRA批处理,显著提升推理效率。前端提供灵活编程接口,支持链式生成、高级提示、控制流、多模态输入、并行处理和外部交互,便于构建复杂应用。支持 Qwen、DeepSeek、Llama等生成模型,E5-Mistral等嵌入模型以及 Skywork 等奖励模型,易于扩展新模型。更多关于SGLang推理引擎的信息,请参见SGLang GitHub

  • 多机分布式部署

    LLM模型参数越来越大,单个GPU卡无法加载全部模型,需要通过各种并行策略,将一个庞大而缓慢的LLM推理任务,拆分成多个子任务,分配给多个计算单元(GPU),然后将结果高效地汇总起来,从而快速地完成LLM推理任务。常见的并行策略有如下四种。

    数据并行(Data Parallelism, DP)

    其核心思想是每个GPU上都有一套完整的模型副本,但处理不同的数据。这是最简单、最常见的并行方式。

    image.png

    张量并行(Tensor Parallelism, TP)

    其核心思想是把模型权重切分开,让每个GPU只加载并计算一部分权重。

    image.png

    流水线并行(Pipeline Parallelism, PP)

    其核心思想是像工厂流水线一样,把模型的“层”分配给不同的GPU。每个GPU负责计算一部分的模型层,并将计算的中间结果传递给下一个GPU。

    image.png

    专家并行(Expert Parallelism, EP)

    MoE(Mixture-of-Experts)架构的模型中包含很多专家模型,每次只激活其中一部分专家来处理。因此可以将这些专家模型存放在不同的GPU上。当推理计算需要用到某个专家时,数据会被路由到对应的GPU上。

    image.png

前提条件

  • 已创建ACK集群且集群版本为1.28及以上,并且已经为集群添加GPU节点。具体操作,请参见创建ACK托管集群,及为集群添加GPU节点

    本文要求集群中至少有两个GPU节点,且单GPU节点显存需大于32GB,推荐使用ecs.gn8is.4xlarge规格,更多规格信息可参考GPU计算型实例规格族gn8is
  • 已安装LeaderWorkerSet组件,组件版本大于等于v0.6.0,组件安装步骤如下。

    登录容器服务管理控制台,在左侧导航栏选择集群列表单击目标集群名称,进入集群详情页面,使用Helm为目标集群安装lws。您无需为组件配置应用名命名空间,单击下一步后会出现一个请确认的弹框,单击,即可使用默认的应用名(lws)和命名空间(lws-system)。然后选择Chart 版本为最新版本,单击确定即可完成lws的安装。image

模型部署

步骤一:准备Qwen3-32B模型文件

  1. 执行以下命令从ModelScope下载Qwen-32B模型。

    请确认是否已安装git-lfs插件,如未安装可执行yum install git-lfs或者apt-get install git-lfs安装。更多的安装方式,请参见安装git-lfs
    git lfs install
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen3-32B.git
    cd Qwen3-32B/
    git lfs pull
  2. 登录OSS控制台,查看并记录已创建的Bucket名称。如何创建Bucket,请参见创建存储空间。在OSS中创建目录,将模型上传至OSS。

    关于ossutil工具的安装和使用方法,请参见安装ossutil
    ossutil mkdir oss://<your-bucket-name>/Qwen3-32B
    ossutil cp -r ./Qwen3-32B oss://<your-bucket-name>/Qwen3-32B
  3. 创建PVPVC。为目标集群配置名为llm-model的存储卷PV和存储声明PVC。具体操作,请参见创建PVPVC

    控制台操作示例

    1. 创建PV。

      • 登录容器服务管理控制台,在左侧导航栏选择集群列表

      • 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

      • 存储卷页面,单击右上角的创建

      • 创建存储卷对话框中配置参数。

        以下为示例PV的基本配置信息:

        配置项

        说明

        存储卷类型

        OSS

        名称

        llm-model

        访问证书

        配置用于访问OSSAccessKey IDAccessKey Secret。

        Bucket ID

        选择上一步所创建的OSS Bucket。

        OSS Path

        选择模型所在的路径,如/Qwen3-32B

    2. 创建PVC。

      • 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储声明

      • 存储声明页面,单击右上角的创建

      • 创建存储声明页面中,填写界面参数。

        以下为示例PVC的基本配置信息:

        配置项

        说明

        存储声明类型

        OSS

        名称

        llm-model

        分配模式

        选择已有存储卷。

        已有存储卷

        单击选择已有存储卷链接,选择已创建的存储卷PV。

    kubectl操作示例

    1. 创建llm-model.yaml文件,该YAML文件包含Secret静态卷PV静态卷PVC等配置,示例YAML文件如下所示。

      apiVersion: v1
      kind: Secret
      metadata:
        name: oss-secret
      stringData:
        akId: <your-oss-ak> # 配置用于访问OSSAccessKey ID
        akSecret: <your-oss-sk> # 配置用于访问OSSAccessKey Secret
      ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: llm-model
        labels:
          alicloud-pvname: llm-model
      spec:
        capacity:
          storage: 30Gi 
        accessModes:
          - ReadOnlyMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: ossplugin.csi.alibabacloud.com
          volumeHandle: llm-model
          nodePublishSecretRef:
            name: oss-secret
            namespace: default
          volumeAttributes:
            bucket: <your-bucket-name> # bucket名称
            url: <your-bucket-endpoint> # Endpoint信息,如oss-cn-hangzhou-internal.aliyuncs.com
            otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
            path: <your-model-path> # 本示例中为/Qwen3-32B/
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: llm-model
      spec:
        accessModes:
          - ReadOnlyMany
        resources:
          requests:
            storage: 30Gi
        selector:
          matchLabels:
            alicloud-pvname: llm-model
    2. 创建Secret创建静态卷PV创建静态卷PVC

      kubectl create -f llm-model.yaml

步骤二:部署推理服务

本文使用LeaderWorkerSet作为工作负载,采用TP=2的并行策略,在两个GPU节点上部署分布式推理服务。

vLLM框架部署多机推理服务

  1. 创建vllm_multi.yaml文件。

    展开查看相关示例代码。

    apiVersion: leaderworkerset.x-k8s.io/v1
    kind: LeaderWorkerSet
    metadata:
      name: vllm-multi-nodes
    spec:
      replicas: 1
      leaderWorkerTemplate:
        size: 2
        restartPolicy: RecreateGroupOnPodRestart
        leaderTemplate:
          metadata:
            labels:
              role: leader
              # for prometheus to scrape
              alibabacloud.com/inference-workload: vllm-multi-nodes
              alibabacloud.com/inference_backend: vllm
          spec:
            volumes:
              - name: model
                persistentVolumeClaim:
                  claimName: llm-model
              - name: dshm
                emptyDir:
                  medium: Memory
                  sizeLimit: 15Gi
            containers:
              - name: vllm-leader
                image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.10.0
                command:
                  - sh
                  - -c
                  - "bash /vllm-workspace/examples/online_serving/multi-node-serving.sh leader --ray_cluster_size=$(LWS_GROUP_SIZE); python3 -m vllm.entrypoints.openai.api_server --port 8000 --model /models/Qwen3-32B --tensor-parallel-size 2"
                resources:
                  limits:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                  requests:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                ports:
                  - containerPort: 8000
                    name: http
                readinessProbe:
                  initialDelaySeconds: 30
                  periodSeconds: 10
                  tcpSocket:
                    port: 8000
                volumeMounts:
                  - mountPath: /models/Qwen3-32B
                    name: model
                  - mountPath: /dev/shm
                    name: dshm
        workerTemplate:
          spec:
            volumes:
              - name: model
                persistentVolumeClaim:
                  claimName: llm-model
              - name: dshm
                emptyDir:
                  medium: Memory
                  sizeLimit: 15Gi
            containers:
              - name: vllm-worker
                image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.10.0
                command:
                  - sh
                  - -c
                  - "bash /vllm-workspace/examples/online_serving/multi-node-serving.sh worker --ray_address=$(LWS_LEADER_ADDRESS)"
                resources:
                  limits:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                  requests:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                ports:
                  - containerPort: 8000
                volumeMounts:
                  - mountPath: /models/Qwen3-32B
                    name: model
                  - mountPath: /dev/shm
                    name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: multi-nodes-service
    spec:
      type: ClusterIP
      ports:
      - port: 8000
        protocol: TCP
        targetPort: 8000
      selector:
        alibabacloud.com/inference-workload: vllm-multi-nodes
        role: leader
  2. 使用vLLM框架部署多机LLM推理服务。

    kubectl create -f vllm_multi.yaml

SGLang框架部署多机推理服务

  1. 创建sglang_multi.yaml文件。

    展开查看相关示例代码。

    apiVersion: leaderworkerset.x-k8s.io/v1
    kind: LeaderWorkerSet
    metadata:
      name: sglang-multi-nodes
    spec:
      replicas: 1
      leaderWorkerTemplate:
        size: 2
        restartPolicy: RecreateGroupOnPodRestart
        leaderTemplate:
          metadata:
            labels:
              role: leader
              # for prometheus to scrape
              alibabacloud.com/inference-workload: sglang-multi-nodes
              alibabacloud.com/inference_backend: sglang
          spec:
            containers:
              - name: sglang-leader
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/anolis-docker-images/docker-temp:0.3.4.post2-sglang0.4.10.post2-pytorch2.7.1.8-cuda12.8.1-py312-alinux3.2104
                command:
                  - sh
                  - -c
                  - "python3 -m sglang.launch_server --model-path /models/Qwen3-32B --tp 2 --dist-init-addr $(LWS_LEADER_ADDRESS):20000 \
                  --nnodes $(LWS_GROUP_SIZE) --node-rank $(LWS_WORKER_INDEX) --trust-remote-code --host 0.0.0.0 --port 8000 --enable-metrics"
                resources:
                  limits:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                  requests:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                ports:
                  - containerPort: 8000
                    name: http
                readinessProbe:
                  tcpSocket:
                    port: 8000
                  initialDelaySeconds: 30
                  periodSeconds: 10
                volumeMounts:
                  - mountPath: /dev/shm
                    name: dshm
                  - mountPath: /models/Qwen3-32B
                    name: model
            volumes:
                - name: model
                  persistentVolumeClaim:
                    claimName: llm-model
                - name: dshm
                  emptyDir:
                    medium: Memory
                    sizeLimit: 15Gi
        workerTemplate:
          spec:
            containers:
              - name: sglang-worker
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/anolis-docker-images/docker-temp:0.3.4.post2-sglang0.4.10.post2-pytorch2.7.1.8-cuda12.8.1-py312-alinux3.2104
                command:
                  - sh
                  - -c
                  - "python3 -m sglang.launch_server --model-path /models/Qwen3-32B --tp 2 --dist-init-addr $(LWS_LEADER_ADDRESS):20000 \
                  --nnodes $(LWS_GROUP_SIZE) --node-rank $(LWS_WORKER_INDEX) --trust-remote-code"
                resources:
                  limits:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                  requests:
                    nvidia.com/gpu: "1"
                    memory: "24Gi"
                    cpu: "8"
                volumeMounts:
                  - mountPath: /dev/shm
                    name: dshm
                  - mountPath: /models/Qwen3-32B
                    name: model
            volumes:
                - name: model
                  persistentVolumeClaim:
                    claimName: llm-model
                - name: dshm
                  emptyDir:
                    medium: Memory
                    sizeLimit: 15Gi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: multi-nodes-service
    spec:
      selector:
        alibabacloud.com/inference-workload: sglang-multi-nodes
        role: leader
      ports:
        - protocol: TCP
          port: 8000
          targetPort: 8000
  2. 使用SGLang框架部署多机LLM推理服务。

    kubectl create -f sglang_multi.yaml

步骤三:验证推理服务

  1. 执行以下命令,在推理服务与本地环境之间建立端口转发。

    重要

    kubectl port-forward建立的端口转发不具备生产级别的可靠性、安全性和扩展性,因此仅适用于开发和调试目的,不适合在生产环境使用。更多关于Kubernetes集群内生产可用的网络方案的信息,请参见Ingress管理

    kubectl port-forward svc/multi-nodes-service 8000:8000

    预期输出:

    Forwarding from 127.0.0.1:8000 -> 8000
    Forwarding from [::1]:8000 -> 8000
  2. 执行以下命令,向模型推理服务发送了一条示例的模型推理请求。

    curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json"  -d '{"model": "/models/Qwen3-32B", "messages": [{"role": "user", "content": "测试一下"}], "max_tokens": 30, "temperature": 0.7, "top_p": 0.9, "seed": 10}'

    预期输出:

    {"id":"chatcmpl-ee6b347a8bd049f9a502669db0817938","object":"chat.completion","created":1753685847,"model":"/models/Qwen3-32B","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"<think>\n好的,用户发来“测试一下”,我需要先确认他们的需求。可能是在测试我的功能,或者想看看我的反应。","tool_calls":[]},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":40,"completion_tokens":30,"prompt_tokens_details":null},"prompt_logprobs":null,"kv_transfer_params":null}

    输出结果表明模型可以根据给定的输入(在这个例子中是一条测试消息)生成相应的回复。

相关文档

  • LLM推理服务配置Prometheus Dashboard监控

    在生产环境中,LLM推理服务的可观测性是系统稳定性的核心保障,开源推理引擎通过集成Prometheus Dashboard实现故障的主动发现与精准定位。

  • 为单机/多机推理配置弹性扩缩容

    针对LLM模型服务的动态负载波动问题,Kubernetes HPA结合ACKack-alibaba-cloud-metrics-adapter组件,可根据CPU/内存/GPU利用率及自定义指标实现Pod的动态弹性伸缩,保障服务稳定性与资源高效利用。

  • 配置ACK Gateway with Inference Extension网关实现智能路由

    ACK Gateway with Inference Extension 是基于 Kubernetes 社区 Gateway API 及其 Inference Extension 规范构建的增强型组件,支持 Kubernetes 四层和七层路由服务,同时针对生成式 AI 推理场景提供了一系列优化能力。该组件能够简化 AI 推理服务的管理流程,并提升多推理服务工作负载间的负载均衡性能。其关键特性包括:

    • 模型感知的推理负载均衡:提供优化的负载均衡策略,确保推理请求高效分发。

    • 基于 OpenAI API 规范的模型路由:根据模型名称对推理请求进行智能路由,支持对同一基础模型的不同 LoRA 模型进行流量灰度管理。

    • 模型关键性优先级配置:通过为不同模型设置关键性等级,实现请求的差异化优先级处理,确保高优先级模型的服务质量。

  • 基于Fluid配置分布式缓存实现模型加速

    LLM 模型通常包含超过10GB的权重文件,从存储服务(如 OSS、NAS 等)拉取这些大文件时,容易因长时间延迟和冷启动问题影响性能。Fluid 通过在 Kubernetes 集群节点上构建分布式文件缓存系统,整合多个节点的存储与带宽资源;同时,它从应用程序端优化模型文件的读取机制,从而显著加速模型加载过程。