
# GPU虚拟化Burst调度
Burst调度是一种GPU弹性资源调度策略，在保障Pod固定算力占用的同时，可动态按比例抢占节点闲置算力，实现资源利用率最大化。Burst调度机制在保持算显隔离架构原有显存调度策略不变的前提下，仅对算力资源（如vCPU/GPU核心）的分配逻辑进行动态优化。
图1调度策略   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002305771961.png "点击放大")
GPU虚拟服务会按照申请GPU资源的容器数量为每张显卡设置时间片，用于为容器分配GPU算力，以单元1、单元2、......、单元N表示。如[图1]所示，上图为算显隔离的调度策略，下图为Burst调度策略。假设容器1、2、3分别申请5%、5%、10%的算力，其中容器3内没有进程打开GPU设备，即暂未使用GPU算力。两种调度方式的主要区别如下，仅对比算力调度方式：
- 算显隔离调度：系统仅为容器分配申请算力，即容器1、2、3分别分配5%、5%、10%的算力。
- Burst调度：由于容器3暂未使用GPU算力，因此容器1和容器2将按照两个容器的算力申请比例动态分配剩余算力，即容器1、2、3占用的实际算力百分比分别为50%、50%、0%。当容器3运行GPU进程时，将重新按比例分配GPU算力，即容器1、2、3占用的实际算力百分比为25%、25%、50%。
#### 前提条件
- 已有一个版本在v1.23.8-r0、v1.25.3-r0及以上的Standard/Turbo集群。
- 集群中已有GPU节点，且已开启集群级别的GPU虚拟化，具体操作步骤请参见[准备GPU虚拟化资源](https://support.huaweicloud.com/usermanual-cce/cce_10_0645.html)。
- 集群中已安装CCE AI套件（NVIDIA GPU）插件，且插件版本在2.1.50、2.7.67及以上，具体操作步骤请参见[CCE AI套件（NVIDIA GPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0141.html)。
- 集群中已安装Volcano调度器插件，且插件版本在1.10.5及以上，具体操作步骤请参见[Volcano调度器](https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html)。
 
#### 约束与限制
- 开启Burst调度前：需确保集群内所有GPU和GPU虚拟化任务已全部迁移或终止，避免开启过程中业务中断或调度失败。
- 开启Burst调度后：
  - 集群仅算力支持Burst调度，显存仍按照设置的配额进行分配。
  
  - 集群不再支持创建算显隔离模式的容器（policy=1）。
  
  - 集群支持创建显存隔离模式的容器（policy=0），但显存隔离容器不能与Burst容器调度在同一张GPU卡上。
  
  - 集群支持创建GPU共享模式的容器，但共享模式容器不能与Burst容器调度在同一张GPU卡上。
   
 
#### 开启GPU虚拟化Burst调度
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群"概览页"。
2. 在左侧导航栏中选择"插件中心"，在右侧找到CCE AI套件（NVIDIA GPU）插件，单击"编辑"。
3. 在"编辑插件"页面上方，单击"编辑YAML"。在YAML文件中搜索"enabled_xgpu_burst"字段，并设置为"true"，具体如下： 
   ```
   ...
   custom:
         annotations: {}
         compatible_with_legacy_api: false
         component_schedulername: kube-scheduler
         disable_mount_path_v1: false
         disable_nvidia_gsp: true
         driver_mount_paths: bin,lib64
         enable_fault_isolation: true
         enable_health_monitoring: true
         enable_metrics_monitoring: true
         enable_simple_lib64_mount: true
         enable_xgpu: false
         enabled_xgpu_burst: true
         gpu_driver_config: {}
         health_check_xids_v2: 74,79
         inject_ld_Library_path: ''
         install_nvidia_peermem: false
         is_driver_from_nvidia: true
   ...
   ```
   
   
4. 配置完成后，在右下角单击"确定"。此时，CCE AI套件（NVIDIA GPU）插件将自动升级，待插件状态变为"运行中"后，Burst功能即可生效。
 
#### 使用Burst调度
1. 在已有的ECS中安装kubectl，并使用kubectl连接集群，具体操作请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 执行以下命令，创建一个YAML文件，用于创建需要GPU虚拟化Burst调度的容器。 
   ```
   vim xgpu-burst.yaml
   ```
   文件内容如下：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: xgpu-burst
     labels:
       app: xgpu-burst
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: xgpu-burst
         xgpu.burst/enabled: true   # 使用Burst功能
     template: 
       metadata:
         labels:
           app: xgpu-burst
       spec:
         containers:
         - name: container-1
           image: <your_image_address>     # 请替换为您的镜像地址
           resources:
             limits:
               volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小，该数值表示128Mi的倍数，即40*128=5120Mi
               volcano.sh/gpu-core.percentage: 25    # 该Pod分配的算力大小，单位为%
         imagePullSecrets:
           - name: default-secret
         schedulerName: volcano
   ```
   - 开启Burst功能后，不再支持创建算显隔离模式的容器，即在resources.requests和resources.limits字段中同时配置volcano.sh/gpu-mem.128Mi和volcano.sh/gpu-core.percentage参数时，**必须设置xgpu.burst/enabled: true标签**，否则负载无法调度成功。
   
   
   
   
3. 执行以下命令，创建工作负载。 
   ```
   kubectl apply -f xgpu-burst.yaml
   ```
   回显结果如下，则说明工作负载已创建。
   ```
   deployment.apps/xgpu-burst created
   ```
   
   
4. 执行以下命令，查看已创建的Pod名称。 
   ```
   kubectl get pod -n default
   ```
   回显结果如下：
   ```
   NAME                         READY   STATUS    RESTARTS   AGE
   xgpu-burst-6bdb4d7cb-pmtc2   1/1     Running   0          21s
   ```
   
   
5. 登录Pod，查看Pod当前使用的调度策略。 
   ```
   kubectl exec -it gpu-app-6bdb4d7cb-pmtc2 -- cat /proc/xgpu/0/policy
   ```
   若回显结果为6，则说明当前使用的调度策略为Burst。
   
   
 
#### 关闭GPU虚拟化Burst调度
在关闭GPU虚拟化的Burst调度能力前，请先迁移或终止集群中正在使用该能力的容器。否则，已分配Burst容器的GPU节点将无法调度新的GPU虚拟化容器，从而导致任务调度受阻并造成资源浪费。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称，进入集群"概览页"。
2. 在左侧导航栏中选择"插件中心"，在右侧找到CCE AI套件（NVIDIA GPU）插件，单击"编辑"。
3. 在"编辑插件"页面上方，单击"编辑YAML"。在YAML文件中搜索"enabled_xgpu_burst"字段，并设置为"false"，具体如下： 
   ```
   ...
   custom:
         annotations: {}
         compatible_with_legacy_api: false
         component_schedulername: kube-scheduler
         disable_mount_path_v1: false
         disable_nvidia_gsp: true
         driver_mount_paths: bin,lib64
         enable_fault_isolation: true
         enable_health_monitoring: true
         enable_metrics_monitoring: true
         enable_simple_lib64_mount: true
         enable_xgpu: false
         enabled_xgpu_burst: false
         gpu_driver_config: {}
         health_check_xids_v2: 74,79
         inject_ld_Library_path: ''
         install_nvidia_peermem: false
         is_driver_from_nvidia: true
   ...
   ```
   
   
4. 配置完成后，在右下角单击"确定"。此时，CCE AI套件（NVIDIA GPU）插件将自动升级，待插件状态变为"运行中"后，Burst功能将无法使用。
 
#### GPU虚拟化Burst功能使用示例
假设集群中有一个GPU节点，首先创建一个使用Burst调度策略的工作负载，包含一个Pod和单个容器，请求20%的GPU算力。由于此时仅有该容器申请GPU，节点会将全部算力分配给它，即实际获得100%。随后，再创建另一个同样使用Burst调度的工作负载，也包含一个Pod和单容器，但请求5%的GPU算力。此时，GPU节点会根据两个容器的算力申请比例动态分配剩余算力，即第一个容器分配到80%，第二个分配到20%。
1. 在已有的ECS中安装kubectl，并使用kubectl连接集群，具体操作请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
2. 执行以下命令，创建一个YAML文件，用于生成第一个使用Burst调度的容器。 
   ```
   vim xgpu-burst1.yaml
   ```
   文件内容如下：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: xgpu-burst1
     labels:
       app: xgpu-burst1
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: xgpu-burst1
         xgpu.burst/enabled: true   # 使用Burst功能
     template: 
       metadata:
         labels:
           app: xgpu-burst1
       spec:
         containers:
         - name: container-1     
           image: nginx:latest     # 可替换为您的镜像地址
           command: 
             <dosomething>    # 请替换成具体的GPU业务命令
           resources:
             limits:
               volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小，该数值表示128Mi的倍数，即40*128=5120Mi
               volcano.sh/gpu-core.percentage: 20    # 该Pod分配的算力大小，单位为%
         imagePullSecrets:
           - name: default-secret
         schedulerName: volcano
   ```
   
   
3. 执行以下命令，创建工作负载。 
   ```
   kubectl apply -f xgpu-burst1.yaml
   ```
   回显结果如下，则说明工作负载已创建。
   ```
   deployment.apps/xgpu-burst1 created
   ```
   
   
4. 执行以下命令，查看已创建的Pod名称。 
   ```
   kubectl get pod -n default
   ```
   回显结果如下，则说明Pod运行成功。
   ```
   NAME                          READY   STATUS    RESTARTS   AGE
   xgpu-burst1-6bdb4d7cb-pmtc2   1/1     Running   0          21s
   ```
   
   
5. 登录GPU节点，执行以下命令，查看上述负载中容器的算力分配情况。 
   ```
   xgpu-smi
   ```
   此时仅有一个容器申请GPU，节点会将全部算力分配给它，即实际获得100%。
   ```
   Fri Mar  7 03:36:03 2025
   +---------------------------------------------------------------------------------------+
   | HUAWEI CLOUD XGPU-SMI                                           XGPU Version: 1.0     |
   |=========================================+======================+======================|
   |    Container-Id    |    GPU    |    GPU-Util/Limit    |     GPU-Memory-Usage/Limit    |
   +-----------------------------------------+----------------------+----------------------+
   |       5eff70afff85 |         0 |          100% / 20%  |             1028Mi / 5120Mi   |
   |=========================================+======================+======================|
   ...
   ```
   
   
6. 执行以下命令，创建一个YAML文件，用于生成第二个使用Burst调度的容器。 
   ```
   vim xgpu-burst2.yaml
   ```
   文件内容如下：
   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: xgpu-burst2
     labels:
       app: xgpu-burst2
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: xgpu-burst2
         xgpu.burst/enabled: true   # 使用Burst功能
     template: 
       metadata:
         labels:
           app: xgpu-burst2
       spec:
         containers:
         - name: container-1
           image: nginx:latest     # 请替换为您的镜像地址
           command: 
             <dosomething>    # 请替换成具体的GPU业务命令
           resources:
             limits:
               volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小，该数值表示128Mi的倍数，即40*128=5120Mi
               volcano.sh/gpu-core.percentage: 5    # 该Pod分配的算力大小，单位为%
         imagePullSecrets:
           - name: default-secret
         schedulerName: volcano
   ```
   
   
7. 执行以下命令，创建工作负载。 
   ```
   kubectl apply -f xgpu-burst2.yaml
   ```
   回显结果如下，则说明工作负载已创建。
   ```
   deployment.apps/xgpu-burst2 created
   ```
   
   
8. 执行以下命令，查看已创建的Pod名称。 
   ```
   kubectl get pod -n default
   ```
   回显结果如下，则说明Pod运行成功。
   ```
   NAME                          READY   STATUS    RESTARTS   AGE
   xgpu-burst1-6bdb4d7cb-pmtc2   1/1     Running   0          21s
   xgpu-burst2-5xdb4d7cb-qmld3   1/1     Running   0          21s
   ```
   
   
9. 登录GPU节点，执行以下命令，查看上述负载中容器的算力分配情况。算力分配需要一定时间，请耐心等候。 
   ```
   xgpu-smi
   ```
   此时，GPU节点会根据两个容器的算力申请比例动态分配剩余算力，即第一个容器分配到80%，第二个分配到20%
   ```
   Fri Mar  7 03:36:03 2025
   +---------------------------------------------------------------------------------------+
   | HUAWEI CLOUD XGPU-SMI                                           XGPU Version: 1.0     |
   |=========================================+======================+======================|
   |    Container-Id    |    GPU    |    GPU-Util/Limit    |     GPU-Memory-Usage/Limit    |
   +-----------------------------------------+----------------------+----------------------+
   |       5eff70afff85 |         0 |          80% / 20%  |              1024Mi / 5120Mi   |
   |       98d5201b7ea3 |         0 |          20% / 5%    |             2041Mi / 5120Mi   |
   |=========================================+======================+======================|
   ...
   ```
   
   
 
#### 相关文档
- [GPU弹性伸缩](https://support.huaweicloud.com/usermanual-cce/cce_10_1017.html)
- [GPU监控](https://support.huaweicloud.com/usermanual-cce/cce_10_1016.html)
- [GPU故障处理](https://support.huaweicloud.com/usermanual-cce/cce_10_0779.html)
 
