localaiforum
登录
指南 › 运行与服务

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 是测量不同瓶颈的不同数字;读基准时查清它展示的是哪一个。

测你自己的

页面上的数字(包括本页)是上限和范围。你的设置两分钟测完:

  1. 从短提示词生成 ~200 词元;忽略最第一次运行(冷加载)。
  2. 取稳态解码:首词元之后生成的词元数 ÷ 秒数。
  3. 单独记录长粘贴上的首词元时间——那是另一个瓶颈。

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 感觉是坏了而不是慢——人们关掉标签页、所以把它当交互使用的硬地板。

相关: 硬件概览 · 显存计算 · GPU 档位 · 引擎旋钮