更新时间:2024-02-18 GMT+08:00

兼容Kubernetes默认GPU调度模式

开启GPU虚拟化后,默认该GPU节点不再支持使用Kubernetes默认GPU调度模式的工作负载,即不再支持使用nvidia.com/gpu资源的工作负载。如果您在集群中已使用nvidia.com/gpu资源的工作负载,可在gpu-device-plugin插件配置中选择“虚拟化节点兼容GPU共享模式”选项,即可兼容Kubernetes默认GPU调度能力。

  • 开启该兼容能力后,在工作负载中声明nvidia.com/gpu配额(即配置nvidia.com/gpu为小数,例如0.5)时将通过虚拟化GPU提供,实现GPU显存隔离,按照设定值的百分比为容器分配GPU显存(例如分配0.5×16GiB=8GiB的GPU显存,该数值需为128MiB的整数倍否则会自动向下取整)。如果在开启兼容能力前工作负载中已经使用nvidia.com/gpu资源,则不会转成虚拟化GPU,依然使用整卡资源。
  • 开启该兼容能力后,使用nvidia.com/gpu配额时等价于开启虚拟化GPU显存隔离,可以和显存隔离模式的工作负载共用一张GPU卡,但不支持和算显隔离模式负载共用一张GPU卡。同时,还需遵循GPU虚拟化的其他约束与限制
  • 未开启该兼容能力时,在工作负载中声明nvidia.com/gpu配额仅影响调度结果,并不会有显存隔离的限制。即虽然配置nvidia.com/gpu为0.5,依然可以在容器中看到完整的GPU显存资源。且使用nvidia.com/gpu资源的工作负载无法和使用虚拟化显存的工作负载共同调度到同一节点。
  • 编辑插件配置时,修改“虚拟化节点兼容GPU共享模式”选项,不会影响已运行的工作负载。修改该配置可能工作负载导致调度失败。例如,兼容能力从开启到关闭,已使用nvidia.com/gpu资源的工作负载仍存在虚拟化GPU显存隔离,会导致该GPU卡无法调度算显隔离模式的工作负载,您需要将使用nvidia.com/gpu资源的工作负载删除才可重新调度。

约束与限制

使用GPU虚拟化兼容Kubernetes默认GPU调度模式,要求配套的CCE AI 套件 (NVIDIA GPU)插件版本为2.0.10及以上、Volcano调度器插件版本为1.10.5及以上。

开启Kubernetes默认GPU调度模式兼容

  1. 登录CCE控制台,单击集群名称进入集群,在左侧选择“插件中心”。
  2. 在右侧找到CCE AI 套件 (NVIDIA GPU)插件,单击“安装”

    如已安装该插件,单击“编辑”。

  3. 填写插件配置,详情请参见安装插件

    开启GPU虚拟化后,可选择是否兼容nvidia.com/gpu字段,实现Kubernetes默认GPU调度能力的兼容。

  4. 单击“安装”

兼容Kubernetes默认GPU调度模式示例

  1. 使用kubectl连接集群。
  2. 创建一个使用nvidia.com/gpu资源的工作负载。

    创建gpu-app.yaml文件,示例如下:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gpu-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: gpu-app
      template:
        metadata:
          labels:
            app: gpu-app
        spec:
          containers:
          - image: <your_image_address>     # 请替换为您的镜像地址
            name: container-0
            resources:
              requests:
                cpu: 250m
                memory: 512Mi
                nvidia.com/gpu: 0.1   # 申请GPU的数量
              limits:
                cpu: 250m
                memory: 512Mi
                nvidia.com/gpu: 0.1   # GPU数量的使用上限
          imagePullSecrets:
          - name: default-secret

  3. 执行以下命令,创建应用。

    kubectl apply -f gpu-app.yaml

  4. 登录容器查看容器被分配显存总量。

    kubectl exec -it gpu-app -- nvidia-smi

    预期输出:

    Thu Jul 27 07:53:49 2023       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  NVIDIA A30          Off  | 00000000:00:0D.0 Off |                    0 |
    | N/A   47C    P0    34W / 165W |      0MiB /  2304MiB |      0%      Default |
    |                               |                      |             Disabled |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

    预期输出表明,Pod可使用的显存总量为2304MiB。

    本示例中,GPU节点上的显存总量为24258MiB,而24258MiB * 0.1 = 2425.8MiB并非128MiB的整数倍,因此进行向下取整至18倍,即18 * 128MiB=2304MiB。