显存与速度
很多人以为推理速度看 CPU 主频或显卡算力,其实生成阶段的瓶颈几乎全在内存/显存带宽。理解这一点,很多"为什么我的机器这么慢"就有答案了。
一、生成一个字要读一遍模型
大模型逐 token 生成文字。每吐一个字,都要把模型全部权重从显存(或内存)里读一遍做矩阵运算。7B 的 Q4 模型约 4.5GB,生成 100 个字,理论上要把 4.5GB 数据搬 100 次。
所以速度上限 ≈ 内存带宽 ÷ 模型体积。
| 平台 | 带宽量级 | 7B Q4 理论上限 |
|---|---|---|
| DDR4 双通道 | 约 50 GB/s | 十几 token/s |
| DDR5 双通道 | 约 90 GB/s | 二三十 token/s |
| 入门独显(8–12GB) | 300–500 GB/s | 上百 token/s |
| 中高端独显 | 更高 | 受限于调度 |
这是理论上限,实际还要打折。关键是量级差:独显带宽是内存的几倍到十几倍,同一个 7B 模型在显卡和纯 CPU 上能差一个数量级。
也解释了一个常见困惑:核显和独显的算力差距很大,但跑 7B 时的速度差往往小于算力差,因为这一阶段拼的是带宽,不是算力。
二、CPU 推理为什么慢
- 带宽低:单双通道内存在几十 GB/s 级别,这是硬上限。
- 延迟高:CPU 内存访问延迟远高于显存,模型又放不进缓存。
- 算力也吃亏:prefill(读入提示词)阶段是计算密集的,CPU 和 GPU 差得更远。
- 其他程序抢带宽:边跑模型边开浏览器、同时跑两个模型,都会明显掉速。
三、显存不够会"分层"
显存放不下整个模型时,框架会把部分层放 CPU、部分放显卡,叫 offload。看起来能跑,但速度往往断崖式下跌,甚至比全 CPU 还慢。ollama ps 里的 xx%/yy% CPU 就是在告诉你这件事。
四、上下文也会拖慢速度
KV 缓存随上下文长度增长。从 4K 涨到 32K,显存占用和每步计算量都会上去。长文档问答感觉"越聊越慢",常常就是这个原因。
五、能做的优化
- 换更小的量化(Q4 而不是 Q8),体积小一半,速度差不多翻倍。
- 降低
num_ctx,够用就行。 - 关掉占显存的程序:浏览器硬件加速、游戏、视频。
- 避免同时常驻多个模型。
- 一次问完整问题,减少多轮往返。
六、结论
必须用 CPU 跑,就接受 7B 模型每秒几个到十几个字的速度;想快,唯一的正路是把模型完整放进显存。这也是判断要不要升级硬件时最重要的一条依据。