文档首页/ 云容器引擎 CCE/ 最佳实践/ 监控/ 使用dcgm-exporter监控GPU指标
更新时间:2024-11-12 GMT+08:00

使用dcgm-exporter监控GPU指标

应用场景

集群中包含GPU节点时,需要了解GPU应用使用节点GPU资源的情况,例如GPU利用率、显存使用量、GPU运行的温度、GPU的功率等。在获取GPU监控指标后,用户可根据应用的GPU指标配置弹性伸缩策略,或者根据GPU指标设置告警规则。本文基于开源Prometheus和DCGM Exporter实现丰富的GPU观测场景,关于DCGM Exporter的更多信息,请参见DCGM Exporter

由于DCGM Exporter为社区开源组件,因此本实践仅适用于监控Kubernetes社区原生的GPU资源(nvidia.com/gpu),不支持监控CCE提供的GPU虚拟化资源。

前提条件

  • 目标集群已创建,且集群中包含GPU节点,并已运行GPU相关业务。
  • 在集群中安装CCE AI 套件 (NVIDIA GPU)和云原生监控插件。
    • CCE AI 套件 (NVIDIA GPU)是在容器中使用GPU显卡的设备管理插件,集群中使用GPU节点时必须安装该插件。安装GPU驱动时,需要匹配GPU类型和CUDA版本选择对应的驱动进行安装。
    • 云原生监控插件(kube-prometheus-stack)负责监控集群相关指标信息,安装时可选择对接Grafana,以便获得更好的观测性体验。
      • 插件部署模式需选择“Server模式”。
      • 对接Grafana的配置在3.9.0以下版本的云原生监控插件中支持。对于3.9.0及以上版本的插件,如果存在使用Grafana的需求,请单独安装Grafana插件。

采集GPU监控指标

