监控集群GPU资源最佳实践

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=allNVIDIA_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资源且支持算力申请。

  • aliyun.com/gpu-mem: 5

  • aliyun.com/gpu-core.percentage: 30

表示申请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

  • aliyun.com/gpu-mem: 10

  • aliyun.com/gpu-core.percentage: 30

表示申请10 GiB显存和1张GPU卡的30%算力。

  1. 创建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
  2. 部署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
  3. 执行以下命令,查看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监控大盘

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > Prometheus监控

  3. 在Prometheus监控大盘列表页面,单击GPU监控页签,然后单击集群GPU监控-集群维度页签。

    集群维度监控大盘的信息如下,更多信息,请参见集群维度监控大盘集群GPU监控-集群维度GPU Pod DetailsGPU Node Details

    序号

    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

本文以GPUNodecn-beijing.192.168.10.167为例。节点维度监控大盘的信息如下,更多信息,请参见节点维度监控大盘

集群GPU监控-节点维度UtilizationMemory&BAR1GPU Process

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)。高级指标