一句话定义:GPU 利用率(GPU utilization)是 nvidia-smi 里那个百分比,它只回答一件事——刚才这一小段时间里,GPU 有没有活儿在干;SM 占用率(SM occupancy)回答的是另一件事——计算核心真正同时塞进了多少线程。
nvidia-smi 的 100% 是怎么算出来的
驱动每隔一小段采样一次,只要发现"此刻有至少一个核函数(kernel)在跑",就记这一格是忙的,最后换算成百分比。它数的是时间占比,不是算力占用。
打个比方:一家餐厅的后厨。GPU 利用率就像"后厨的灯亮不亮"。只要有一个厨师在里面切一根葱,监控就记 100% 忙碌。但这个厨房到底出了几道菜,它根本不知道。
SM 占用率衡量的是并发度
SM(Streaming Multiprocessor,流式多处理器)是 GPU 里真正干计算的单元,一块卡有几十到上百个。每个 SM 能同时驻留的线程束(warp)数量有上限,占用率就是"实际驻留 warp 数 ÷ 上限"。它衡量的是并发度:线程够不够多,能不能把访存延迟藏起来。
但占用率高也不等于快——线程都在等数据,占用率照样很好看。
为什么 100% 了还是慢
三种最常见的情况:
1. 算子碎片化。推理框架里有大量逐元素小操作,每个 kernel 只跑几十微秒,中间还夹着等 CPU 下发指令的空隙。采样刚好撞上 kernel,就显示 100%,实际上相当一部分时间 GPU 在空转。
2. 大模型解码阶段。batch 很小(甚至只有 1)时,每步只算一个 token,矩阵乘退化成矩阵乘向量,算术强度极低,SM 里大片计算单元闲着。
3. 显存带宽瓶颈。推理解码通常是 memory-bound(显存带宽受限),时间花在把权重搬进来,计算单元在等米下锅。
几个常被混淆的指标:
| 指标 | 衡量什么 | 高 ≠ 快的原因 |
|---|---|---|
| GPU 利用率 | 采样窗口内有 kernel 在跑的时间比例 | 只说明没停工 |
| SM 占用率 | 每 SM 驻留 warp / 上限 | 可能全都在等访存 |
| 显存带宽利用率 | 显存读写带宽用了多少 | 带宽打满时算力闲置 |
| Tensor Core 利用率 | 矩阵单元参与了多少 | 小 batch 根本喂不饱 |
对从业者的意义
nvidia-smi 是体温计,不是体检报告。看到 100% 先别急着庆祝,它只说明"没停工"。真要看效率,得用 Nsight Systems 看时间线(kernel 之间有没有空档),用 Nsight Compute 看单个 kernel 的 SM 占用率、显存带宽和矩阵单元使用情况;各工具指标的具体口径以官方文档为准。
对普通职场人:汇报里写"GPU 已打满 100%"基本等于没写。真正该说的是——吞吐多少 token/s、延迟多少毫秒、瓶颈卡在哪一环。否则你以为在压榨硬件,其实只是在烧卡。
