持续运行的小 kernel
先看并行规模、batch 大小和 kernel 形状。GPU_UTIL 高,只能说明 kernel 执行的时间长。
同一段负载,DCGM 能报出三个“利用率”。差别全在分母。
有 kernel 在跑的时间 ÷ T
所有 SM 的活动时间加起来 ÷ (SM 数 × T)
驻留 warp 数的时空平均 ÷ 每个 SM 的上限
图里把三个指标放进同一个窗口,只是为了方便比较。真实的 GPU_UTIL 来自驱动自己的采样窗口,profiling 字段各有一段采集区间,和 Prometheus 抓取的那一刻未必对得上。这里的公式也做了简化:时钟固定,每个 SM 一样忙。所以别拿线上的 GPU_UTIL 反推 SM_ACTIVE。另外,profiling 的比率原值通常是 0–1,图里乘了 100;GPU_UTIL 本身就是 0–100。
SM_ACTIVE100%有 warp 驻留
SM_OCCUPANCY25%驻留 2 / 上限 8
运算管线暂时空闲但 warp 仍算进前两项
PIPE_TENSOR_ACTIVE、PIPE_FP16_ACTIVE、PIPE_FP32_ACTIVE 和 PIPE_FP64_ACTIVE 反映的是对应管线有多活跃,归一化用的是硬件定义的周期口径,所以 100% 在不同架构、不同管线上未必是同一件事。Tensor Core 能跑低精度矩阵运算,但 FP16 管线指标不含 HMMA 矩阵指令。这几个数不能直接相加,更不能拿它乘上标称 TFLOPS,当成实际吞吐。真要算有效 FLOP/s,还得知道运算次数、精度、指令类型和耗时。
真实 SM 能驻留多少 warp,要看 GPU 架构。实际 occupancy 还会被 block 大小、寄存器和共享内存卡住。图里的八个槽位只是拿来显示比例;occupancy 高,不代表跑得更快。
DCGM_FI_DEV_FB_USED / FB_TOTAL
DCGM_FI_PROF_DRAM_ACTIVE
显存用了 75%,但显存接口只有 20% 的周期在传数据。
MEM_COPY_UTIL 是驱动采样窗口里,显存被读或被写的时间占比。它既不是显存用量百分比,也不专指主机和 GPU 之间的复制。DRAM_ACTIVE 则是 profiling 给出的显存接口周期活动比例。两者来源和归一化方式都不一样,读数对不上很正常。
实测带宽就是传输字节数除以时间。带宽利用率,就是拿实测带宽除以同方向、同单位、同口径的参考带宽。别用 DRAM_ACTIVE 去乘显存标称带宽,那算不出真实带宽。另外,这里按 1 GiB = 1024 MiB 换算,exporter 输出的 FB_USED 单位是 MiB。算容量占比时先把单位统一,再想清楚分母用 FB_TOTAL,还是扣掉驱动保留空间后的可用容量。
2 GB ÷ 1 s = 2 GB/s = 2,000,000,000 B/s
PCIe 的 profiling 速率把协议头和数据一起算进去。NVLink 的 profiling 指南描述的是不含协议头的速率,API 字段页的措辞又略有出入,用之前最好对着自己的部署版本和后端核一遍。图里没有把这两个数当成同口径的有效载荷吞吐来比。
TX 和 RX 各有各的方向上限;多链路加起来的总速率,要和同样链路数的总带宽比。两张 GPU 通信也不一定走 NVLink,也可能绕道 PCIe。较新的 *_BYTES_TOTAL 字段只有在 exporter 里按 counter 导出时才该用 rate(),这些原始累积字段本图不展开。
假设 GPU 只在第 1 秒执行 kernel,随后 9 秒空闲。
每格 1 秒忙 1 秒 + 空闲 0 秒
1 ÷ 1 = 100%
忙 1 秒 + 空闲 4 秒
1 ÷ 5 = 20%
忙 1 秒 + 空闲 9 秒
1 ÷ 10 = 10%
忙的始终只有 1 秒。窗口越长,算进去的空闲时间越多,平均值就越低。
这里的窗口长度用于演示均匀时间平均。DCGM 的采集窗口和 Prometheus 的抓取间隔是两回事:后者决定多久读取一次结果,不能还原窗口内部的瞬时变化。
100 * DCGM_FI_PROF_SM_ACTIVE
原值 0.25 就是 25%。这是个 gauge,别对它用 rate()。
ΔE / Δt = 平均功率
2,000,000 mJ ÷ 10 s ÷ 1,000 = 200 W
TOTAL_ENERGY_CONSUMPTION 的单位是 mJ。Prometheus 的 rate() 会处理计数器重置;先逐条序列求 rate,再按需要汇总。
DCGM 先采集、缓存字段,exporter 再输出,Prometheus 再按自己的间隔来抓。这三层的时间间隔并不一样。计数器复用可能留下采样空隙或零值,profiling 暂停时会返回 BLANK。字段不支持、没权限、没采到样本,再加上真的等于零,这四种情况得分开处理,别一律补零。异常大的特殊值同样不能当有效读数。
MIG(多实例 GPU)会把一张物理 GPU 切成多个实例。哪些字段支持、归一化范围多大,都要看具体的实体和设备。聚合之前先核对 UUID、GPU/实例标签和时间戳;别把整卡序列和实例序列加在一起,也别把整卡读数复制给每个共用这张 GPU 的 Pod,当成它们的独占用量。
dcgmi profile -l -i 0
在目标 GPU 上跑一下这条命令,看看哪些指标组能同时采集,再对一遍 exporter 的 counters 配置。文档里写着某个字段,不代表你手上的 GPU 和配置就一定会导出它。
先看并行规模、batch 大小和 kernel 形状。GPU_UTIL 高,只能说明 kernel 执行的时间长。
接着测实际带宽、缓存命中率和算术强度。DRAM 活动高只是条线索,还不能就此认定带宽瓶颈。
把功率、温度和 CLOCKS_EVENT_REASONS 一起看。温度高、功率贴着上限,都得有对应的限制原因才算数。
字段名沿用 dcgm-exporter 常见写法,新 API 别名见详情。以实际 /metrics 的 HELP、TYPE 和部署版本为准。