ACK集群Pro版支持为应用申请GPU显存和算力,能够帮助您更精细化的使用GPU的显存和算力资源。本文介绍如何通过共享GPU调度实现算力分配。
前提条件
已创建ACK集群Pro版,且集群版本为v1.20及以上。具体步骤,请参见创建ACK托管集群。对于不同ACK版本的集群,调度器版本需满足以下要求。关于调度器各版本支持的功能,请参见kube-scheduler。
ACK集群版本
调度器版本
1.28
v1.28.1-aliyun-5.6-998282b9及以上
1.26
v1.26.3-aliyun-4.1-a520c096及以上
1.24
v1.24.3-ack-2.0及以上
1.22
v1.22.15-ack-2.0及以上
1.20
v1.20.4-ack-8.0及以上
已安装共享GPU组件,且Chart版本为1.2.0以上。关于安装共享GPU组件的具体操作,请参见安装共享GPU调度组件。
cGPU版本为1.0.5及以上。关于cGPU的升级操作,请参见升级节点cGPU版本。
使用限制
共享GPU调度目前支持仅申请显存和同时申请显存和算力两种任务,这两种任务不能同时存在于一个节点上,即一个节点只运行仅申请显存的任务,或者只运行同时申请显存和算力的任务。
为任务申请算力时,有如下限制:
每一张GPU提供的算力按100计量,代表这张卡的100%算力,例如申请20代表使用GPU卡的20%算力。
申请的算力值应为5的倍数,最小为5。如果不为5的倍数,任务将提交失败。
目前只有以下地域支持GPU显存算力分配功能。如果您需要使用该功能,请确保集群所在地域在此范围内。
地域
地域ID
华北2(北京)
cn-beijing
华东2(上海)
cn-shanghai
华东1(杭州)
cn-hangzhou
华北3(张家口)
cn-zhangjiakou
华南1(深圳)
cn-shenzhen
西南1(成都)
cn-chengdu
华南2(河源)
cn-heyuan
中国香港
cn-hongkong
印度尼西亚(雅加达)
ap-southeast-5
新加坡
ap-southeast-1
泰国(曼谷)
ap-southeast-7
美国(弗吉尼亚)
us-east-1
美国(硅谷)
us-west-1
日本(东京)
ap-northeast-1
华东2 金融云
cn-shanghai-finance-1
共享GPU调度支持算力分配的调度器于2022年03月01日上线,在此之后创建的集群将使用新版本调度器,但是在此之前已有集群的调度器不会自动升级到新版本,需要您手动进行操作。若您的集群创建时间早于2022年03月01日,请按照如下操作进行处理:
提交工单申请新版共享GPU调度内测。
卸载旧版共享GPU组件。
如果已安装旧版共享GPU组件(仅支持显存共享,Chart版本≤1.2.0),请按照以下步骤进行处理。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击ack-ai-installer右侧操作列下方的删除,然后在弹出的删除应用对话框,单击确定。
安装新版共享GPU组件。具体操作,请参见安装共享GPU调度组件。
步骤一:创建支持算力分配的节点池
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池页面右侧,单击创建节点池。
部分参数配置说明如下,关于配置项的详细说明,请参见节点池配置。
配置项
说明
节点池名称
设置节点池名称。本文配置为gpu-core。
期望节点数
设置节点池初始节点数量。若您不需要创建节点,请填写为0。
ECS标签
为ECS实例添加标签。
节点标签
为集群节点添加标签。本文配置如下,关于节点标签的更多信息,请参见ACK调度GPU使用的节点标签说明。
开启节点GPU显存和算力隔离能力:单击,输入第一个节点标签的键为ack.node.gpu.schedule,值为core_mem。
在节点上使用Binpack算法为Pod选择GPU卡:单击,输入第二个节点标签的键为ack.node.gpu.placement,值为binpack。
重要如果您需要将集群中已存在的GPU节点切换为算力隔离模式,请先将该节点从集群中移除,然后重新加入支持算力隔离的节点池。不支持直接使用
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem
命令将该GPU节点切换为算力隔离模式。
步骤二:查看节点池是否开启算力分配功能
执行以下命令,查看节点池的节点是否开启算力分配功能。
kubectl get nodes <NODE_NAME> -o yaml
预期输出:
#省略其他字段。
status:
#省略其他字段。
allocatable:
#节点共有400%的算力,4张GPU卡,每张卡提供100%算力。
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
#节点共有60 GiB显存,4张GPU卡,每张卡提供15 GiB显存。
aliyun.com/gpu-mem: "60"
capacity:
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
aliyun.com/gpu-mem: "60"
预期输出表明,存在aliyun.com/gpu-core.percentage
字段,即算力分配功能已开启。
步骤三:使用算力分配功能
未使用算力分配功能前,一张GPU卡的总显存为15 GiB,Pod可以100%使用该GPU卡的算力。本文以同时申请显存和算力任务为例,申请2 GiB显存、一张GPU卡的30%算力,介绍如何使用GPU显存算力分配功能。
使用以下YAML内容,创建申请GPU显存和算力的任务。
apiVersion: batch/v1 kind: Job metadata: name: cuda-sample spec: parallelism: 1 template: metadata: labels: app: cuda-sample spec: containers: - name: cuda-sample image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: # 单位为GiB,该Pod总共申请了2 GiB显存。 aliyun.com/gpu-mem: 2 #申请一张GPU卡的30%算力。 aliyun.com/gpu-core.percentage: 30 workingDir: /root restartPolicy: Never
执行以下命令,部署cuda-sample.yaml文件提交cuda-sample任务。
kubectl apply -f /tmp/cuda-sample.yaml
说明任务所使用的镜像较大,拉取镜像需要一定的时间,请耐心等待。
执行以下命令,查看cuda-sample任务的运行状态。
kubectl get po -l app=cuda-sample
预期输出:
NAME READY STATUS RESTARTS AGE cuda-sample-m**** 1/1 Running 0 15s
预期输出表明,
STATUS
为Running
,即任务部署成功。执行以下命令,查看显存和算力的使用情况。
kubectl exec -ti cuda-sample-m**** -- nvidia-smi
预期输出:
Thu Dec 16 02:53:22 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | 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 Tesla V100-SXM2... On | 00000000:00:08.0 Off | 0 | | N/A 33C P0 56W / 300W | 337MiB / 2154MiB | 30% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
预期输出表明:
显存:未开启算力分配功能前,Pod能够使用的总显存为该GPU卡的总显存,本文为15 GiB(在节点上执行
nvidia-smi
命令即可查询GPU卡的总显存)。开启算力分配功能后,Pod当前已使用337 MiB,能够使用的总显存为2154 MiB(约为2 GiB),说明显存隔离生效。算力:未开启算力分配功能前,Pod运行的任务能够100%使用GPU卡(您可以将申请的算力设置为100进行验证)。开启算力分配功能后,Pod已使用GPU卡的30%算力,说明算力隔离生效。
说明如果有n个任务,假设每个任务申请30%算力(n≤3,最多部署3个),n个任务运行在同一张GPU卡上,此时在每个Pod中执行
nvidia-smi
命令,可以看到算力为n*30%。nvidia-smi
命令的查询结果目前仅显示以卡为单位的算力利用率,而不显示以任务为单位的算力利用率。使用以下命令,查看Pod日志。
kubectl logs cuda-sample-m**** -f
预取输出:
[CUDA Bandwidth Test] - Starting... Running on... Device 0: Tesla V100-SXM2-16GB Quick Mode time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpu
由预期输出得到,使用算力分配功能后,Pod日志刷新较慢,此时算力被限制在该GPU卡的30%左右。
可选:执行以下命令,删除cuda-sample任务。
验证完毕后,您可以对任务进行删除操作。
kubectl delete job cuda-sample