
# 使用dcgm-exporter监控GPU指标
#### 应用场景
集群中包含GPU节点时，需要了解GPU应用使用节点GPU资源的情况，例如GPU利用率、显存使用量、GPU运行的温度、GPU的功率等。在获取GPU监控指标后，用户可根据应用的GPU指标配置弹性伸缩策略，或者根据GPU指标设置告警规则。本文基于开源Prometheus和DCGM Exporter实现丰富的GPU观测场景，关于DCGM Exporter的更多信息，请参见[DCGM Exporter](https://github.com/NVIDIA/dcgm-exporter)。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
由于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，以便获得更好的观测性体验。
    ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
    - 插件部署模式需选择"本地数据存储"。
    
    - 对接Grafana的配置在3.9.0以下版本的云原生监控插件中支持。对于3.9.0及以上版本的插件，如果存在使用Grafana的需求，请单独安装Grafana插件，详情请参见[安装Grafana](https://support.huaweicloud.com/usermanual-cce/cce_10_0828.html)。
      
   
 
#### 通过插件部署dcgm-exporter组件
1. **通过插件部署核心组件dcgm-exporter**
   
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧导航栏中选择"插件中心"，在右侧找到**CCE AI套件（NVIDIA GPU）**插件，单击"安装"。
   
   2. 选择"启用dcgm-exporter组件进行DCGM指标观测"，开启后将在GPU节点上同时部署dcgm-exporter组件。
      ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
      插件版本为2.7.40及以上时，支持部署dcgm-exporter组件。
      启用dcgm-exporter组件后，采集的GPU监控数据如需上报AOM服务，请在云原生监控插件中开启上报至AOM服务开关。对于上报至AOM服务的GPU指标属于自定义指标，将进行按需收费，详情请参见[价格详情](https://www.huaweicloud.com/pricing.html#/aom)。
      
   
   3. 设置插件支持的其他参数配置，单击"安装"。参数配置详情请参见[CCE AI套件（NVIDIA GPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0141.html)。
   
   
   
   
2. **监控应用GPU** **指标**
   
   1. 确认dcgm-exporter组件正常运行：
      ```
      kubectl get pod -n kube-system -owide
      ```
      回显如下：
      ```
      NAME                                        READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
      dcgm-exporter-hkr77                         1/1     Running   0          17m   172.16.0.11    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
      ```
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002134467981.png "点击放大")
      
   
   
   
   
3. **开启云原生监控插件的自定义指标开关**
   
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
   
   2. 在左侧导航栏中选择"插件中心"，找到已安装的云原生监控插件，单击"编辑"。
   
   3. 在"参数配置"中，开启"自定义指标采集"。 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002114376876.png "点击放大")
      
      
   
   4. 单击"确定"，完成插件配置更新。
   
   
   
   
4. **开启dcgm-exporter组件的指标采集**
   
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
   
   2. 在左侧导航栏中选择"配置中心"，切换至"监控运维配置"页签。
   
   3. 在"采集配置"中找到"ServiceMonitor"，单击"管理"。
   
   4. 找到dcgm-exporter组件的ServiceMonitor并开启。 ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002147497753.png "点击放大")
      
      
   
   
   
   
5. **Prometheus** **页面查看指标监控信息**
   
   安装完Prometheus相关插件后，Prometheus默认会创建ClusterIP类型的服务，如果需要对外暴露，需要将Prometheus发布为外部访问（NodePort类型或LoadBalancer类型），详情请参见[使用Prometheus插件监控](https://support.huaweicloud.com/usermanual-cce/cce_10_0373.html)。
   如下图，可以看到GPU节点上的GPU利用率以及其他相关指标，更多GPU指标请参见[可观测指标]。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002193062105.png "点击放大")
   
   
6. **登录Grafana** **页面查看GPU** **信息**
   
   如您安装了Grafana，您可通过导入[NVIDIA DCGM Exporter Dashboard](https://grafana.com/grafana/dashboards/12239)来展示gpu的相关指标信息。
   关于在Grafana导入Dashboard的方法，请参见[Manage dashboards](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/#import-a-dashboard)。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002134348341.png "点击放大")
   
   
 
#### 手动部署dcgm-exporter组件
本文在集群部署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. 在左侧导航栏选择"我的镜像"，单击右侧"客户端上传"，在弹出的页面中单击"生成临时登录指令"，单击![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001494202041.png)复制登录指令。
   
   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中标红的部分为较为重要的配置项。
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
   当云原生监控插件对接AOM后，指标会上报到您选择的AOM实例，其中容器[基础指标](https://support.huaweicloud.com/productdesc-aom2/aom_01_0023.html)免费，自定义指标将由AOM服务进行收费，详情请参见[价格详情](https://www.huaweicloud.com/pricing.html#/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
      dcgm-exporter-hkr77                         1/1     Running   0          17m   172.16.0.11    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
      ```
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001493839745.png "点击放大")
      
   
   
   
   
6. **Prometheus** **页面查看指标监控信息**
   
   安装完Prometheus相关插件后，Prometheus默认会创建ClusterIP类型的服务，如果需要对外暴露，需要将Prometheus发布为外部访问（NodePort类型或LoadBalancer类型），详情请参见[使用Prometheus插件监控](https://support.huaweicloud.com/usermanual-cce/cce_10_0373.html)。
   如下图，可以看到GPU节点上的GPU利用率以及其他相关指标，更多GPU指标请参见[可观测指标]。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001444079216.png "点击放大")
   
   
7. **登录Grafana** **页面查看GPU** **信息**
   
   如您安装了Grafana，您可通过导入[NVIDIA DCGM Exporter Dashboard](https://grafana.com/grafana/dashboards/12239)来展示gpu的相关指标信息。
   关于在Grafana导入Dashboard的方法，请参见[Manage dashboards](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/#import-a-dashboard)。
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001493959721.png "点击放大")
   
   
 
 #### 可观测指标
以下是一些常用的GPU观测指标，更多指标详情请参见[Field Identifiers](https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/dcgm-api-field-ids.html#)。
表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   | 设备的电源使用情况    |
   
