更新时间:2024-04-25 GMT+08:00

准备GPU虚拟化资源

CCE GPU虚拟化采用xGPU虚拟化技术,能够动态对GPU设备显存与算力进行划分,单个GPU卡最多虚拟化成20个GPU虚拟设备。本文介绍如何在GPU节点上实现GPU的调度和隔离能力。

前提条件

配置

支持版本

集群版本

v1.23.8-r0、v1.25.3-r0及以上

操作系统

Huawei Cloud EulerOS 2.0操作系统

GPU类型

支持T4、V100类型的GPU

驱动版本

GPU虚拟化功能仅支持470.57.02、510.47.03、535.54.03版本的GPU驱动。

运行时

仅支持containerd

插件

集群中需要同时安装以下插件:

步骤一:安装插件

集群中需要同时安装CCE AI套件(NVIDIA GPU)插件和Volcano调度器插件。

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

    • 插件规格:可配置“默认”“自定义”规格,请根据实际情况选择。
    • 容器:选择“自定义”规格时支持设置。
    • Nvidia驱动:您需要填写Nvidia驱动的下载链接,集群下全部GPU节点将使用相同的驱动。
      • 如果下载链接为公网地址,如nvidia官网地址(https://us.download.nvidia.com/tesla/470.57.02/NVIDIA-Linux-x86_64-470.57.02.run),各GPU节点均需要绑定EIP。获取驱动链接方法请参考获取驱动链接-公网地址
      • 若下载链接为OBS上的链接,无需绑定EIP 。获取驱动链接方法请参考获取驱动链接-OBS地址
      • 请确保Nvidia驱动版本与GPU节点适配。
      • 更改驱动版本后,需要重启节点才能生效。
    • 驱动选择:若您不希望集群中的所有GPU节点使用相同的驱动,CCE支持以节点池为单位安装不同的GPU驱动。
      • 插件将根据节点池指定的驱动版本进行安装,仅对节点池新建节点生效。
      • 更新驱动版本后,节点池中新建节点可直接生效,存量节点需重启节点生效。
    • GPU虚拟化(2.0.5及以上版本支持):选择开启GPU虚拟化,支持GPU单卡的算力、显存分割与隔离。
      图1 开启GPU虚拟化

      若集群中未安装Volcano插件,将不支持开启GPU虚拟化,您可单击“一键安装”进行安装。如需配置Volcano插件参数,请单击“自定义安装”,详情请参见Volcano调度器

      若集群中已安装Volcano插件,但插件版本不支持使用GPU虚拟化,您可单击“一键升级”进行升级。如需配置Volcano插件参数,请单击“自定义升级”,详情请参见Volcano调度器

      开启GPU虚拟化后,可选择“虚拟化节点兼容GPU共享模式”选项,即兼容Kubernetes默认GPU调度能力。该能力需要配套gpu-device-plugin插件版本为2.0.10及以上、Volcano插件版本为1.10.5及以上。

      • 开启该兼容能力后,在工作负载中声明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资源的工作负载删除才可重新调度。

  4. 单击“安装”

步骤二:创建GPU节点

您需要在集群中创建支持GPU虚拟化的节点以使用GPU虚拟化功能,具体操作步骤请参见创建节点创建节点池

如果您的集群中已有符合前提条件的GPU节点,您可以跳过此步骤。

步骤三(可选):修改Volcano调度策略

Volcano针对GPU节点的调度策略默认为Spread,即如果节点配置相同,会选择一个正在运行的容器数量最少的节点,可以尽量将容器平均分配到各个节点。而Binpack调度策略与之相反,它会尽可能的把所有的容器调度到一台节点上运行,尽量少用节点,避免资源碎片化。

如果在使用GPU虚拟化特性时需要使用Binpack调度策略,可以在Volcano插件的高级配置中进行修改,具体操作步骤如下。

  1. 登录CCE控制台,单击集群名称进入集群,在左侧选择“插件中心”。
  2. 在右侧找到Volcano调度器插件,单击“编辑”
  3. 在编辑插件页面,修改插件的“高级配置”。

    1. nodeorder插件中,添加arguments参数,配置leastrequested.weight为0,即资源分配最少的节点优先级设置为0。
    2. 新增binpack插件,并指定xGPU自定义资源(volcano.sh/gpu-core.percentagevolcano.sh/gpu-mem.128Mi)的权重。
    完整示例如下:
    {
        "colocation_enable": "",
        "default_scheduler_conf": {
            "actions": "allocate, backfill, preempt",
            "tiers": [
                {
                    "plugins": [
                        {
                            "name": "priority"
                        },
                        {
                            "enablePreemptable": false,
                            "name": "gang"
                        },
                        {
                            "name": "conformance"
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "enablePreemptable": false,
                            "name": "drf"
                        },
                        {
                            "name": "predicates"
                        },
                        {
                            "name": "nodeorder",
                            //将资源分配最少的节点优先级设置为0
                            "arguments": {
                                "leastrequested.weight": 0
                            }
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "cce-gpu-topology-predicate"
                        },
                        {
                            "name": "cce-gpu-topology-priority"
                        },
                        {
                            "name": "xgpu"
                        },
                        //添加binpack插件,指定xGPU资源的权重。
                        {
                            "name": "binpack",
                            "arguments": {
                                "binpack.resources": "volcano.sh/gpu-core.percentage,volcano.sh/gpu-mem.128Mi",
                                "binpack.resources.volcano.sh/gpu-mem.128Mi": 10,
                                "binpack.resources.volcano.sh/gpu-core.percentage": 10
                            }
                        }
                    ]
                },
                {
                    "plugins": [
                        {
                            "name": "nodelocalvolume"
                        },
                        {
                            "name": "nodeemptydirvolume"
                        },
                        {
                            "name": "nodeCSIscheduling"
                        },
                        {
                            "name": "networkresource"
                        }
                    ]
                }
            ]
        },
        "tolerations": [
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/not-ready",
                "operator": "Exists",
                "tolerationSeconds": 60
            },
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/unreachable",
                "operator": "Exists",
                "tolerationSeconds": 60
            }
        ]
    }