GPU 与推理服务指标 — DCGM 说了什么、没说什么
一句话总结
GPU 指标中最常判断错的是“这张卡在闲着”。利用率为 0,却占着 13.7 GiB 内存的卡,该算作哪一边?答案不在某一个指标里,而是要把利用率、内存和功耗放在整个窗口内一起看。
为什么需要它
GPU 很贵,也不容易增加。所以经常需要判断“需要几张卡”,而这时只看仪表板上的利用率一项,一定会判断错。这个集群的实测就是例子。
它确实没有在计算。但那 13.7 GiB 别的工作负载用不了。卡闲着,位置也不是空的。如果把这种状态算作“闲置 GPU”,容量规划就会出错;如果算作“在用的 GPU”,又找不到浪费。两种情况都要写下来。
工作原理
dcgm-exporter 把 DCGM 库的字段原样输出为指标。常用的有这些。
| 指标 | 类型 | 单位与含义 |
|---|---|---|
DCGM_FI_DEV_GPU_UTIL |
gauge | GPU 利用率(%) |
DCGM_FI_DEV_FB_USED、FB_FREE |
gauge | 帧缓冲已用、空闲(MiB) |
DCGM_FI_DEV_POWER_USAGE |
gauge | 功耗(W) |
DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION |
counter | 累积能量(mJ) |
DCGM_FI_DEV_SM_CLOCK |
gauge | SM 时钟(MHz) |
DCGM_FI_PROF_SM_ACTIVE |
gauge | 有 warp 驻留的时间比例(默认未启用) |
能量是计数器,这一点很有意思。用 rate(...[30m]) / 1000 求导得到的就是瓦特,与同一时刻的 POWER_USAGE 仪表比较,值几乎相同(实测:54.7 W 对 55.3 W)。同一个量既能用计数器测,也能用仪表测,这是少见的能亲眼确认这一点的地方。
关于 GPU_UTIL,DCGM 官方字段说明只有一行“GPU Utilization.”。想进一步了解它测的是什么、怎么测,就要看 profiling 指标。官方文档把 PROF_SM_ACTIVE 定义为“至少有一个 warp 驻留在 SM 上的时间比例,对所有 SM 取平均”,并补充说“这里的 active 不一定表示正在计算——等待内存请求的 warp 也算作 active”。一个内核只用了 GPU 的 1/5,利用率也可能显示为 100%,原因就在这里。不过这个 exporter 的默认配置中 PROF_* 是关闭的,还有数据中心级(Volta 及以上)的限制。
归属(attribution)标签不保证存在。dcgm-exporter 会向 kubelet 查询并加上 exported_namespace、exported_pod、exported_container,但根据节点配置,这些标签可能整个为空。这个集群里四张卡中也有一张如此。没有归属的 GPU 就是“不知道谁在用的资源”,成本分摊和回收判定都会卡在这里。
在现场相遇的样子——服务指标
推理服务器不能只靠 GPU 指标来判断。因为队列堆积、首个令牌(token)变慢的时候,GPU 利用率依然显示为 100%。所以 vLLM 单独输出服务侧的指标。
| 指标 | 类型 | 含义 |
|---|---|---|
vllm:num_requests_running、vllm:num_requests_waiting |
gauge | 运行中、等待中的请求数 |
vllm:time_to_first_token_seconds |
histogram | 到首个令牌为止所花的时间 |
vllm:inter_token_latency_seconds |
histogram | 令牌之间的间隔 |
vllm:prompt_tokens_total、vllm:generation_tokens_total |
counter | 已处理的令牌数 |
vllm:kv_cache_usage_perc |
gauge | KV 缓存占用(1 表示 100%) |
vllm:request_success_total |
counter | 已结束的请求数,带有 finished_reason 标签 |
v1 引擎中有几个名称改变了,这一点也值得了解。gpu_cache_usage_perc 变成了 kv_cache_usage_perc,标签从 model_name 一个变成了 model_name、engine 两个。在源码中,计数器是不带后缀声明的,由客户端库加上 _total——所以如果 grep 源码再把名称抄下来,就会抄错。
下一项实验的服务指标不是实测。这个集群的 vLLM 部署目前副本数为 0,处于关闭状态,所以一个指标都没有。为了不把没有的东西说成有,使用的是只模仿格式的合成样本,并给所有序列加上了 source="synthetic" 标签。GPU、容器、节点指标全部是实测,只有 vllm: 系列是样本。
下一项实验要做什么
用四张 GPU 三小时的实测判断“闲置的卡”,找出缺少归属标签的卡,从累积能量计数器推导平均功耗并与仪表比较,最后从合成样本的直方图中求出首令牌延迟 p95。结尾要在报告中区分哪些是实测、哪些是样本。