使用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,以便获得更好的观测性体验。
- 插件部署模式需选择“本地数据存储”。
- 对接Grafana的配置在3.9.0以下版本的云原生监控插件中支持。对于3.9.0及以上版本的插件,如果存在使用Grafana的需求,请单独安装Grafana插件,详情请参见安装Grafana。
手动部署dcgm-exporter组件
本文在集群部署dcgm-exporter组件进行GPU指标的采集,同时以9400端口对外暴露GPU指标。
- 登录一台使用docker容器引擎集群节点,且该节点需绑定EIP用于拉取公网镜像。
- 将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
- 上传dcgm-exporter镜像到SWR。
- (可选)登录SWR管理控制台,选择左侧导航栏的“组织管理”,单击页面右上角的“创建组织”,创建一个组织。
- 在左侧导航栏选择“我的镜像”,单击右侧“客户端上传”,在弹出的页面中单击“生成临时登录指令”,单击复制登录指令。
- 在集群节点上执行上一步复制的登录指令,登录成功会显示“Login Succeeded”。
- 为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
- 上传镜像至镜像仓库。
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
- 返回容器镜像服务控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。
- 部署核心组件dcgm-exporter
在CCE中部署dcgm-exporter,需要添加一些特定配置,才可以正常监控GPU信息。详细yaml如下,其中yaml中标红的部分为较为重要的配置项。
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"
- 监控应用GPU指标
- 确认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>
- 调用dcgm-exporter接口,验证采集的应用GPU信息。
- 确认dcgm-exporter组件正常运行:
- Prometheus页面查看指标监控信息
安装完Prometheus相关插件后,Prometheus默认会创建ClusterIP类型的服务,如果需要对外暴露,需要将Prometheus发布为外部访问(NodePort类型或LoadBalancer类型),详情请参见使用Prometheus插件监控。
如下图,可以看到GPU节点上的GPU利用率以及其他相关指标,更多GPU指标请参见可观测指标。
- 登录Grafana页面查看GPU信息
如您安装了Grafana,您可通过导入NVIDIA DCGM Exporter Dashboard来展示gpu的相关指标信息。
关于在Grafana导入Dashboard的方法,请参见Manage dashboards。
可观测指标
以下是一些常用的GPU观测指标,更多指标详情请参见Field Identifiers。
指标名称 |
指标类型 |
单位 |
说明 |
---|---|---|---|
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 |
% |
解码器利用率 |
指标名称 |
指标类型 |
单位 |
说明 |
---|---|---|---|
DCGM_FI_DEV_FB_FREE |
Gauge |
MB |
表示帧缓存剩余数,帧缓存一般被称为显存 |
DCGM_FI_DEV_FB_USED |
Gauge |
MB |
表示帧缓存已使用数,该值与nvidia-smi命令中memory-usage的已使用值对应 |
指标名称 |
指标类型 |
单位 |
说明 |
---|---|---|---|
DCGM_FI_DEV_GPU_TEMP |
Gauge |
摄氏度 |
设备的当前GPU温度读数 |
DCGM_FI_DEV_POWER_USAGE |
Gauge |
W |
设备的电源使用情况 |