共享GPU调度作为一种资源管理策略,允许多个任务或进程共享同一GPU。您可以在注册集群中使用共享GPU调度,帮您解决传统GPU调度的资源浪费问题,从而提升GPU利用率。
前提条件
已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群。
已通过kubectl连接注册集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
系统组件版本具体要求如下表所示。
组件
版本要求
Kubernetes
1.22及以上版本
操作系统
CentOS 7.6
CentOS 7.7
Ubuntu 16.04
Ubuntu 18.04
Alibaba Cloud Linux 2(停止维护)
Alibaba Cloud Linux 3
计费说明
共享GPU调度目前已实行收费。在使用共享GPU调度前,需开通云原生AI套件。具体收费信息,请参见云原生AI套件计费说明。关于云原生AI套件的更多信息,请参见云原生AI套件概述。
使用限制
请勿将共享GPU调度的节点的
CpuPolicy
设置为static
。共享GPU的DaemonSet的Pod在节点上的优先级不是最高的,所以节点资源有可能被其他优先级高的Pod抢占而导致被驱逐。如果想避免这个问题,可以对您实际使用的DaemonSet(如共享GPU显存的
gpushare-device-plugin-ds
)进行修改,加上priorityClassName: system-node-critical
来保证其优先级。
步骤一:安装组件
在注册集群中安装ack-ai-installer组件。该组件可以提供共享GPU调度(包括共享隔离能力)、GPU拓扑感知调度等调度能力。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击创建。搜索并安装ack-ai-installer组件。
在注册集群中安装ack-co-scheduler组件。通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,搜索ack-co-scheduler组件,在卡片右下方单击安装。
步骤二:安装和使用GPU资源查询工具
下载kubectl-inspect-cgpu。
如果您使用的是Linux系统,您可以通过以下命令下载kubectl-inspect-cgpu。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu
如果您使用的是macOS系统,您可以通过以下命令下载kubectl-inspect-cgpu。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
执行以下命令,为kubectl-inspect-cgpu添加执行权限。
chmod +x /usr/local/bin/kubectl-inspect-cgpu
步骤三:创建GPU节点
创建GPU云服务器,并安装驱动和nvidia-container-runtime。具体操作,请参见创建节点池。
如果您添加节点池时已经创建GPU节点并配置好环境,可以跳过此步骤。
如果您没有安装驱动的脚本,请参见手动升级GPU节点驱动。
使用共享GPU调度的节点需要有标签
ack.node.gpu.schedule=share
,您可以手动为云下节点打上该标签。对于云上节点,您可以使用节点池的节点标签功能将标签的值升级为ack.node.gpu.schedule=cgpu
直接开启显存隔离能力。具体操作,请参见GPU节点调度属性标签说明。
步骤四:使用共享GPU调度
执行以下命令,查看集群GPU使用情况。
kubectl inspect cgpu
预期输出:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-zhangjiakou.192.168.66.139 192.168.66.139 0/15 0/15 --------------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)
使用以下内容,创建GPUtest.yaml。
apiVersion: batch/v1 kind: Job metadata: name: gpu-share-sample spec: parallelism: 1 template: metadata: labels: app: gpu-share-sample spec: schedulerName: ack-co-scheduler containers: - name: gpu-share-sample image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # 单位为GiB,该Pod总共申请了3 GiB显存。 aliyun.com/gpu-mem: 3 # 设置GPU显存大小。 workingDir: /root restartPolicy: Never
执行以下命令,部署一个GPU示例应用,该应用申请3GiB显存。
kubectl apply -f GPUtest.yaml
执行以下命令,查看集群GPU显存使用情况。
kubectl inspect cgpu
预期输出:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-zhangjiakou.192.168.66.139 192.168.66.139 3/15 3/15 --------------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 3/15 (20%)
预期输出表明,节点cn-zhangjiakou.192.168.66.139共有15 GiB显存,已分配3 GiB显存。
相关文档
更多关于共享GPU调度的信息,请参见共享GPU调度概述。