本文在集群部署dcgm-exporter组件进行GPU指标的采集,同时以9400端口对外暴露GPU指标。

  1. 登录一台使用docker容器引擎集群节点,且该节点需绑定EIP用于拉取公网镜像。
  2. 将dcgm-exporter镜像拉取到本地。该镜像地址来自DCGM官方示例,详情请参见https://github.com/NVIDIA/dcgm-exporter/blob/main/dcgm-exporter.yaml

    docker pull nvcr.io/nvidia/k8s/dcgm-exporter:3.0.4-3.0.0-ubuntu20.04

  3. 上传dcgm-exporter镜像到SWR。

    1. (可选)登录SWR管理控制台,选择左侧导航栏的“组织管理”,单击页面右上角的“创建组织”,创建一个组织。

      如已有组织可跳过此步骤。

    2. 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
    3. 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
    4. 为dcgm-exporter镜像打标签。

      docker tag [镜像名称1:版本名称1] [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2]

      • [镜像名称1:版本名称1]:请替换为您本地所要上传的实际镜像的名称和版本名称。
      • [镜像仓库地址]:可在SWR控制台上查询,2中登录指令末尾的域名即为镜像仓库地址。
      • [组织名称]:请替换为1中创建的组织。
      • [镜像名称2:版本名称2]:请替换为SWR镜像仓库中需要显示的镜像名称和镜像版本。

      示例:

      docker tag nvcr.io/nvidia/k8s/dcgm-exporter:3.0.4-3.0.0-ubuntu20.04 swr.cn-east-3.myhuaweicloud.com/container/dcgm-exporter:3.0.4-3.0.0-ubuntu20.04
    5. 上传镜像至镜像仓库。

      docker push [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2]

      示例:

      docker push swr.cn-east-3.myhuaweicloud.com/container/dcgm-exporter:3.0.4-3.0.0-ubuntu20.04

      终端显示如下信息,表明上传镜像成功。

      489a396b91d1: Pushed 
      ... 
      c3f11d77a5de: Pushed 
      3.0.4-3.0.0-ubuntu20.04: digest: sha256:bd2b1a73025*** size: 2414
    6. 返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。

  4. 部署核心组件dcgm-exporter

    在CCE中部署dcgm-exporter,需要添加一些特定配置,才可以正常监控GPU信息。详细yaml如下,其中yaml中标红的部分为较为重要的配置项。

    当云原生监控插件对接AOM后,指标会上报到您选择的AOM实例,其中容器基础指标免费,自定义指标将由AOM服务进行收费,详情请参见价格详情

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: "dcgm-exporter"
      namespace: "monitoring"      #请根据实际情况选择命名空间安装
      labels:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "3.0.0"
    spec:
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app.kubernetes.io/name: "dcgm-exporter"
          app.kubernetes.io/version: "3.0.0"
      template:
        metadata:
          labels:
            app.kubernetes.io/name: "dcgm-exporter"
            app.kubernetes.io/version: "3.0.0"
          name: "dcgm-exporter"
        spec:
          containers:
          - image: "swr.cn-east-3.myhuaweicloud.com/container/dcgm-exporter:3.0.4-3.0.0-ubuntu20.04"   #dcgm-exporter的SWR镜像地址,该地址为5中的镜像地址。
            env:
            - name: "DCGM_EXPORTER_LISTEN"                   # 服务端口号
              value: ":9400"
            - name: "DCGM_EXPORTER_KUBERNETES"               # 支持Kubernetes指标映射到Pod
              value: "true"
            - name: "DCGM_EXPORTER_KUBERNETES_GPU_ID_TYPE"   # GPU ID类型,可选值为uid或device-name
              value: "device-name"
            name: "dcgm-exporter"
            ports:
            - name: "metrics"
              containerPort: 9400
            resources:      #建议根据实际情况配置资源使用申请值和限制值
              limits:
                cpu: '200m'
                memory: '256Mi'
              requests:
                cpu: 100m
                memory: 128Mi
            securityContext:      #需要给dcgm-exporter容器开启特权模式
              privileged: true
              runAsNonRoot: false
              runAsUser: 0
            volumeMounts:
            - name: "pod-gpu-resources"
              readOnly: true
              mountPath: "/var/lib/kubelet/pod-resources"
            - name: "nvidia-install-dir-host"      #dcgm-exporter镜像中配置的环境变量依赖容器中的/usr/local/nvidia目录下的文件
              readOnly: true
              mountPath: "/usr/local/nvidia"
          imagePullSecrets:
            - name: default-secret
          volumes:
          - name: "pod-gpu-resources"
            hostPath:
              path: "/var/lib/kubelet/pod-resources"
          - name: "nvidia-install-dir-host"       #GPU驱动的安装目录
            hostPath:
              path: "/opt/cloud/cce/nvidia"       #GPU插件版本为2.0.0及以上时,该驱动的安装目录需替换为"/usr/local/nvidia"
          affinity:       #CCE在创建GPU节点时生成的标签,部署该监控组件可根据这个标签设置节点亲和。
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: accelerator
                    operator: Exists
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: "dcgm-exporter"
      namespace: "monitoring"      #请根据实际情况选择命名空间安装
      labels:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "3.0.0"
    spec:
      selector:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "3.0.0"
      ports:
      - name: "metrics"
        port: 9400
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        app.kubernetes.io/name: "dcgm-exporter"
        app.kubernetes.io/version: "3.0.0"
      name: dcgm-exporter
      namespace: monitoring     #请根据实际情况选择命名空间安装
    spec:
      endpoints:
      - honorLabels: true
        interval: 15s
        path: /metrics
        port: metrics
        relabelings:
        - action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        - action: replace
          sourceLabels:
          - __meta_kubernetes_namespace
          targetLabel: kubernetes_namespace
        - action: replace
          sourceLabels:
          - __meta_kubernetes_service_name
          targetLabel: kubernetes_service
        scheme: http
      namespaceSelector:
        matchNames:
        - monitoring        #请根据实际情况选择命名空间
      selector:
        matchLabels:
          app.kubernetes.io/name: "dcgm-exporter"

  5. 监控应用GPU指标

    1. 确认dcgm-exporter组件正常运行:
      kubectl get po -n monitoring -owide

      回显如下:

      # kubectl get po -n monitoring -owide
      NAME                                        READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
      alertmanager-alertmanager-0                 0/2     Pending   0          19m   <none>         <none>         <none>           <none>
      custom-metrics-apiserver-5bb67f4b99-grxhq   1/1     Running   0          19m   172.16.0.6     192.168.0.73   <none>           <none>
      dcgm-exporter-hkr77                         1/1     Running   0          17m   172.16.0.11    192.168.0.73   <none>           <none>
      grafana-785cdcd47-9jlgr                     1/1     Running   0          19m   172.16.0.9     192.168.0.73   <none>           <none>
      kube-state-metrics-647b6585b8-6l2zm         1/1     Running   0          19m   172.16.0.8     192.168.0.73   <none>           <none>
      node-exporter-xvk82                         1/1     Running   0          19m   192.168.0.73   192.168.0.73   <none>           <none>
      prometheus-operator-5ff8744d5f-mhbqv        1/1     Running   0          19m   172.16.0.7     192.168.0.73   <none>           <none>
      prometheus-server-0                         2/2     Running   0          19m   172.16.0.10    192.168.0.73   <none>           <none>
    2. 调用dcgm-exporter接口,验证采集的应用GPU信息。
      其中172.16.0.11为dcgm-exporter组件的Pod IP。
      curl 172.16.0.11:9400/metrics | grep DCGM_FI_DEV_GPU_UTIL

  6. Prometheus页面查看指标监控信息。

    安装完Prometheus相关插件后,Prometheus默认会创建ClusterIP类型的服务,如果需要对外暴露,需要将Prometheus发布为外部访问(NodePort类型或LoadBalancer类型),详情请参见使用Prometheus插件监控

    如下图,可以看到GPU节点上的GPU利用率以及其他相关指标,更多GPU指标请参见可观测指标

  7. 登录Grafana页面查看GPU信息

    如您安装了Grafana,您可通过导入NVIDIA DCGM Exporter Dashboard来展示gpu的相关指标信息。

    关于在Grafana导入Dashboard的方法,请参见Manage dashboards

可观测指标

以下是一些常用的GPU观测指标,更多指标详情请参见Field Identifiers

表1 利用率

指标名称

指标类型

单位

说明

DCGM_FI_DEV_GPU_UTIL

Gauge

%

GPU利用率

DCGM_FI_DEV_MEM_COPY_UTIL

Gauge

%

内存利用率

DCGM_FI_DEV_ENC_UTIL

Gauge

%

编码器利用率

DCGM_FI_DEV_DEC_UTIL

Gauge

%

解码器利用率

表2 内存指标

指标名称

指标类型

单位

说明

DCGM_FI_DEV_FB_FREE

Gauge

MB

表示帧缓存剩余数,帧缓存一般被称为显存

DCGM_FI_DEV_FB_USED

Gauge

MB

表示帧缓存已使用数,该值与nvidia-smi命令中memory-usage的已使用值对应

表3 温度及功率指标

指标名称

指标类型

单位

说明

DCGM_FI_DEV_GPU_TEMP

Gauge

摄氏度

设备的当前GPU温度读数

DCGM_FI_DEV_POWER_USAGE

Gauge

W

设备的电源使用情况