准备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 |
插件 |
集群中需要同时安装以下插件:
|
步骤一:开启GPU虚拟化
集群中需要同时安装CCE AI套件(NVIDIA GPU)插件和Volcano调度器插件。
- 登录CCE控制台,单击集群名称进入集群,在左侧选择“配置中心”。
- 切换至“异构资源配置”页签,开启“GPU虚拟化”。
- 集群默认驱动:集群中GPU节点默认使用的GPU驱动版本。如果选择“自定义驱动链接地址”,则需填写Nvidia驱动的下载链接,详情请参见获取驱动链接-公网地址。
- 节点池自定义驱动:若您不希望集群中的所有GPU节点使用相同的驱动,CCE支持以节点池为单位安装不同的GPU驱动。配置节点池自定义驱动后,节点池中节点优先使用当前节点池自定义驱动,未指定驱动的节点将使用集群默认驱动。
- 系统将根据节点池指定的驱动版本进行安装,仅对节点池新建节点生效。
- 更新驱动版本后,新建节点直接生效,存量节点需重启节点生效。
- 安装2.7.2及以上版本的GPU插件时,支持以节点池级别配置XGPU虚拟化开关。
- 单击“确认配置”。
步骤三(可选):修改Volcano调度策略
Volcano针对GPU节点的调度策略默认为Spread,即如果节点配置相同,会选择一个正在运行的容器数量最少的节点,可以尽量将容器平均分配到各个节点。而Binpack调度策略与之相反,它会尽可能地把所有的容器调度到一台节点上运行,尽量少用节点,避免资源碎片化。
如果在使用GPU虚拟化特性时需要使用Binpack调度策略,可以在Volcano插件的高级配置中进行修改,具体操作步骤如下。
- 登录CCE控制台,单击集群名称进入集群,在左侧选择“插件中心”。
- 在右侧找到Volcano调度器插件,单击“编辑”。
- 在编辑插件页面,修改插件的“高级配置”。
- 在nodeorder插件中,添加arguments参数,配置leastrequested.weight为0,即资源分配最少的节点优先级设置为0。
- 新增binpack插件,并指定xGPU自定义资源(volcano.sh/gpu-core.percentage和volcano.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 } ] }