更新时间:2026-03-30 GMT+08:00
分享

GPU虚拟化Burst调度

Burst调度是一种GPU弹性资源调度策略,在保障Pod固定算力占用的同时,可动态按比例抢占节点闲置算力,实现资源利用率最大化。Burst调度机制在保持算显隔离架构原有显存调度策略不变的前提下,仅对算力资源(如vCPU/GPU核心)的分配逻辑进行动态优化。

图1 调度策略

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调度

  1. 登录CCE控制台,单击集群名称,进入集群“概览页”。
  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连接集群
  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控制台,单击集群名称,进入集群“概览页”。
  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连接集群
  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   |
    |=========================================+======================+======================|
    ...

相关文档