
# LeaderWorkerSet插件
大规模语言模型（LLM）推理采用多节点、多GPU的分布式计算架构，通过Tensor Parallelism跨GPU切分模型参数，结合Pipeline Parallelism跨节点分配计算阶段，实现多设备协同推理。传统的Kubernetes的Deployment和StatefulSet可以用于部署LLM分布式推理，但存在一些局限性：
- **Deployment：**用于部署无状态应用，虽然可以用于LLM推理，但难以管理Pod间的依赖关系和统一的生命周期。例如，滚动更新时可能导致部分 Pod 已经更新，而其他 Pod 尚未更新，从而影响推理服务的可用性。
- **StatefulSet：**用于管理有状态应用，可以保证Pod的顺序部署和唯一身份。但是，StatefulSet的伸缩和更新操作相对复杂，难以实现LLM推理服务所需的快速弹性伸缩。此外，StatefulSet对Pod的删除和重建策略较为严格，可能影响服务的快速恢复。
对此，CCE Standard/Turbo集群提供了LeaderWorkerSet插件，这是一种专为AI/ML推理设计的CRD资源，能够更有效地解决在LLM分布式推理场景中Deployment和StatefulSet的局限性。该插件具有以下优势：
- **分布式推理优化**：支持Tensor Parallelism与Pipeline Parallelism并行策略，实现跨Pod的高效计算协同与零拷贝通信。
- **组级别生命周期管理**：支持组级别的弹性伸缩、滚动升级和重启，提升服务高可用性。
- **身份标识与智能路由**：每个LeaderWorkerSet（LWS）可被唯一标识，并支持基于KV Cache亲和性的智能路由。
- **多租户资源隔离**：每个团队或用户可以拥有独立的推理实例（Serve实例），实现资源隔离和灵活的资源管理。
LeaderWorkerSet插件适用于以下场景：
- **LLM分布式推理服务：**适用于各种需要高性能、高吞吐量的大模型推理场景。例如，在线问答、文本生成、对话机器人、AI 辅助创作等。
- **高性能多节点推理加速：**支持vLLM、SGLang等主流AI推理框架，能够充分利用多节点的计算资源，加速推理过程。尤其适用于对推理时延有较高要求的场景，例如实时推荐、智能搜索等。
- **会话感知型推理服务优化**：对于需要保持会话状态的应用（例如聊天机器人、智能客服等），通过LeaderWorkerSet与AI Gateway联动，可以实现基于Session的精准路由，从而提高KV Cache命中率，减少重复计算，提升性能。
#### 基本概念
[LeaderWorkerSet（LWS）](https://lws.sigs.k8s.io/docs/overview/)是Kubernetes为AI/大模型推理场景设计的一种工作负载类型，它允许以副本（Replica）为单位，将多Pod协作组成一个逻辑整体，实现复杂分布式推理任务的统一生命周期管理。LWS极大简化了AI推理服务（如vLLM、SGLang等）的弹性部署和高效运维。
图1LWS结构图   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002260732608.png "点击放大")
- 每个LWS副本（Replica）对应一个独立对外服务的AI推理实例（Serve实例）。
- Replica内的每个Pod对应Serve实例中的各个并行切片，如Tensor Parallel的各个分片对应一个Pod，每个Pod有唯一编号，用于模型分片、通信等。
- Replica内的Pod可划分为Leader和Worker。一般情况下，Leader不仅需要承担业务负载，还需要负责实例初始化、调度等特殊职责。但在某些特殊场景下，Leader只负责协调和管理，不参与实际的推理计算。
 
#### 前提条件
- 已安装v1.27及以上版本的CCE Standard/Turbo集群。
- 请根据业务类型创建对应类型的节点和插件，且节点资源充足。
  - NPU业务：已创建NPU节点，且已安装[CCE AI套件（Ascend NPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0239.html)插件。
  
  - GPU业务：已创建GPU节点，且已安装[CCE AI套件（NVIDIA GPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0141.html)插件。
   
 
