附录 练习与答案
本附录保留面试场景的练习,用于在完成系统学习后检验参数和性能分析能力。阅读主线不依赖这些习题;若还不能解释公式中的模块来源,应回到相应原理章节。
1 开始计算前补齐条件
只给层数、hidden size、Q heads、KV heads 和专家数,还不足以唯一确定题目中的所有量。
| 想求的量 | 还需要确认 |
|---|---|
| 参数量 | head dim、FFN/专家中间维度、FFN 类型、词表、权重绑定、bias/Norm、哪些层是 MoE、共享专家 |
| 每 token 激活参数 | top-k、路由结构、共享专家、激活参数统计口径 |
| KV 容量 | batch、缓存长度、KV dtype、注意力结构、分片和共享方式 |
| Prefill FLOPs | 输入长度、padding、前缀缓存、因果三角口径、输出层计算位置数 |
| Decode FLOPs | step 开始前上下文长度、batch、是否推测解码 |
| 吞吐 | 硬件算力与带宽、精度、并行、batch、长度分布、实现效率和指标边界 |
不必停下来逐项反问所有条件。可以说:“我先假设 decoder-only、无 bias、SwiGLU、head dim 为 hidden/Q heads、无共享专家;缺失的 FFN 宽度与 top-k 暂用符号表示。”条件不足时给符号表达式是完整答案的一部分。
2 一套现场答题顺序
- 明确“参数、bytes、FLOPs、token/s”中的哪一个;澄清“新增 token”的含义。
- 算 $d_q=h_qd_h$ 与 $d_{kv}=h_{kv}d_h$,画出四个 Attention 矩阵。
- 算 Attention 和 FFN;MoE 分总专家与 top-k 专家两列。
- 汇总各层,加词表相关权重、Norm、bias;去掉重复统计的绑定权重。
- 根据 KV 张量形状算每 token 与整个 batch 的缓存。
- 对 Prefill 和 Decode 分别算线性层、Attention 与 LM Head FLOPs。
- 列出访存与硬件假设,用计算和带宽两个时间估算瓶颈。
- 报告聚合吞吐、单序列速度和近似范围,检查数量级。
可以用这样的开场白:“如果是已有词表内新增一个序列 token,权重参数增加 0;我分别计算该 token 的激活权重、KV 增量和前向 FLOPs。吞吐还需要 batch、上下文和硬件,我先给条件公式。”
3 公式速查
以下限定 $d_q=d$、SwiGLU、无 bias、同构层;其他结构按前文展开。
| 项目 | 公式 |
|---|---|
| 单层 Attention 参数 | $2d^2+2dd_{kv}$ |
| 单层 Dense FFN 参数 | $3dm$ |
| 单个专家参数 | $P_e=3dm_e$ |
| MoE 总专家参数 | $EP_e$ |
| MoE 每 token 激活专家参数 | $kP_e$ |
| 简单 router 参数 | $dE$ |
| 每 token KV 增量 | $2Ld_{kv}b_{kv}$ |
| 总 KV | $2LBTd_{kv}b_{kv}$ |
| Prefill block 线性 FLOPs | $2BSP_{\rm lin}$ |
| 因果 Prefill 注意力 FLOPs | $2LBdS(S+1)$ |
| Decode 注意力 FLOPs | $4LBd(T+1)$ |
| Decode 总主项 FLOPs | $2B(P_{\rm lin}+dV)+4LBd(T+1)$ |
| 资源时间下界 | $\max(F/C_{\rm peak},D/\beta_{\rm peak})$ |
| 普通 Decode 聚合吞吐 | $B/t_{\rm step}$ |
速查表用于复习,不能替代统计口径:$P_{\rm lin}$ 不含输入查表、Norm 和 LM Head;Prefill 的 LM Head 应按实际预测位置数另加。
4 练习题
先写过程,再看下一节答案。
题 1 基础参数。 $L=2,d=512,h_q=8,h_{kv}=2,d_h=64,m=1536,V=10000$。无 bias、SwiGLU、两个 RMSNorm/block、final RMSNorm、Embedding 不绑定。求总参数量。
题 2 一个 token。 沿用题 1,KV 为 BF16。单条序列新增一个已处理 token 的 KV 增量是多少?8 条长度 1024 的序列共多少 KV?模型参数增加多少?
题 3 改成 MHA。 题 1 仅将 KV heads 改成 8,参数量增加多少?KV 变为原来的几倍?QK/AV FLOPs 是否也变成相同倍数?
题 4 MoE。 题 1 的每层 FFN 换成 4 个相同宽度的专家,top-2,无共享专家,router 无 bias。求总参数和整模块口径激活参数。
题 5 指标。 $B=16$ 的 Decode step 为 25 ms,总吞吐和每条序列速率分别是多少?首 token 在请求发出后 0.4 s 到达,最后一个在 2.0 s 到达,总输出 81 token,TPOT 是多少?
题 6 带宽估算。 一个 step 需 120 GFLOPs,读取与写入合计 24 GB;峰值算力 240 TFLOP/s,峰值带宽 1.2 TB/s,$B=8$。分别计算两个资源时间与理想聚合吞吐上界。
题 7 专家并集。 $E=16,k=2,B=8$,独立均匀路由。一个 step 每层期望触达多少专家?这与每 token 激活 2 个专家是否矛盾?
题 8 查漏。 面试官说:“60 层、hidden 8192、64 个 Q head、8 个 KV head、64 个专家,算激活参数和 Decode 吞吐。”列出必须补充的条件,并先给出你能确定的式子。
题 9 端到端步数。 prompt 长 128,生成 5 个 token。普通自回归需要几次 Prefill、几次 Decode?四次 Decode 分别看到多少个 key?
题 10 因果与方阵。 $B=1,L=1,h_q=2,d_h=4,S=3$,仅计 QK/AV。完整方阵 FLOPs 和因果有效配对 FLOPs 各是多少?
5 参考答案
题 1。 $d_{kv}=128$。Attention 为 $2\times512^2+2\times512\times128=655360$;FFN 为 $3\times512\times1536=2359296$;单层 Norm 为 1024。总参数:
$$ 2(655360+2359296+1024)+512+2\times10000\times512=16,271,872 $$
题 2。 单 token KV 为 $2\times2\times128\times2=1024$ bytes,即 1 KiB。整个 batch 为 $8\times1024\times1024$ bytes,即 8 MiB。序列变长导致新增参数为 0。
题 3。 $d_{kv}$ 从 128 变 512;每层增加 $2\times512\times(512-128)=393216$,两层增加 786432。KV 变 4 倍。Q head 数和 head dim 不变,因此 QK/AV 的主项 FLOPs 不变。
题 4。 每层 router 为 $512\times4=2048$。总参数是在题 1 基础上增加两层各 3 个额外专家,以及两个 router:
$$ 16,271,872+2\times3\times2,359,296+2\times2048=30,431,744 $$
激活参数比原 Dense 每层多激活一个专家,并加入 router:
$$ 16,271,872+2\times2,359,296+2\times2048=20,994,560 $$
题 5。 总吞吐 $16/0.025=640$ token/s,单序列为 40 token/s。TPOT 为 $(2.0-0.4)/(81-1)=0.02$ s,即 20 ms。第二组数据是独立请求示例,不要求与第一组固定 step 的数值一致。
题 6。 计算时间为 $120\times10^9/(240\times10^{12})=0.5$ ms;带宽时间为 $24\times10^9/(1.2\times10^{12})=20$ ms。时间下界 20 ms,理想聚合吞吐不超过 $8/0.020=400$ token/s。额外开销会使实际结果更低。
题 7。 $16[1-(7/8)^8]\approx10.50$ 个。单 token 的激活路径和 batch 的专家并集是两个集合,不矛盾。
题 8。 若假定 $d_h=8192/64=128$,则 $d_{kv}=1024$,可先确定 $P_{\rm attn}=2\times8192^2+2\times8192\times1024$。仍缺专家宽度、top-k、MoE 层分布、共享专家、词表与绑定等。吞吐还缺 batch、上下文、dtype、硬件、并行和效率。不能只凭专家总数得出激活参数。
题 9。 一次 Prefill 得到第一个输出,四次 Decode 得到其余输出。对应 key 数是 129、130、131、132;最后一个输出不必再进入模型。假定每层全注意力且没有滑动窗口。
题 10。 $d_q=8$。完整方阵为 $4\times8\times3^2=288$ FLOPs;合法配对数为 6,因果有效工作量为 $4\times8\times6=192$ FLOPs。短序列包含对角线时,比例不严格等于二分之一。
6 常见错误与修正
| 错误说法 | 修正 |
|---|---|
| 每生成一个 token 增加若干模型参数 | 权重共享,新增的是运行时工作和缓存 |
| Attention 永远是 $4d^2$ 参数 | 仅在本文等宽 MHA 假设下成立;GQA 要缩小 K/V 投影 |
| FFN 永远是两组矩阵 | SwiGLU 有三组矩阵 |
| KV Cache 用 Q head 数计算 | 标准 GQA 应使用 KV head 数 |
| 激活参数就是激活显存 | 一个是权重个数,一个是中间数据 bytes |
| MoE 总参数乘 top-k/E 就是激活参数 | 共享部分与 router 不这样缩减 |
| 单 token 激活权重就是 batch 的权重读取量 | 不同 token 可触达不同专家 |
| FlashAttention 把全注意力变成线性 FLOPs | 它主要改善 IO 和中间存储,主项仍为二次 |
| 已知模型参数就能唯一算吞吐 | 还需要负载、硬件、实现与指标口径 |
| 总 tokens/s 越高,单用户越快 | batch 可提高聚合吞吐,却增加 step 延迟 |
| 权重量化后 KV 同比减少 | 两种 dtype 独立 |
| 多卡速度必然按卡数线性提升 | 通信、复制、形状变化与负载均衡都会限制扩展 |
7 三个实践任务
实践 A 手算与参数列表对账。 选一个能访问配置和模型定义的小模型,逐项列出矩阵形状,用“所有不同可学习参数的元素数之和”对账。遇到共享权重要去重;遇到额外参数则反查模块来源。完成标准是能解释差额来自哪里,而不是只让总数接近。
实践 B 容量曲线。 固定 KV dtype,分别令上下文为 1K、2K、4K、8K,batch 为 1、8、32,画出逻辑 KV bytes。若有设备,再测物理内存,解释分页、预分配和临时 workspace 导致的差异。只计算显存分配器的 reserved 值时,要标注它不是有效张量的净大小。
实践 C 瓶颈曲线。 固定输入输出长度,在若干 batch 下测 Prefill 时间、Decode step 时间、聚合吞吐与单序列速度,和第 5 章资源模型对比。保留硬件、框架版本、缓存条件和原始计时。没有设备时可以先做理论曲线,但不能将它命名为实测 benchmark。
完成本套学习的标准:面对一个未见过的配置,你能先写出矩阵形状,再独立推导参数与 KV;能区分 Prefill 的平方项和 Decode 的线性项;能给吞吐估算列出条件,并说明为何实测可能偏离。
返回:学习入口。