第十章 吞吐与延迟的系统模型
模型结构决定需要执行的计算。要知道做得多快,还需要设备算力、内存带宽、工作负载、精度、并行方式和实现效率。建立性能模型时,应先从结构得到工作量,再把工作量映射到资源时间,并用测量检验模型假设。
1 先定义所求指标
| 指标 | 本章定义 |
|---|---|
| Prefill 输入吞吐 | 本次处理的输入 token 数 / Prefill 执行时间 |
| Decode 聚合吞吐 | 本 step 输出 token 总数 / step 时间 |
| 单序列生成速率 | 一条持续参与普通 Decode 的序列每秒生成的 token 数 |
| TTFT | 请求到达指定测量点至首个输出 token 可见的时间 |
| TPOT | 对 $N>1$,$(t_{\rm last}-t_{\rm first})/(N-1)$ |
| ITL | 相邻输出事件之间的时间间隔;逐 token 输出时就是 token 间隔 |
| 端到端输出吞吐 | 测量窗口内输出 token 总数 / 窗口时间 |
TTFT 可以包含排队、tokenization、Prefill、采样及传输,取决于计时点。TPOT 是请求内的均值,不能代替 ITL 的尾延迟。一次流式事件若包含多个 token,两种定义尤其容易混淆。框架的实际指标应查对应版本,例如 vLLM 指标文档。
固定 $B$、每序列每步输出一个 token、step 时间为 $t$ 时:
$$ \text{aggregate tokens/s}=\frac{B}{t},\qquad\text{per-sequence tokens/s}=\frac{1}{t} $$
若 $B=32,t=20$ ms,总吞吐是 1600 token/s,每条序列是 50 token/s。把两者混在一起,会让答案相差 32 倍。
2 Roofline 的两个基本限制
设本次工作需要 $F$ FLOPs 和 $D$ bytes HBM 传输,硬件峰值算力与带宽为 $C_{\rm peak}$、$\beta_{\rm peak}$。理想资源时间下界为:
$$ t\ge\max\left(\frac{F}{C_{\rm peak}},\frac{D}{\beta_{\rm peak}}\right) $$
用 max 是假设计算与访存能够充分重叠;不能随意把两者相加当成定律。这个下界通常偏乐观:不同算子串行、资源利用率和通信等都会造成额外时间。
工程估算可用实测或明确假设的有效算力 $C_{\rm eff}$、有效带宽 $\beta_{\rm eff}$。更细的方式是按 kernel 求和:
$$ t_{\rm estimate}\approx\sum_j\max\left(\frac{F_j}{C_{{\rm eff},j}},\frac{D_j}{\beta_{{\rm eff},j}}\right)+t_{\rm other,exposed} $$
$t_{\rm other,exposed}$ 指未被重叠隐藏的调度、launch、通信、同步等成本。使用“有效”数值形成的是条件估计,不再是硬件峰值意义上的严格理论下界。
还要检查算力精度口径:BF16、FP16、FP8、INT8 吞吐不同;密集运算不能直接套结构化稀疏峰值。硬件标称 Tensor Core 峰值也不代表小矩阵都能达到该速率。
3 算术强度解释 batch 的作用
定义算术强度 $I=F/D$,单位 FLOPs/byte。机器的算力带宽比为 $C/\beta$。若工作负载的 $I$ 很低,通常更受带宽限制。
考虑线性层、暂时忽略激活 IO。一个 step 有 $B$ 个 token,理想情况下权重只从 HBM 读取一次:
$$ F\approx2BP,\quad D\approx Pb_w,\quad I\approx\frac{2B}{b_w} $$
BF16 权重 $b_w=2$ 时,$I\approx B$ FLOPs/byte。batch 增大会让每个读入的权重服务更多 token,矩阵乘法也更容易利用设备。
若假设机器 $C/\beta=150$ FLOPs/byte,权重主导的简化模型给出转折点 $B\approx150$。真实转折受 KV、矩阵形状、激活 IO 和容量限制,不能把 150 当成固定最佳 batch。
Prefill 的线性层一次通常处理 $BS$ 个 token,因此权重复用更高,常更接近计算受限;小 batch Decode 常更接近带宽受限。长上下文 Decode 的 KV 读取、大 batch Decode 的矩阵计算都可能改变瓶颈,不能绝对化。
4 Dense Decode 的 HBM 流量
对大模型、假设权重不能跨 step 全部常驻片上缓存,且每个 step 对需要的权重理想读取一次,可以写:
$$ D_{\rm dec}\approx D_w+2LB(T+1)d_{kv}b_{kv}+D_a $$
其中 KV 项由旧缓存读取 $2LBTd_{kv}b_{kv}$ 和新缓存写入 $2LBd_{kv}b_{kv}$ 组成;新 KV 假定直接被当前计算复用。$D_a$ 是其他激活和临时 IO。
对于 Dense 模型,$D_w\approx P_{\rm total}b_w$ 是易手算的近似;严格说,未绑定输入 Embedding 不需要每步读取整张表,而输出 LM Head 一般需要。缓存命中、重复读取、量化元数据也会改变流量。
这里假设 GQA kernel 能复用共享 KV,按唯一 KV 元素统计最低必要流量。若各 Q head 重复从 HBM 读取共享数据,真实流量更大。KV 存储小不自动保证 IO 达到理想值。
由上述条件模型可得:
$$ \text{TPS}{\rm dec}\lesssim\min\left(\frac{BC}{F{\rm dec}},\frac{B\beta}{D_{\rm dec}}\right) $$
式子是对应假设下的吞吐上界或估计天花板,不是 benchmark 结果。
5 KV 带宽何时重要
令权重读取与旧 KV 读取相等:
$$ P_{\rm total}b_w\approx2LBTd_{kv}b_{kv} $$
得到近似交点:
$$ T\approx\frac{P_{\rm total}b_w}{2LBd_{kv}b_{kv}} $$
batch 越大,KV 总读取越大,越早接近权重流量。batch 提高权重复用,却不会让每个请求都无需读取自己的 KV,因此吞吐不会无限随 batch 线性增长。
标准 Decode Attention 在理想 KV 复用下的算术强度约为:
$$ I_{\rm attn}\approx\frac{4LBd_qT}{2LBTd_{kv}b_{kv}}=\frac{2h_q}{h_{kv}b_{kv}} $$
这揭示了 GQA 的系统价值:相同 Q 工作量可以由更少的唯一 KV 数据支撑。但真实收益仍依赖 kernel 如何复用数据。
6 MoE 的流量要看专家并集
单 token 只激活 $k$ 个专家;batch 中各 token 可能选择不同专家,所以不能把每步权重 IO 永远写成“单 token 激活参数 × 字节数”。
若每个 token 独立、均匀地从 $E$ 个专家中选 $k$ 个不同专家,一个专家未被任何 token 选中的概率是 $(1-k/E)^B$。本层被触达的专家数期望为:
$$ \boxed{\mathbb{E}[U]=E\left[1-(1-k/E)^B\right]} $$
理想每个被选专家只读一次时,本层专家权重流量约为 $UP_eb_w$。例如 $E=8,k=2,B=8$,期望触达约 7.20 个专家,已接近完整专家池。
这是用于理解趋势的概率模型,实际路由可能相关且不均匀。每个专家得到多少 token 决定 GEMM 大小;热点专家、负载不均、dispatch/combine 和跨卡 All-to-All 都会影响时间。相同激活参数量的 MoE 与 Dense 模型,不保证相同吞吐。
7 多卡不能只把速度乘卡数
| 方式 | 主要变化 | 主要限制 |
|---|---|---|
| 数据并行 DP | 多个完整副本处理不同请求 | 模型需能装入副本;负载分配与到达率 |
| 张量并行 TP | 切分层内矩阵,降低每卡权重容量压力 | 集合通信、较小 GEMM、可能的 KV 复制 |
| 流水线并行 PP | 不同层放在不同卡 | 单请求经过各阶段、气泡、阶段不均衡 |
| 专家并行 EP | 专家分散存放 | token dispatch/combine、All-to-All、专家负载 |
跨卡传输可先用“消息 bytes / 有效链路带宽 + 启动延迟”估算,但集合通信还有拓扑、消息数和重叠关系。将全机算力和显存带宽简单相加,会隐藏分片不均与通信关键路径。
8 实际测量应固定什么
一次可解释的性能记录至少包含:模型配置与版本、权重/KV dtype、硬件数量与互联、推理框架版本、并行策略、输入输出长度分布、并发或到达率、缓存命中条件,以及 TTFT/TPOT 的计时边界。
离线 kernel 计时要预热、正确同步设备或使用设备事件,不能只计 CPU 提交异步工作的时间。在线测试同时记录吞吐、P50/P95/P99 延迟、错误率;只提升并发拿到一个更高 tokens/s,不代表满足用户延迟目标。
连续批处理会让 $B$ 随 step 改变;长 Prefill 与 Decode 混排会争抢资源。端到端吞吐不能把纯 Prefill tokens/s 和纯 Decode tokens/s 直接相加。要在统一时间窗口内对同一批真实请求统计。