硬件拉满了还是跑不快:三个软件层瓶颈
「卡都买最好的了,为什么吞吐还是上不去」—— 这个问题八成的答案不在卡上。
瓶颈一:批处理(Batching)
GPU 擅长并行,但如果你一次只给它一个请求,它大部分时间在等数据。
静态批处理:攒够一批一起跑 —— 简单,但短请求要等长请求。
连续批处理(Continuous Batching):
每个请求生成完就退出,新请求随时进来补位。
这一项改动的效果通常是量级级别的 ——
同一个模型、同一张卡,从静态批处理换成连续批处理,吞吐能翻好几倍。
同一个模型、同一张卡,从静态批处理换成连续批处理,吞吐能翻好几倍。
瓶颈二:KV 缓存的管理
大模型推理时,上下文会形成一份 KV 缓存。它占显存、要传输、要复用。
常见问题:
- 显存被缓存占满 —— 能跑的并发数被压死
- 缓存无法复用 —— 相同的前缀每次都重算(这也是「缓存命中」便宜的来源)
- 跨卡传输 —— 多卡推理时,缓存传输成为真正的瓶颈
对应的优化:
- 分页式缓存管理(把显存切成块,按需分配)
- 前缀缓存复用(相同前缀只算一次)
- KV 缓存量化 / 卸载(牺牲一点精度换并发)
前面讲过的「缓存命中 token 便宜 50 倍」,
在成本侧对应的就是这一层 —— 谁的缓存管得好,谁的单位成本就低。
在成本侧对应的就是这一层 —— 谁的缓存管得好,谁的单位成本就低。
瓶颈三:多卡互联
单卡跑不动要拆到多卡,但拆开之后:
- 张量并行 —— 每层拆开,通信极其频繁,吃卡间互联带宽
- 流水线并行 —— 按层切分,通信少一些,但有气泡
这里的差别是硬件级的:
同一机柜内的 NVLink 全互联,和跨服务器走 IB 网络,性能差得很远。
实测过的数据:同样是 B300 芯片,
柜级全互联的整机柜单卡 token 吞吐能到 7700/s,
普通 8 卡服务器只有 800/s —— 差 9 倍。
差的就是互联,不是芯片。
柜级全互联的整机柜单卡 token 吞吐能到 7700/s,
普通 8 卡服务器只有 800/s —— 差 9 倍。
差的就是互联,不是芯片。
所以
在买更贵的卡之前,先问一句:
现在这套软件的 GPU 利用率是多少?
如果只有 20%–30%,那先做软件优化,性价比远高于加卡。
现在这套软件的 GPU 利用率是多少?
如果只有 20%–30%,那先做软件优化,性价比远高于加卡。
这篇能拿走什么
读了不算数,拿去用才算。