ACK Pro集群支持为应用申请GPU显存和算力,能够帮助您更精细化的使用GPU的显存和算力资源。本文介绍如何使用算力分配功能。
前提条件
- 已创建ACK Pro版集群,且集群版本为1.20.11。具体操作步骤,请参见创建Kubernetes托管版集群。
- 对于不同ACK版本的集群,调度器版本需要满足以下要求。关于调度器各版本支持的功能,请参见kube-scheduler。
ACK版本 调度器版本 1.20 v1.20.4-ack-8.0及以上 1.22 v1.22.15-ack-2.0及以上 1.24 v1.24.3-ack-2.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 华北(张家口) 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页面,单击ack-ai-installer右侧操作列下方的删除。
- 在弹出的删除应用对话框,单击确定。
- 安装新版共享GPU组件。具体操作,请参见安装并使用共享GPU组件和资源工具。
步骤一:创建支持算力分配的节点池
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择 。
- 在节点池页面右侧,单击创建节点池。
部分参数配置说明如下,关于配置项的详细说明,请参见节点池配置。
配置项 说明 节点池名称 设置节点池名称。本文配置为gpu-core。 期望节点数 设置节点池初始节点数量。若您不需要创建节点,请填写为0。 操作系统 操作系统仅支持CentOS 7.x和Alibaba Cloud Linux 2.x。 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节点切换为算力隔离模式。 - 开启节点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显存和算力的任务。
cat > /tmp/cuda-sample.yaml <<-EOF 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:cuda-sample-11.0.3 command: - bandwidthTest resources: limits: #申请2 GiB显存。 aliyun.com/gpu-mem: 2 #申请一张GPU卡的30%算力。 aliyun.com/gpu-core.percentage: 30 workingDir: /root restartPolicy: Never EOF
- 执行以下命令,提交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能够使用的总显存为该GPU卡的总显存,本文为15 GiB(在节点上执行
- 使用以下命令,查看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