DCGM Exporter
简介
DCGM-Exporter 是一个基于 Go API 的工具,用于 NVIDIA DCGM,允许用户收集 GPU 指标并了解工作负载行为或监控集群中的 GPU。DCGM Exporter 使用 Go 编写,并在 HTTP 端点 (/metrics
) 上公开 GPU 指标,用于 Prometheus 等监控解决方案。
有关 DCGM 提供的分析指标的信息,请参阅 DCGM 文档中的 分析 (Profiling)。
您可以将 DCGM Exporter 作为独立容器运行,或者在 Kubernetes 集群中的 GPU 节点上部署为 DaemonSet。
由于 DCGM Exporter 启动 nv-hostengine 作为嵌入式进程(用于收集指标),因此如果 DCGM Exporter 在已运行 DCGM(或者说是 nv-hostengine)的系统(例如 NVIDIA DGX)上运行,则应使用适当的配置选项。
运行 DCGM Exporter
DCGM Exporter 容器可以使用 Docker 等容器引擎运行。在此模式下,DCGM Exporter 启动 nv-hostengine 作为嵌入式进程并开始发布指标

$ DCGM_EXPORTER_VERSION=2.1.4-2.3.1 && \
docker run -d --rm \
--gpus all \
--net host \
--cap-add SYS_ADMIN \
nvcr.io/nvidia/k8s/dcgm-exporter:${DCGM_EXPORTER_VERSION}-ubuntu20.04 \
-f /etc/dcgm-exporter/dcp-metrics-included.csv
检索指标
$ curl localhost:9400/metrics
# HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz).
# TYPE DCGM_FI_DEV_SM_CLOCK gauge
# HELP DCGM_FI_DEV_MEM_CLOCK Memory clock frequency (in MHz).
# TYPE DCGM_FI_DEV_MEM_CLOCK gauge
# HELP DCGM_FI_DEV_MEMORY_TEMP Memory temperature (in C).
# TYPE DCGM_FI_DEV_MEMORY_TEMP gauge
...
DCGM_FI_DEV_SM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 139
DCGM_FI_DEV_MEM_CLOCK{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 405
DCGM_FI_DEV_MEMORY_TEMP{gpu="0", UUID="GPU-604ac76c-d9cf-fef3-62e9-d92044ab6e52"} 9223372036854775794
...
DCGM-Exporter 定制
DCGM-Exporter 提供了各种选项来调整其默认行为。每个选项都支持命令行标志和环境变量。
环境变量 |
命令行标志 |
值 |
---|---|---|
|
|
文件路径 |
包含要收集的 DCGM 字段的文件路径。默认值:“/etc/dcgm-exporter/default-counters.csv” |
||
|
|
地址 |
监听 http 服务器的地址。默认值:“:9400” |
||
|
|
间隔 |
收集指标的时间间隔。单位为毫秒。默认值:30000 |
||
|
|
布尔值 |
启用 Kubernetes 映射指标到 Kubernetes Pod。默认值:false |
||
|
|
命名空间:名称 |
包含要收集的 DCGM 字段的 ConfigMap 命名空间和名称。默认值:“none” |
||
|
|
主机:端口 |
连接到 Host:Port 上的远程 hostengine。默认值:NA(dcgm-exporter 将以嵌入模式启动) |
||
|
|
设备字符串(请参阅以下注释) |
指定要监视的设备。默认值:MIG 模式下的所有 GPU 实例,如果禁用 MIG,则为所有 GPU。 |
||
注意
设备字符串语法:[f] | [g[:id1[,-id2]]] | [i[:id1[,-id2]]]
如果使用 ID 列表,则系统上必须存在具有匹配 ID 的设备。例如
f
= 如果禁用 MIG,则监视所有 GPU;如果启用 MIG,则监视所有 GPU 实例g
= 监视所有 GPUi
= 监视所有 GPU 实例g:0,1
= 监视 GPU 0 和 1i:0,2-4
= 监视 GPU 实例 0、2、3 和 4。
警告
-i
只有在启用 MIG 模式时才能指定。任何时候指定索引,这些索引都必须存在于系统上。
在 MIG 模式下,只能指定
f
或带范围的i
。GPU 未分配给 Pod,因此报告必须在 GPU 实例级别进行。(默认值:f
)
连接到现有的 DCGM 代理
在这种情况下,系统镜像包含 DCGM 并且已经运行了 nv-hostengine。例如,DGX 系统在其系统镜像中捆绑了驱动程序、DCGM 等。为了避免任何兼容性问题,建议 DCGM Exporter 连接到现有的 nv-hostengine 守护程序以收集/发布 GPU 遥测数据。
警告
DCGM Exporter 容器镜像包含一个 DCGM 客户端库 (libdcgm.so
),用于与 nv-hostengine 通信。在此部署场景中,我们让 DCGM Exporter(或者说是 libdcgm.so
)连接到主机上运行的现有 nv-hostengine。DCGM 客户端库使用内部协议与 nv-hostengine 交换信息。为了避免容器镜像的 DCGM 客户端库与主机的 nv-hostengine 之间可能存在的任何不兼容性,强烈建议使用 DCGM Exporter 基于的 DCGM 版本大于或等于(但不小于)主机上运行的 DCGM 版本。这可以通过比较 DCGM Exporter 镜像的版本标签并在主机上运行 nv-hostengine --version
来轻松确定。
在这种情况下,我们使用 -r
选项连接到现有的 nv-hostengine 进程
$ DCGM_EXPORTER_VERSION=2.1.4-2.3.1 &&
docker run -d --rm \
--gpus all \
--net host \
--cap-add SYS_ADMIN \
nvcr.io/nvidia/k8s/dcgm-exporter:${DCGM_EXPORTER_VERSION}-ubuntu20.04 \
-r localhost:5555 -f /etc/dcgm-exporter/dcp-metrics-included.csv
连接到 DCGM 独立容器
在这种情况下,DCGM nv-hostengine 在同一主机上的单独容器中运行,使其客户端端口可用于 DCGM-Exporter 以及 dcgmi 客户端命令。

警告
与连接到现有 DCGM 代理时的警告类似,DCGM Exporter 容器镜像包含一个 DCGM 客户端库 (libdcgm.so
),用于与在单独容器中运行的 nv-hostengine 通信。DCGM-Exporter 使用的 DCGM 客户端库使用内部协议与 nv-hostengine 交换信息。为了避免容器镜像的 DCGM 客户端库与独立 DCGM 容器的 nv-hostengine 之间可能存在的任何不兼容性,强烈建议确保 DCGM Exporter 基于的 DCGM 版本大于或等于(但不小于)独立容器中运行的 DCGM 版本。这可以通过比较 DCGM Exporter 和 dcgm 独立镜像的版本标签来轻松确定。
首先,启动独立的 DCGM 容器,并使 nv-hostengine 端口可用于外部应用程序
$DCGM_VERSION=2.2.9 &&
docker run -d --rm \
--gpus all \
--cap-add SYS_ADMIN \
-p 5555:5555 \
nvidia/dcgm:${DCGM_VERSION}-ubuntu20.04
其次,使用 r
选项启动 dcgm-exporter 容器,以连接到现有的 nv-hostengine 端口
$DCGM_EXPORTER_VERSION=2.2.9-2.5.0 &&
docker run -d --rm \
--gpus all \
--net host \
--cap-add SYS_ADMIN \
nvcr.io/nvidia/k8s/dcgm-exporter:${DCGM_EXPORTER_VERSION}-ubuntu20.04 \
-r localhost:5555 -f /etc/dcgm-exporter/dcp-metrics-included.csv
在这种情况下,主机上运行的 dcgmi 命令也将连接到独立 DCGM 容器中运行的 nv-hostengine
dcgmi discovery -l
1 GPU found.
+--------+----------------------------------------------------------------------+
| GPU ID | Device Information |
+--------+----------------------------------------------------------------------+
| 0 | Name: Quadro RTX 6000 |
| | PCI Bus ID: 00000000:65:00.0 |
| | Device UUID: GPU-2f6576bf-3c29-1fbb-068d-e74c4a97f0c5 |
+--------+----------------------------------------------------------------------+
多实例 GPU (MIG) 支持
新的多实例 GPU (MIG) 功能允许基于 NVIDIA Ampere 架构的 GPU 安全地划分为最多七个独立的 GPU 实例,用于 CUDA 应用程序,为多个用户提供独立的 GPU 资源,以实现最佳 GPU 利用率。
有关 MIG 的更多信息,请参阅 MIG 用户指南。
注意
DCGM Exporter 中对 MIG 的支持从 2.4.0-rc.2
版本开始添加。在上面的命令行示例中,将容器镜像替换为此标签:2.1.8-2.4.0-rc.2-ubuntu20.04
。如果您要连接到主机系统上现有的 DCGM,请确保您升级到主机系统上的至少 2.1.8 版本。
DCGM Exporter 发布整个 GPU 以及各个 MIG 设备(或 GPU 实例)的指标,如下面的输出所示
DCGM_FI_DEV_SM_CLOCK{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 1215
DCGM_FI_DEV_MEM_CLOCK{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 1215
DCGM_FI_DEV_MEMORY_TEMP{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 69
DCGM_FI_DEV_GPU_TEMP{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 61
DCGM_FI_DEV_POWER_USAGE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 409.692000
DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 319159391
DCGM_FI_DEV_PCIE_REPLAY_COUNTER{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0
DCGM_FI_DEV_XID_ERRORS{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0
DCGM_FI_DEV_FB_FREE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 35690
DCGM_FI_DEV_FB_USED{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 4845
DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0
DCGM_FI_DEV_VGPU_LICENSE_STATUS{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0
DCGM_FI_PROF_GR_ENGINE_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0.995630
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0.929260
DCGM_FI_PROF_DRAM_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 0.690789
DCGM_FI_PROF_PCIE_TX_BYTES{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 33011804
DCGM_FI_PROF_PCIE_RX_BYTES{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 97863601
DCGM_FI_DEV_XID_ERRORS{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",GPU_I_PROFILE="1g.5gb",GPU_I_ID="13",Hostname="ub20-a100-k8s"} 0
DCGM_FI_PROF_GR_ENGINE_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",GPU_I_PROFILE="1g.5gb",GPU_I_ID="13",Hostname="ub20-a100-k8s"} 0.995687
DCGM_FI_PROF_PIPE_TENSOR_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",GPU_I_PROFILE="1g.5gb",GPU_I_ID="13",Hostname="ub20-a100-k8s"} 0.930433
DCGM_FI_PROF_DRAM_ACTIVE{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",GPU_I_PROFILE="1g.5gb",GPU_I_ID="13",Hostname="ub20-a100-k8s"} 0.800339
有关分析指标以及如何解释指标的更多信息,请参阅 NVIDIA DCGM 用户指南 中的 分析指标 (Profiling Metrics)。