GPU虚拟化Burst调度
Burst调度是一种GPU弹性资源调度策略,在保障Pod固定算力占用的同时,可动态按比例抢占节点闲置算力,实现资源利用率最大化。Burst调度机制在保持算显隔离架构原有显存调度策略不变的前提下,仅对算力资源(如vCPU/GPU核心)的分配逻辑进行动态优化。
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虚拟化资源。
- 集群中已安装CCE AI套件(NVIDIA GPU)插件,且插件版本在2.1.50、2.7.67及以上,具体操作步骤请参见CCE AI套件(NVIDIA GPU)。
- 集群中已安装Volcano调度器插件,且插件版本在1.10.5及以上,具体操作步骤请参见Volcano调度器。
约束与限制
- 开启Burst调度前:需确保集群内所有GPU和GPU虚拟化任务已全部迁移或终止,避免开启过程中业务中断或调度失败。
- 开启Burst调度后:
- 集群仅算力支持Burst调度,显存仍按照设置的配额进行分配。
- 集群不再支持创建算显隔离模式的容器(policy=1)。
- 集群支持创建显存隔离模式的容器(policy=0),但显存隔离容器不能与Burst容器调度在同一张GPU卡上。
- 集群支持创建GPU共享模式的容器,但共享模式容器不能与Burst容器调度在同一张GPU卡上。
开启GPU虚拟化Burst调度
- 登录CCE控制台,单击集群名称,进入集群“概览页”。
- 在左侧导航栏中选择“插件中心”,在右侧找到CCE AI套件(NVIDIA GPU)插件,单击“编辑”。
- 在“编辑插件”页面上方,单击“编辑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 ... - 配置完成后,在右下角单击“确定”。此时,CCE AI套件(NVIDIA GPU)插件将自动升级,待插件状态变为“运行中”后,Burst功能即可生效。
使用Burst调度
- 在已有的ECS中安装kubectl,并使用kubectl连接集群,具体操作请参见通过kubectl连接集群。
- 执行以下命令,创建一个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标签,否则负载无法调度成功。
- 执行以下命令,创建工作负载。
kubectl apply -f xgpu-burst.yaml回显结果如下,则说明工作负载已创建。
deployment.apps/xgpu-burst created
- 执行以下命令,查看已创建的Pod名称。
kubectl get pod -n default回显结果如下:
NAME READY STATUS RESTARTS AGE xgpu-burst-6bdb4d7cb-pmtc2 1/1 Running 0 21s
- 登录Pod,查看Pod当前使用的调度策略。
kubectl exec -it gpu-app-6bdb4d7cb-pmtc2 -- cat /proc/xgpu/0/policy若回显结果为6,则说明当前使用的调度策略为Burst。
关闭GPU虚拟化Burst调度
在关闭GPU虚拟化的Burst调度能力前,请先迁移或终止集群中正在使用该能力的容器。否则,已分配Burst容器的GPU节点将无法调度新的GPU虚拟化容器,从而导致任务调度受阻并造成资源浪费。
- 登录CCE控制台,单击集群名称,进入集群“概览页”。
- 在左侧导航栏中选择“插件中心”,在右侧找到CCE AI套件(NVIDIA GPU)插件,单击“编辑”。
- 在“编辑插件”页面上方,单击“编辑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 ... - 配置完成后,在右下角单击“确定”。此时,CCE AI套件(NVIDIA GPU)插件将自动升级,待插件状态变为“运行中”后,Burst功能将无法使用。
GPU虚拟化Burst功能使用示例
假设集群中有一个GPU节点,首先创建一个使用Burst调度策略的工作负载,包含一个Pod和单个容器,请求20%的GPU算力。由于此时仅有该容器申请GPU,节点会将全部算力分配给它,即实际获得100%。随后,再创建另一个同样使用Burst调度的工作负载,也包含一个Pod和单容器,但请求5%的GPU算力。此时,GPU节点会根据两个容器的算力申请比例动态分配剩余算力,即第一个容器分配到80%,第二个分配到20%。
- 在已有的ECS中安装kubectl,并使用kubectl连接集群,具体操作请参见通过kubectl连接集群。
- 执行以下命令,创建一个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 - 执行以下命令,创建工作负载。
kubectl apply -f xgpu-burst1.yaml回显结果如下,则说明工作负载已创建。
deployment.apps/xgpu-burst1 created
- 执行以下命令,查看已创建的Pod名称。
kubectl get pod -n default回显结果如下,则说明Pod运行成功。
NAME READY STATUS RESTARTS AGE xgpu-burst1-6bdb4d7cb-pmtc2 1/1 Running 0 21s
- 登录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 | |=========================================+======================+======================| ...
- 执行以下命令,创建一个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 - 执行以下命令,创建工作负载。
kubectl apply -f xgpu-burst2.yaml回显结果如下,则说明工作负载已创建。
deployment.apps/xgpu-burst2 created
- 执行以下命令,查看已创建的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
- 登录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 | |=========================================+======================+======================| ...