#### 约束与限制
- 目前，LeaderWorkerSet插件暂不支持在线升级。
- 若需卸载LeaderWorkerSet插件，请先清除所有与LWS相关的CRD资源，再执行卸载操作。
- 该插件当前正处于上线阶段，**已发布区域请以控制台实际为准**。
- **该插件处于公测阶段** ，您可体验最新插件特性，但**需要注意该版本的稳定性未得到完全的验证，不适用于CCE服务SLA**。
 
#### 安装插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，在右侧找到**LeaderWorkerSet** **插件**，单击"安装"。
3. 在"插件安装"页面右下角单击"安装"。当"插件中心 \> LeaderWorkerSet插件"右上角变为"已安装"时，则说明安装成功。 
   安装完成后，即可通过kubectl等工具部署LWS类型的AI推理负载。
   
   
 
#### 卸载插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，在右侧找到**LeaderWorkerSet** **插件**，单击"卸载"。
3. 在"卸载插件"的弹窗中输入"DELETE"，单击"确定"。当"插件中心 \> LeaderWorkerSet插件"右上角变为"未安装"时，则说明卸载成功。 
   **卸载该插件前，请先清除所有与LWS相关的CRD资源**。
   
   
 
#### 使用示例
根据[LeaderWorkerSet](https://lws.sigs.k8s.io/docs/overview/)提供的[vLLM LeaderWorkerSet用例](https://lws.sigs.k8s.io/docs/examples/vllm/)，向您展示如何通过LWS在GPU节点上部署vLLM分布式推理服务。vLLM支持基于Megatron-LM张量并行算法的分布式推理，其运行时由Ray框架管理。
本示例要求集群中的Pod可以访问公网，用于获取[vLLM官方镜像](https://github.com/vllm-project/vllm)，以及通过HuggingFace Token下载Llama-3.1-405B模型权重。您可以[为集群配置SNAT规则](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10049.html)以保证Pod能够访问公网，配置SNAT规则将涉及一定费用，具体请参见[NAT网关价格计算器](https://www.huaweicloud.com/pricing/calculator.html#/nat)。
1. 在已有的ECS中安装kubectl，并使用kubectl连接集群，具体操作请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 执行以下命令，创建名为vllm-lws的YAML文件，用于部署vLLM分布式推理服务。 
   ```
   vim vllm-lws.yaml
   ```
   文件内容如下：
   ```
   apiVersion: leaderworkerset.x-k8s.io/v1
   kind: LeaderWorkerSet
   metadata:
     name: vllm   # LeaderWorkerSet实例名称
   spec:
     replicas: 2  # 部署2个Serve实例
     leaderWorkerTemplate:    
       size: 2    # 每个实例中通过2个Pod并发支撑推理负载，1个Leader和1个Worker
       restartPolicy: RecreateGroupOnPodRestart   
       leaderTemplate:  # 定义Leader Pod
         metadata:
           labels:
             role: leader   # 用于标识Pod角色
         spec:
           containers:
             - name: vllm-leader
               image: vllm/vllm-openai:latest    # 使用官方vLLM镜像
               env:
                 - name: HUGGING_FACE_HUB_TOKEN 
                   value: <your-hf-token>    # 请填入HuggingFace Token，用于拉取Llama-3.1-405B模型
               command:    # 启动命令，用于加载Llama-3.1-405B模型
                 - 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 8080 --model meta-llama/Meta-Llama-3.1-405B-Instruct --tensor-parallel-size 8 --pipeline_parallel_size 2"
               resources:
                 limits:
                   nvidia.com/gpu: "8"   # 每个Pod中最多挂载8张NVIDIA GPU
                   memory: 1124Gi      
                   ephemeral-storage: 800Gi   # 临时存储空间，用于缓存模型权重
                 requests:
                   ephemeral-storage: 800Gi
                   cpu: 125
               ports:
                 - containerPort: 8080
               readinessProbe:   # 就绪指针
                 tcpSocket:
                   port: 8080     
                 initialDelaySeconds: 15   
                 periodSeconds: 10   
               volumeMounts:    # 在Learder Pod中挂载临时存储卷
                 - mountPath: /dev/shm
                   name: dshm
           volumes:    # 创建临时存储卷
           - name: dshm
             emptyDir:
               medium: Memory
               sizeLimit: 15Gi
       workerTemplate:   # 定义Worker Pod
         spec:
           containers:
             - name: vllm-worker
               image: vllm/vllm-openai:latest
               command:    # 启动命令，让Worker Pod作为计算节点加入Ray集群，并通过$(LWS_LEADER_ADDRESS)连接到主节点，准备参与分布式推理任务。
                 - sh
                 - -c
                 - "bash /vllm-workspace/examples/online_serving/multi-node-serving.sh worker --ray_address=$(LWS_LEADER_ADDRESS)"
               resources:
                 limits:
                   nvidia.com/gpu: "8"  # 每个pod中最多挂载8张NVIDIA GPU
                   memory: 1124Gi
                   ephemeral-storage: 800Gi
                 requests:
                   ephemeral-storage: 800Gi
                   cpu: 125
               env:
                 - name: HUGGING_FACE_HUB_TOKEN
                   value: <your-hf-token>
               volumeMounts:
                 - mountPath: /dev/shm
                   name: dshm   
           volumes:
           - name: dshm
             emptyDir:
               medium: Memory
               sizeLimit: 15Gi
   ---
   apiVersion: v1    # 用于集群内访问Serve实例
   kind: Service
   metadata:
     name: vllm-leader
   spec:
     ports:
       - name: http
         port: 8080
         protocol: TCP
         targetPort: 8080
     selector:
       leaderworkerset.sigs.k8s.io/name: vllm
       role: leader
     type: ClusterIP
   ```
   
   
3. 执行以下命令，创建上述资源。 
   ```
   kubectl apply -f vllm-lws.yaml
   ```
   回显结果如下：
   ```
   leaderworkerset.leaderworkerset.x-k8s.io/vllm created
   service/vllm-leader created
   ```
   
   
4. 执行以下命令，查看相关Pod是否部署成功。 
   ```
   kubectl get pod
   ```
   回显结果如下，状态皆为Running，则说明部署成功。其中vllm-0、vllm-0-1同属一个Serve实例，vllm-1、vllm-1-1同属一个Serve实例，且vllm-0和vllm-1为Leader。
   ```
   NAME       READY     STATUS     RESTARTS    AGE
   vllm-0     1/1       Running    0           2s
   vllm-0-1   1/1       Running    0           2s
   vllm-1     1/1       Running    0           2s
   vllm-1-1   1/1       Running    0           2s
   ```
   
   
5. 执行以下命令，通过Service的ClusterIP地址访问vllm-leader实例。 
   ```
   kubectl port-forward svc/vllm-leader 8080:8080
   ```
   回显结果如下，则说明vllm-leader实例可以正常访问。
   ```
   {
     "id": "cmpl-1bb34faba88b43f9862cfbfb2200949d",
     "object": "text_completion",
     "created": 1715138766,
     "model": "meta-llama/Meta-Llama-3.1-405B-Instruct",
     "choices": [
       {
         "index": 0,
         "text": " top destination for foodies, with",
         "logprobs": null,
         "finish_reason": "length",
         "stop_reason": null
       }
     ],
     "usage": {
       "prompt_tokens": 5,
       "total_tokens": 12,
       "completion_tokens": 7
     }
   }
   ```
   
   
 
#### 版本说明
表1LeaderWorkerSet插件版本记录 
| 插件版本  | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 更新特性                                      | 社区版本                                                                 |
|:---|:---|:---|:---|
| 0.8.1 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 | CCE Standard/Turbo集群支持使用LeaderWorkerSet插件 | [v0.8.0](https://github.com/kubernetes-sigs/lws/releases/tag/v0.8.0) |
   
