# 基于多角色部署的弹性降级（降P补D）
#### 什么是降P补D
降P补D是ModelArts推理部署平台面向PD分离部署场景提供的一种弹性降级调度能力。
在大模型推理的PD分离部署中，P（Prefill）负责请求的预处理与首token计算，D（Decode）负责后续token的逐步解码生成。在xP1D等部署形态中，D的角色至关重要，一旦D故障且资源不足以恢复全部负载，业务将完全中断。
**降P补D的核心思路：**
当D角色故障且集群剩余资源不足以拉起全部副本时，通过减少P角色的副本数量（降P），释放资源优先满足D角色的副本需求（补D），从而在降级状态下维持业务连续性。同理，P角色故障时也支持P自身降级恢复。
该特性基于Volcano的多维Gang调度能力实现，通过配置环境变量"minSubGroups" 字段指定每个角色允许的最小副本分组数，使调度器在资源不足时可以按最低规格进行部分调度，而非严格等待全部资源就绪后才整体调度。
**降P补D** **与传统Gang调度的区别**：
表1降P补D与传统Gang调度的区别 
| 对比维度   | 传统Gang调度      | **降P补D**（弹性Gang调度）        |
|:---|:---|:---|
| 调度条件     | 全部副本资源满足才调度  | 最少minSubGroups个副本资源满足即可调度 |
| 资源不足时行为 | 持续等待，服务不可用     | 降级运行，服务可用但性能降低              |
| 适用场景   | 严格要求全量副本的场景  | 允许降级运行以保障业务连续性的场景        |
| 降级后恢复  | 资源充足后自动全量调度 | 资源恢复时会自动恢复部分或者全量副本         |
   
