ACK Pro集群支持为应用申请GPU显存和算力,能够帮助您更精细化的使用GPU的显存和算力资源。本文介绍如何使用算力分配功能。
前提条件
-
目前cgpu不兼容5xx系列的GPU驱动(以5开头的驱动,例如: 510.47.03 )。
使用限制
-
cGPU服务的隔离功能不支持以UVM的方式申请显存,即调用CUDA API cudaMallocManaged(),有关该方式的更多信息,请参见NVIDIA官方文档。请使用其他方式申请显存,例如调用cudaMalloc()等。
-
共享GPU调度目前支持 仅申请显存 和 同时申请显存和算力 两种任务,这两种任务不能同时存在于一个节点上,即一个节点只运行 仅申请显存 的任务,或者只运行 同时申请显存和算力 的任务。
-
为任务申请算力时,有如下限制:
-
每一张GPU提供的算力按100计量,代表这张卡的100%算力,例如申请20代表使用GPU卡的20%算力。
-
申请的算力值应为5的倍数,最小为5。如果不为5的倍数,任务将一直处于Pending。
-
目前只有以下地域支持GPU显存算力分配功能。如果您需要使用该功能,请确保集群所在地域在此范围内。
地域 |
地域ID |
华北2(北京) |
cn-beijing |
华东2(上海) |
cn-shanghai |
华东1(杭州) |
cn-hangzhou |
华北(张家口) |
cn-zhangjiakou |
华南1(深圳) |
cn-shenzhen |
西南1(成都) |
cn-chengdu |
华南2(河源) |
cn-heyuan |
中国(香港) |
cn-hongkong |
印度尼西亚(雅加达) |
ap-southeast-5 |
新加坡 |
ap-southeast-1 |
美国(弗吉尼亚) |
us-east-1 |
美国(硅谷) |
us-west-1 |
日本(东京) |
ap-northeast-1 |
-
共享GPU调度支持算力分配的调度器于2022年3月1日上线,在此之后创建的集群将使用新版本调度器,但是在此之前已有集群的调度器不会自动升级到新版本,需要您手动进行操作。若您的集群创建时间早于2022年3月1日,请按照如下操作进行处理:
-
提交工单 申请新版共享GPU调度内测。
-
卸载旧版共享GPU组件。如果已安装旧版共享GPU组件(仅支持显存共享,Chart版本≤1.2.0),请按照以下步骤进行处理。
-
-
在控制台左侧导航栏中,单击 集群 。
-
在 集群列表 页面中,单击目标集群名称或者目标集群右侧 操作 列下的 详情 。
-
在集群管理页左侧导航栏中,选择 应用 > Helm 。
-
在 Helm 页面,单击ack-ai-installer右侧 操作 列下方的 删除 。
-
在弹出的 删除应用 对话框,单击 确定 。
-
创建支持算力分配的节点池
-
在控制台左侧导航栏中,单击 集群 。
-
在 集群列表 页面中,单击目标集群名称或者目标集群右侧 操作 列下的 详情 。
-
在集群管理页左侧导航栏中,选择 节点管理 > 节点池 。
注意 如果您需要将集群中已存在的GPU节点切换为算力隔离模式,请先将该节点从集群中移除,然后重新加入支持算力隔离的节点池。不支持直接使用kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem命令将该GPU节点切换为算力隔离模式。
配置项 |
说明 |
节点池名称 |
设置节点池名称。本文配置为gpu-core。 |
期望节点数 |
设置节点池初始节点数量。若您不需要创建节点,请填写为0。 |
操作系统 |
操作系统仅支持CentOS 7.x和Alibaba Cloud Linux 2.x。 |
ECS标签 |
为ECS实例添加标签。 |
自定义资源组 |
指定节点池所扩容节点的资源组信息。 |
节点标签 |
为集群节点添加标签。本文配置如下,关于节点标签的更多信息,请参见ACK调度GPU使用的节点标签说明
|
使用算力分配
支持算力分配的节点池创建完成后,在该节点池扩容1个节点。同时,为了做对比,在集群中准备一个支持申请独占GPU资源的节点,两个节点上的GPU卡型号一致(本示例中两个节点的卡型号均为Tesla-V100-SXM2-32GB)。集群节点如下:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
cn-beijing.192.168.10.163 Ready <none> 150m v1.20.11-aliyun.1
cn-beijing.192.168.10.164 Ready <none> 150m v1.20.11-aliyun.1
其中:
-
cn-beijing.192.168.10.163:未开启共享GPU调度的节点,支持按卡的维度申请GPU资源,该节点用来做对照。使用“kubectl get nodes cn-beijing.192.168.10.163 -o yaml”可以查看其拥有的GPU资源:
status:
...... // 省略其他内容
allocatable:
...... // 省略其他内容
nvidia.com/gpu: "1" 节点拥有1张GPU卡
......
-
cn-beijing.192.168.10.164:开启共享GPU调度的节点,且支持显存和算力申请,使用“kubectl get nodes cn-beijing.192.168.10.164 -o yaml”可以查看其拥有的GPU资源:
...... // 省略其他
status:
......
allocatable:
aliyun.com/gpu-core.percentage: "100" # 节点拥有的总的算力份数为100份
aliyun.com/gpu-mem: "31" # 节点拥有的总的显存为31GiB
为了验证算力分配的有效性,本次示例将在两个节点上运行同一个GPU应用,观察它们的GPU利用率是否有差别。本次示例选择的GPU应用为tensorflow benchmark项目。
两个任务的相关信息如下:
任务名称 |
运行的节点 |
GPU资源申请 |
tensorflow-benchmark-exclusive |
cn-beijing.192.168.10.163 |
1张GPU卡 |
tensorflow-benchmark-share |
cn-beijing.192.168.10.164 |
10GiB显存和1张卡的30%算力 |
tensorflow-benchmark-exclusive的yaml如下:
apiVersion: batch/v1
kind: Job
metadata:
name: tensorflow-benchmark-exclusive
spec:
parallelism: 1
template:
metadata:
labels:
app: tensorflow-benchmark
spec:
containers:
- name: tensorflow-benchmark
image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
command:
- bash
- run.sh
- --num_batches=50000
- --batch_size=8
resources:
limits:
nvidia.com/gpu: 1 # 申请1张GPU卡
workingDir: /root
restartPolicy: Never
tensorflow-benchmark-share的yaml如下:
apiVersion: batch/v1
kind: Job
metadata:
name: tensorflow-benchmark-share
spec:
parallelism: 1
template:
metadata:
labels:
app: tensorflow-benchmark
spec:
containers:
- name: tensorflow-benchmark
image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
command:
- bash
- run.sh
- --num_batches=50000
- --batch_size=8
resources:
limits:
aliyun.com/gpu-mem: 10 # 申请10GiB显存
aliyun.com/gpu-core.percentage: 30 # 申请整张卡30%算力
workingDir: /root
restartPolicy: Never
两个Job除了申请的GPU资源不一样,其他完全一样(包括启动参数,使用的镜像等)。
使用kubectl apply -f <YAML>创建两个Job,然后查看两个Job的pod运行状态。
# kubectl get po
NAME READY STATUS RESTARTS AGE
tensorflow-benchmark-exclusive-9plm8 1/1 Running 0 4m
tensorflow-benchmark-share-w5xt8 1/1 Running 0 4m
当两个pod处于Running以后,分别进入两个pod查看它们的GPU利用率。
进入tensorflow-benchmark-exclusive-9plm8的pod,查看其利用率,执行如下命令:
# kubectl exec -ti tensorflow-benchmark-exclusive-9plm8 -- nvidia-smi
命令输出为:
可以看到,GPU利用率为91%,pod可用显存为32510MiB(使用的是整张卡)。
进入tensorflow-benchmark-share-w5xt8的pod,查看其利用率,执行如下命令:
# kubectl exec -ti tensorflow-benchmark-share-w5xt8 -- nvidia-smi
命令输出为:
可以看到,该pod总共可用的显存为10487MiB(10GiB左右显存),GPU利用率为28%(在30%处上下浮动)。
对比这两个任务,有如下的结论:
-
当算力未被限制时(申请整张卡),任务的GPU利用率能够达到90%左右。
-
当显存和算力被限制时(申请10GiB显存和30%算力),任务最大可使用的显存为10GiB,GPU利用率被限制30%左右。
可以看到算力限制是生效的。
监控
从容器服务GPU监控大盘中可以查看任务分配的算力,从下图中可以看到tensorflow-benchmark-share-w5xt8申请了30%算力:
也可以查看该任务所在节点已分配的算力,从下图中可以看到节点的0号卡已分配30%算力:
还可以查看该节点上已分配的显存比例,从下图中可以看到该节点的0号卡已分配32.3%的显存: