tokens/sec 的物理
词元生成速度不神秘:解码期间、每个词元都要求从内存读取 essentially 全部活跃权重一次。这让解码受内存带宽约束、也意味着你能用除法预测 tok/s。人们争论的一切——量化、MoE、卸载、批处理——都是这个公式戴着不同的帽子。
那一个公式
tokens/sec ≈ effective memory bandwidth ÷ bytes of weights read per token
RTX 4090, 8B Q4_K_M:
1008 GB/s ÷ 4.9 GB ≈ 205 tok/s 理论上限
实测:~120–150 tok/s(开销、注意力、KV 读取)
一个常见情形的 sanity 表(Q4_K_M 的 8B、单流——数量级数字、非规格;自己测):
| 硬件 | ~带宽 | 预期解码 |
|---|---|---|
| RTX 4090 | ~1,000 GB/s | ~120–150 tok/s |
| RTX 3090 | ~936 GB/s | ~110–140 tok/s |
| RTX 4060 Ti 16GB | ~288 GB/s | ~35–45 tok/s |
| 双通道 DDR5 CPU | ~60–90 GB/s | ~8–14 tok/s |
| M3/M4 Max 级 Mac | ~300–400 GB/s(统一) | ~40–60 tok/s |
为什么上限与现实之间有差距?内核启动开销、随上下文增长的注意力工作、和权重之上的 KV 缓存读取。公式给你上限;单流你通常实现其 60–75%。
一张卡、四个模型
公式同样预测固定硬件上模型尺寸如何换速度。~1,000 GB/s 卡上的上限、然后 60–75% 实现(示意):
| 模型 | Q4_K_M 尺寸 | 上限 | 现实单流 |
|---|---|---|---|
| 4B | ~2.5 GB | ~400 tok/s | ~230–300 tok/s |
| 8B | ~4.9 GB | ~205 tok/s | ~120–150 tok/s |
| 14B | ~8.5 GB | ~118 tok/s | ~70–90 tok/s |
| 32B | ~19 GB | ~53 tok/s | ~30–40 tok/s |
两个教训掉出来。同卡上参数翻倍大致速度减半。而 24 GB 卡上的 32B 对聊天仍然够快——受内存约束不是绝望。那个配对就是为什么 24 GB 卡和 32B Q4 量化总是成对出现(见 GPU 档位)。
量化是速度特性、不只是压缩
同一公式、更少字节:fp16 的 8B 模型每词元读 ~16 GB;Q4_K_M 读 ~4.9 GB。同一张卡上、Q4 以大致 3 倍于 fp16 的速度跑、而且装进 fp16 装不下的地方。这就是 Q4 级量化是本地使用默认推荐的原因(见 量化)——质量损失小、速度增益是结构性的、不是偶然的。
上下文让你慢下来
随着对话增长、每个新词元还必须读取每个之前词元的 KV 缓存——那些读取随上下文长度扩展。空上下文附近 8B Q4 在 4090 级卡上可能跑 140 tok/s;深入 64k 词元会话后同一设置可能下垂到一半或三分之一。注意力内核也不再装进缓存友好的形状。长上下文工作负载正是 flash attention 和 KV 量化回本的地方(见 KV 缓存 和 引擎旋钮)。
一个常见困惑:“聊天越聊越慢”通常是 KV 增长、不是服务器退化(见 KV 缓存)。
MoE:以速度换能力
混合专家模型每词元只激活少数专家块、所以每词元读取的字节跟随激活参数而非总量。30B 总量/3B 激活的 Q4 模型每词元只读几个 GB——它以小模型的解码速度携带大模型的知识。这就是 MoE 家族对本地使用的全部吸引力(见 模型家族):你付内存存储专家、只为用到的那些付带宽。
截至本文写作的具体形状:Qwen3-30B-A3B 级每词元只读 ~3B 激活参数——大模型知识、小模型速度、Q4 下 ~18 GB 显存。
投机解码
把小草稿模型与大目标配对:草稿廉价地提议 k 个词元、目标一次前向传播验证全部 k 个、被接受的词元以目标的质量出来。在近似贪心工作负载——代码补全、JSON、低温度抽取——预期 2–3 倍解码加速。高温度下草稿更常猜错、收益缩水。llama.cpp 通过 --model-draft 和草稿长度标志暴露;确切标志名随版本漂移、查 --help。
成本:草稿必须与目标共享分词器、且两个模型都驻留内存。
并行:现实
两张 GPU 不会给你单流的 2 倍。张量并行(vLLM -tp 2)跨卡切每一层换吞吐、代价是互连流量;llama.cpp 的默认切分是流水线(逐层)、对容量帮助大于单流延迟。好的双卡切分的现实预期:单流的 1.2–1.6 倍、不是 2 倍。有人承诺每 GPU 线性扩展、他在卖东西。
加卡确实漂亮地扩展容量——那是 并发 里的服务器故事。
CPU 卸载悬崖
当层留在 CPU 上、每个词元的前向传播跨 PCIe(~10–25 GB/s)跳进系统内存再回来。循环以最慢驻留部分的速度跑:80% 层在 GPU 的模型跑得离 CPU 速度近得多、离“80% 的 GPU 速度”远。如果一个模型差一点装得下、降一档量化而不是卸载一半——见 引擎旋钮。意外部分卸载的标志是 GPU 级硬件上的 3–10 tok/s。
预填充受算力约束:TTFT 是另一种测量
处理你的提示词跨词元并行、受算力而非带宽限制——4090 级卡能以每秒几千 tok 预填充 8B Q4。所以 12k 词元的粘贴在第一个输出词元前花 ~3–5 秒、尽管之后的解码以 140 tok/s 跑。首词元时间和稳态 tok/s 是测量不同瓶颈的不同数字;读基准时查清它展示的是哪一个。
测你自己的
页面上的数字(包括本页)是上限和范围。你的设置两分钟测完:
- 从短提示词生成 ~200 词元;忽略最第一次运行(冷加载)。
- 取稳态解码:首词元之后生成的词元数 ÷ 秒数。
- 单独记录长粘贴上的首词元时间——那是另一个瓶颈。
llama-server 按请求打印提示词评估和评估 tok/s;LM Studio 实时显示解码 tok/s;nvidia-smi 在你测试时确认 GPU 真的在忙。
多快算快
| tok/s | 感觉 |
|---|---|
| 5 | 可用、痛苦——你会害怕长回答 |
| 10 | 聊天没问题 |
| 20 | 跟手;对话不再有机械感 |
| 50+ | 即时;代码助手级 |
门槛出奇地低、因为人类阅读速度只有 ~5–10 tok/s——但以 5 tok/s 等补全是折磨。自己感受:模拟器 以不同词元速率渲染同一回答、那儿一分钟比任何表格教得都多。
~2–3 tok/s 以下流式 UI 感觉是坏了而不是慢——人们关掉标签页、所以把它当交互使用的硬地板。