#### 相关概念
- P（Prefill）：推理请求的Prefill角色负载，负责首Token计算和请求预处理。
- D（Decode）：推理请求的Decode角色负载，负责后续Token的逐步解码生成。
- PD分离部署：xPyD部署形态，P和D角色分别部署，如4P1D、2P1D等。
- 降级：在资源不足时，减少部分角色的副本数量来保障整个服务的可用性。
- 降P补D：降级的一种特殊场景：通过减少P副本数，优先满足D副本数，让业务可恢复。
- minSubGroups：Volcano PodGroup subGroupPolicy中的字段，指定角色最少需要的SubGroup分组数，控制降级最低副本数。
- Gang调度：Volcano调度策略，要求一组负载全部满足资源要求才统一调度，否则不调度。Gang调度更多介绍请参见[多维组调度（Gang）](https://support.huaweicloud.com/usermanual-cce/cce_10_1130.html)。
- 弹性Gang调度：在Gang调度基础上允许设置minSubGroups，实现资源不足时的部分调度。
 
#### 使用场景
表2降P补D的使用场景 
| 场景分类               | 场景描述                                                                                    | 方案介绍                                                                                        |
|:---|:---|:---|
| 故障恢复时资源不足（降级恢复）      | 服务故障恢复时，集群剩余资源不足以满足全量副本需求。                                                            | 故障恢复操作允许降级，通过minSubGroups配置实现降级恢复，服务以低于全量副本的规格先运行，待资源充足后升级恢复。                                 |
| D角色故障，资源不足以恢复（典型降P补D） | 4P1D分离部署服务正常运行中，D角色所在节点异常导致D Pod退出。Volcano调度尝试恢复D副本，但集群剩余资源不足以同时满足4P+1D的全量调度需求，服务持续中断。 | 开启P角色的降级开关并设置minSubGroups=1，Volcano调度器在资源不足时减少P副本数（如从4P降至2P），释放资源优先拉起D副本（1D），服务以2P1D的降级形态恢复运行。 |
| P角色故障，资源不足以恢复（P降级恢复）   | 4P1D分离部署服务中，部分P Pod异常退出，集群资源不足以恢复全部4个P副本。                                              | 开启P角色的降级开关并设置minSubGroups=2，Volcano调度器按最低2个P副本进行调度，服务以2P1D的降级形态运行，Prefill并行度降低。               |
   
#### 约束限制
- **部署形态约束：**仅适用于多角色分离部署场景，包括但不仅限于1D（如4P1D、2P1D等）。非分离部署场景（如单角色部署）设置了降级环境变量，推理平台管理面将记录错误日志并返回报错。
- **部署场景约束：**降P补D功能仅适用于故障恢复场景。
- **模型镜像约束：** 模型镜像需要支持xPyD的PD分离部署能力。模型镜像的恢复表现与服务部署时选择的恢复策略有关，也与模型镜像本身对Ranktable以及网络拓扑的感知有关。若镜像不具备正确的Ranktable和网络拓扑感知能力，可能出现因Pod重建或缩减导致的服务异常。若镜像本身对Ranktable和网络拓扑不敏感，则降级不会带来业务影响。
- **插件版本依赖：**降P补D生效依赖专属资源池的Volcano版本和KubeInfer版本，需与指定版本保持一致。当Volcano版本 \< 1.22.x 或 KubeInfer \< 7.6.2时，平台将提示：Volcano plugin version: {实际版本} does not meet degradation requirements. Required volcano\>=1.22.0"或者"Operator plugin version: {实际版本} does not meet degradation requirements. Required Operator\>=7.6.2"，请前往"辅助工具 \> 插件广场"页面升级插件版本。
- **资源池约束：**降P补D仅支持如下资源池k8s版本 v1.29.\*、 v1.30.\*、 v1.31.\*、 v1.32.\*、 v1.33.\*、 v1.34.\*、 v1.35.\*。若低于v1.29.\*，则无法升级Volcano至1.22.x及以上版本。
- **降级行为限制：**
  - 降级仅支持配置minSubGroups的值，不会修改subGroupSize的值。
  
  - 当P和D同时配置minSubGroups时，Volcano的调度结果可能不可预测。例如5P3D可能降级为4P3D，也可能降级为5P2D，具体缩减哪个角色由Volcano调度决定。建议仅配置P角色的minSubGroups来实现降P补D，避免P和D同时配置导致结果不可控。
   
- **重建策略限制：**降级支持各级重建策略，但降P补D依赖部署副本级重建。
- **环境变量保留字约束：**ENV_MODELARTS_DEGRADATION_ENABLE和ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS 为系统保留环境变量key，用户不应自定义使用相同key的环境变量。若用户已存在同名环境变量，推理任务将报错。
- **降级后的性能影响：**降级运行时，P副本数减少会导致Prefill并行处理能力降低，推理服务的首Token延迟（TTFT）和吞吐量可能下降。降级后的性能下降属于预期行为，用户应关注降级状态并及时扩容恢复。
 
#### 特性配置
**配置方式：**仅支持通过推理平台控制台的环境变量进行配置。
在[创建部署](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0086.html)或[升级部署](https://support.huaweicloud.com/inference-modelarts/inference2.0-modelarts-0022.html)页面，在"单元配置"中添加"环境变量"，在"更多配置"中开启"自动重建"，并选择"部署副本重建"，P和D角色的具体配置请参考[配置示例]。
图1添加环境变量   
![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002640985648.png)
图2选择部署副本重建策略   
![](https://support.huaweicloud.com/inference-modelarts/figure/zh-cn_image_0000002663686274.png)
表3环境变量说明 
| 环境变量Key                                  | 取值范围              | 默认值     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| ENV_MODELARTS_DEGRADATION_ENABLE         | true或者false        | false | 降级开关。 枚举值：true/false，大小写不敏感，若非枚举值推理平台将记录错误日志并返回报错。 设置为true时开启该角色的降级能力， 设置为false或不设置时降级不生效。                                                                                                                                                                                                                                                                                                                                                   |
| ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS | \[1, 单元副本数\] 的整数 | 1     | 降级最低副本分组数。指定该角色在资源不足时最少需要多少个SubGroup分组才能触发调度。 - 当值等于单元副本数时：等同于全量Gang调度，无降级空间，降级功能无效。  - 非法值（负数、0值、非数字、超过副本数）：推理平台将记录错误日志并返回报错。  - 当只设置ENV_MODELARTS_DEGRADATION_ENABLE=true但不设置ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS时，取默认值1   |
   
**特性配置原理：**
降P补D特性通过环境变量方式传递降级配置：
1. 用户设置环境变量，推理平台管理面在创建部署或更新部署时，解析用户设置的环境变量，获取降级开关和minSubGroups值，并将配置写入对应kubeinfer定义中。
2. 推理平台业务面：从kubeinfer CR的annotation中读取降级配置，在创建PodGroup时根据配置设置对应角色的minSubGroups字段。
3. 推理平台调度面（Volcano）：根据PodGroup的subGroupPolicy中minSubGroups的值，在资源不足时按最低副本分组数进行弹性调度。
**典型配置：**
为实现降P补D（减少P副本优先满足D副本），建议仅配置P角色的降级开关：
P节点：开启P降级，最低保留1个P副本
```
ENV_MODELARTS_DEGRADATION_ENABLE = true 
ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS = 1
```
D节点：不设置，D不降级，保证D副本数不变
**不建议：**同时为P和D设置minSubGroups=1，因为Volcano调度可能不可预测地选择缩减P或D。
 #### 配置示例
**示例一：** **4P1D降P补D配置**
场景：4P1D分离部署服务，配置降P补D能力，P角色最低保留1个副本。
P角色环境变量配置：
```
ENV_MODELARTS_DEGRADATION_ENABLE = true 
ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS = 1
```
D角色环境变量配置：不设置。
D角色开启自动重建并选择：部署副本重建。
降级效果：
- 正常运行：4P1D，资源充足，全量调度。
- 降级运行（D故障恢复）：2P1D，资源不足时，P降至2副本，D恢复1副本。
- 最低降级运行：1P1D，资源极度不足时，P降至1副本，D恢复1副本。
**示例二：** **2P1D降P补D配置**
场景：2P1D分离部署服务，P角色最低保留1个副本。
P角色环境变量配置：
```
ENV_MODELARTS_DEGRADATION_ENABLE = true 
ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS = 1
```
D角色环境变量配置：不设置。
D角色开启自动重建并选择：部署副本重建。
降级效果：
- 正常运行：2P1D，资源充足，全量调度。
- 降级运行：1P1D，资源不足时，P降至1副本，D保持1副本。
**示例三：** **P和D独立降级控制**
场景：5P3D分离部署服务，P角色最低保留2副本，D角色最低保留1副本。
P角色环境变量配置：
```
ENV_MODELARTS_DEGRADATION_ENABLE = true 
ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS = 2
```
P角色开启自动重建并选择：部署副本重建。
D角色环境变量配置：
```
ENV_MODELARTS_DEGRADATION_ENABLE = true 
ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS = 1
```
D角色开启自动重建并选择：部署副本重建。
降级效果：
P和D同时配置minSubGroups时，Volcano调度器决定具体缩减哪个角色的副本，结果可能不可预测。例如可能降级为4P3D或5P2D。如需确保降P补D效果（优先缩减P），建议仅配置P角色的降级开关。
**示例四：** **通过API配置环境变量**
场景：通过ModelArts推理部署API创建部署时，在环境变量中配置降P补D。推理部署API请参见[ModelArtsAPI参考](https://support.huaweicloud.com/api-modelarts/CreateInferDeployment.html)。
API请求示例（简化）：
```
POST /v2/{project_id}/services
    Content-Type: application/json
    {
      "service": {
        "name": "llm-pd-separated-service",
        "deployment": {
          "replicas": 1,
          "roles": [
            {
              "name": "Prefill",
              "replicas": 4,
              "envs": [
                {
                  "key": "ENV_MODELARTS_DEGRADATION_ENABLE",
                  "value": "true"
                },
                {
                  "key": "ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS",
                  "value": "1"
                }
              ]
            },
            {
              "name": "Decode",
              "replicas": 1,
              "envs": [],
              "recovery":"Instance"
            }
          ]
        }
      }
    }
```
#### 结果验证
配置完成后，查看环境变量配置项操作如下：
1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，在左侧菜单栏中选择"模型推理 \> 在线推理"，进入在线服务管理页面。
2. 单击目标服务名称，进入服务详情页面，切换到"部署"页签。选择部署卡片，在"单元配置"版块查看"环境变量"。确认P角色的ENV_MODELARTS_DEGRADATION_ENABLE为true，ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS为预期值。 在"单元配置"版块查看"自动重建"，确认重建策略为"已开启 \| 部署副本重建"。
   
配置完成后，查看降级详情操作如下：
1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，在左侧菜单栏中选择"模型推理 \> 在线推理"，进入在线服务管理页面。
2. 单击目标服务名称，进入服务详情页面，切换到"部署"页签。选择部署卡片，单击"查看详情"，进入部署副本列表页面，可通过查看副本的Pod数量，查看实例降级的详情，也可单击Pod列表进行查看。
 
#### 常见问题
1. 降P补D和普通的Gang调度有什么区别？ 普通Gang调度要求一组负载全部满足资源要求才统一调度，否则不调度。在资源不足时服务持续中断无法恢复。降P补D是弹性Gang调度，通过配置 minSubGroups字段指定角色的最低副本分组数，允许Volcano在资源不足时按最低规格进行部分调度，服务以降级形态运行，保障业务连续性。
   
2. 降P补D配置后，资源充足时是否仍然降级运行？ 不会。降P补D特性在资源充足时不生效，服务按照既定的全量副本数正常运行。降级仅在资源不足以满足全量调度需求时触发。当集群资源恢复充足后，自动恢复部分或者全量副本。
   
3. P和D同时配置minSubGroups时结果为什么不可预测？ 当P和D同时配置minSubGroups时，Volcano调度器在资源不足时会根据PodGroup的调度策略决定缩减哪个角色的副本。例如5P3D可能降级为4P3D，也可能降级为5P2D，具体结果由Volcano调度策略决定，本特性不做控制。建议仅配置P角色的minSubGroups来实现降P补D效果，确保D副本数不被缩减。
   
4. 降级后如何恢复到全量副本？ 降级后会持续稳定运行，如果可用资源恢复，会逐步恢复剩余的副本。可以选择扩容集群资源（增加节点、释放其他服务资源等），使资源满足全量调度需求。
   
5. minSubGroups设置为0和设置为副本数有什么区别？
   - minSubGroups=0：分组数量的检查被跳过，降级功能无效。当前不支持配置minSubGroups=0。
   
   - minSubGroups=副本数：在role层级等同于全量Gang调度，要求所有副本都满足才调度，无降级空间，降级功能无效。
   
   
   建议设置为1或以上但小于副本数的值，如4P场景设置minSubGroups=1或minSubGroups=2。
   
6. 非分离部署场景设置降级环境变量会怎样？ 推理平台业务面在创建PodGroup时会判断当前是否为多角色分离部署场景。非分离部署场景（如单角色部署）设置了降级环境变量，推理平台管理面将记录错误日志并返回报错。
   
7. 环境变量配置错误（如负数、非数字）会怎样？ 推理平台管理面在解析环境变量时会对取值进行严格校验。对于非法值（负数、0值、非数字、超过副本数），管理面将记录错误日志并返回报错，部署/更新请求将失败。
   
8. 降P补D对推理服务性能有什么影响？ 降P补D在资源充足时不生效，服务按全量规格运行，性能不受影响。降级触发后，P副本数减少会导致Prefill并行处理能力降低：
   - 首token延迟（TTFT）可能增加
   
   - 推理吞吐量可能下降
   
   - 但Decode能力（D副本数）保持不变，后续token生成速度不受影响
   
   
   降级后的性能下降属于预期行为，用户应通过监控感知降级状态并及时扩容恢复。
   
9. 如何关闭降P补D功能？ 通过更新部署，移除或修改环境变量即可关闭降P补D功能：
   1. 将ENV_MODELARTS_DEGRADATION_ENABLE设置为false或移除该环境变量
   
   2. 移除ENV_MODELARTS_DEGRADATION_MIN_SUB_GROUPS环境变量
   
   3. 更新部署后，推理平台业务面将不再设置minSubGroups，PodGroup恢复为默认Gang调度行为。
    
10. Volcano版本不满足要求时怎么办？ 当Volcano版本 \< 1.22.x 或 KubeInfer \< 7.6.2时，平台将提示"Volcano plugin version: {实际版本} does not meet degradation requirements. Required volcano\>=1.22.0"或者"Operator plugin version: {实际版本} does not meet degradation requirements. Required Operator\>=7.6.2"。用户需前往"辅助工具 \> 插件广场"页面升级Volcano插件版本至要求版本后，降P补D功能方可正常生效。
    
11. 降P补D与故障恢复策略有什么关系？ 降级功能与故障恢复策略有关联，不同的故障恢复策略会导致不同的降级预期：
    - 部署副本重建：如果异常后正常运行的副本数量仍满足降级要求，不会新建部署副本，会继续进行降级，直到异常副本数量低于minSubGroups的值，才会触发重建
    
    - 单元重建：会新建单元，遵循故障恢复的策略，只有Pod重启时才会重建单元，重建过程会进行降级
    
    - 单元副本重建：会新建单元副本，会进行降级
    
    - Pod重建：会新建Pod，会进行降级
    
    
    降级在各级重建策略下均可发生，但降P补D依赖部署副本级恢复策略。
    
12. 降级功能是否支持首次部署？ 不支持。首次部署允许设置minSubGroups参数，但如果此时全量推理单元需要的资源已经大于集群剩余资源，推理平台将记录错误日志并返回报错。
    
 
