GPU监控2.0基于NVIDIA DCGM实现对集群GPU节点的全方位监控。本文介绍如何使用GPU监控2.0监控ACK集群中的GPU资源。
前提条件
已创建Kubernetes集群(ACK专有版集群、ACK集群基础版、ACK集群Pro版或ACK Edge集群),本文以ACK集群Pro版为例。
已安装GPU监控2.0相关组件。具体操作,请参见开启集群GPU监控。
背景信息
GPU监控2.0支持对集群GPU节点进行全方位监控,提供集群维度和节点维度GPU监控大盘。
在集群维度GPU监控大盘,您可以查看集群或节点池维度的相关信息,例如利用率、显存使用、XID错误检测等。
在节点维度GPU监控大盘,您可以查看节点或Pod维度的相关信息,例如利用率、显存使用等。
注意事项
当前GPU监控指标的采集间隔时间为15s,与指标产生的时间相比,Grafana监控大盘展示的数据有一定的延迟。因此可能会出现在某个时间点,从监控大盘显示某个节点没有可分配的显存,但是某个Pod还能调度到该节点上。出现该现象可能是指标产生的时间点到下一次产生的15s间隔时间内,有Pod完成了任务,释放了GPU资源,调度器感知后,将处于Pending的Pod调度到这个节点上。
监控大盘只支持监控通过在Pod中配置
resources.limits
的方式申请的GPU资源。更多信息,请参见为Pod和容器管理资源。节点使用GPU资源时存在以下情况,可能会导致监控大盘的数据不准确:
直接在节点上运行GPU应用。
通过
docker run
命令直接启动容器运行GPU应用。在Pod的
env
中直接添加环境变量NVIDIA_VISIBLE_DEVICES=all
或NVIDIA_VISIBLE_DEVICES=<GPU ID>
等,通过环境变量NVIDIA_VISIBLE_DEVICES
直接为Pod申请GPU资源,并且运行了GPU程序。在Pod的
securityContext
中配置privileged: true
,并且运行了GPU程序。在Pod中未设置环境变量
NVIDIA_VISIBLE_DEVICES
,但Pod所使用的镜像在制作时,默认配置环境变量NVIDIA_VISIBLE_DEVICES=all
,并且运行了GPU程序。
GPU卡已分配的显存和已使用的显存不一定相同。例如某一张GPU卡共有16 GiB显存,为某个Pod分配了5 GiB显存,但Pod的启动命令为
sleep 1000
,即Pod处于Running但需要经过1000秒后才会使用GPU,因此存在GPU卡已分配的显存为5 GiB,但已使用的显存为0 GiB的情况。
步骤一:创建节点池
Pod按整张卡方式或显存维度申请GPU资源(包括申请GPU算力资源),GPU监控大盘均可以展示其相关指标。本文以在一个集群中创建三个GPU机型的节点池运行Pod,每个节点池存在一个节点为例,展示GPU监控大盘对Pod的监控情况。关于创建节点池的具体步骤,请参见操作步骤。
三个节点池的部分信息如下:
节点池名称 | 节点标签 | Pod申请GPU资源方式 | Pod申请GPU资源示例 | 说明 |
exclusive | - | 按整张卡的维度申请GPU资源。 | nvidia.com/gpu:1 表示申请1张GPU卡。 | - |
share-mem | ack.node.gpu.schedule=cgpu | 按GPU显存维度申请GPU资源。 | aliyun.com/gpu-mem: 5 表示申请5 GiB显存。 | 集群需安装共享GPU组件(整个集群只安装一次即可),详情请参见安装并使用共享GPU组件和资源工具。 |
share-mem-core | ack.node.gpu.schedule=core_mem | 按GPU显存维度申请GPU资源且支持算力申请。 |
表示申请5 GiB显存和一张卡30%的算力。 |
在容器服务管理控制台的节点池页面,三个节点池状态显示为已激活,说明节点池创建完成。
步骤二:部署GPU应用
节点池创建完成后,为了验证节点GPU相关指标是否正常,需要在节点上运行一些GPU应用,本文以运行Tensorflow Benchmark项目为例,在每个节点池创建一个任务。运行Tensorflow Benchmark项目至少需要9 GiB显存,本文以申请10 GiB显存为例进行说明。关于Tensorflow Benchmark的更多信息,请参见Tensorflow Benchmark。
三个任务的部分信息如下:
任务名称 | 任务运行的节点池 | 申请的GPU资源 |
tensorflow-benchmark-exclusive | exclusive | nvidia.com/gpu: 1 表示申请1张GPU卡。 |
tensorflow-benchmark-share-mem | share-mem | aliyun.com/gpu-mem: 10 表示申请10 GiB显存。 |
tensorflow-benchmark-share-mem-core | share-mem-core |
表示申请10 GiB显存和1张GPU卡的30%算力。 |
创建Job文件。
使用以下YAML内容,创建tensorflow-benchmark-exclusive.yaml文件。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-exclusive spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-exclusive 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=5000000 - --batch_size=8 resources: limits: nvidia.com/gpu: 1 #申请1张GPU卡。 workingDir: /root restartPolicy: Never
使用以下YAML内容,创建tensorflow-benchmark-share-mem.yaml文件。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-share-mem spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-share-mem 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=5000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 #申请10 GiB显存。 workingDir: /root restartPolicy: Never
使用以下YAML内容,创建tensorflow-benchmark-share-mem-core.yaml文件。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-benchmark-share-mem-core spec: parallelism: 1 template: metadata: labels: app: tensorflow-benchmark-share-mem-core 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=5000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 #申请10 GiB显存。 aliyun.com/gpu-core.percentage: 30 #申请1张卡的30%算力。 workingDir: /root restartPolicy: Never
部署Job任务。
执行以下命令,部署tensorflow-benchmark-exclusive。
kubectl apply -f tensorflow-benchmark-exclusive.yaml
执行以下命令,部署tensorflow-benchmark-share-mem。
kubectl apply -f tensorflow-benchmark-share-mem.yaml
执行以下命令,部署tensorflow-benchmark-share-mem-core。
kubectl apply -f tensorflow-benchmark-share-mem-core.yaml
执行以下命令,查看Pod的运行状态。
kubectl get po
预期输出:
NAME READY STATUS RESTARTS AGE tensorflow-benchmark-exclusive-7dff2 1/1 Running 0 3m13s tensorflow-benchmark-share-mem-core-k24gz 1/1 Running 0 4m22s tensorflow-benchmark-share-mem-shmpj 1/1 Running 0 3m46s
由预期输出得到,3个Pod处于
Running
状态,表示Job任务部署成功。
步骤三:查看GPU监控2.0大盘
查看集群维度GPU监控大盘
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Prometheus监控大盘列表页面,单击GPU监控页签,然后单击集群GPU监控-集群维度页签。
集群维度监控大盘的信息如下,更多信息,请参见集群维度监控大盘。
序号
Panel名称
说明
①
Total GPU Nodes
共有3个GPU节点。
②
Allocated GPUs
GPU总数为3,已分配GPU数为1.6。
说明如果是按整张卡维度申请GPU,一张卡分配的比例为1;如果是共享GPU调度,分配比例为某张卡已分配的显存与这张卡总显存的比例。
③
Allocated GPU Memory
已分配54.84%的显存。
④
Used GPU Memory
已使用26.33%的显存。
⑤
Average GPU Utilization
所有卡的平均利用率为70%。
⑥
GPU Memory Copy Utilization
所有卡的平均内存复制利用率为30%。
⑦
GPU Pod Details
集群申请GPU资源的Pod信息,包括Pod所在的命名空间、Pod名称、节点名称、已使用的显存等。
说明Allocated GPU Memory表示为Pod分配的显存。如果是共享GPU调度,节点在上报API Server每张卡总的显存时,仅支持上报整数,所以上报的显存数为节点的真实显存向下取整。例如节点上某张卡的总显存为31.7 GiB,节点上报给API Server时,只能上报31 GiB,如果Pod申请了10 GiB,那么为该Pod分配的真实显存为31.7*(10/31)=10.2 GiB。
Allocated Computing Power表示为Pod分配的算力。如果Pod没有申请算力,则该值显示为“-”,从图中可以看到名为tensorflow-benchmark-share-mem-core-k24gz的Pod申请了30%的算力。
⑧
GPU Node Details
集群中GPU节点的信息,包括节点名称、GPU卡索引号、GPU利用率、内存控制器利用率等。
查看节点维度GPU监控大盘
在Prometheus监控大盘列表页面,单击GPU监控页签,然后单击集群GPU监控-节点维度页签,选择目标GPUNode。
本文以GPUNode为cn-beijing.192.168.10.167为例。节点维度监控大盘的信息如下,更多信息,请参见节点维度监控大盘。
Panel组 | 序号 | Panel名称 | 说明 |
Overview | ① | GPU Mode | GPU模式为共享模式,按显存和算力维度申请GPU资源。 |
② | NVIDIA Driver Version | 安装的GPU驱动版本为450.102.04。 | |
③ | Allocated GPUs | 总GPU个数为1,已分配GPU个数为0.32。 | |
④ | GPU Utilization | GPU的平均利用率为27%。 | |
⑤ | Allocated GPU Memory | 已分配的GPU显存值占总显存值的32.3%。 | |
⑥ | Used GPU Memory | 当前使用的GPU显存值占总显存值的26.3%。 | |
⑦ | Allocated Computing Power | 0号GPU卡已分配30%算力。 说明 只有在节点开启算力分配的情况下,节点已分配的算力比例(Allocated Computing Power)才有数据显示,因此本文示例的三个节点,只有cn-beijing.192.168.10.167节点显示数据。 | |
Utilization | ⑧ | GPU Utilization | 0号GPU卡利用率最小值为21%,最大值为31%,平均值为28%。 |
⑨ | Memory Copy Utilization | 0号GPU卡内存复制利用率最小值为8%,最大值为13%,平均值为11%。 | |
Memory&BAR1 | ⑩ | GPU Memory Details | GPU内存信息,包括GPU卡的UUID、索引号、卡型号等。 |
⑪ | BAR1 Used | 已使用BAR1为7 MB。 | |
⑫ | Memory Used | GPU卡已使用的显存大小为8.36 GB。 | |
⑬ | BAR1 Total | 总BAR1为33 GB。 | |
GPU Process | ⑭ | GPU Process Details | GPU线程详细信息,包括Process所属的Pod命名空间、Process所属的Pod名称等。 |
您还可以查看一些高级指标的相关信息,例如剖析(Profiling)、温度&能量(Temperature&Energy)、时钟频率(Clock)、GPU上停用的内存页(Retired Pages)、违规行为(Violation)。