先记住一句话
LoRA 减少可训练参数,量化减少每个数的位宽,KV cache 避免重复计算历史,FlashAttention 减少显存 IO,vLLM 改善请求级 cache 管理;ZeRO/FSDP 和模型并行则把训练状态与计算分到多卡。
1. 先区分训练显存花在哪里
全参数训练不仅存模型权重,还要存梯度、optimizer states 和为反向传播保留的 activations。以 Adam 为例,optimizer 常为每个参数维护一阶、二阶矩;混合精度训练还可能保留高精度 master weights。
所以“模型权重能装进一张卡”不代表它能全量训练。Batch size、sequence length 和 activation checkpointing 也会显著改变峰值显存。
例 1:1B 参数 Adam 训练的静态状态量级
粗略假设 bf16 权重 2 bytes、bf16 gradient 2 bytes、fp32 master weight 4 bytes、Adam 一阶与二阶各 4 bytes:
这还不含 activations、临时 buffer、allocator 碎片。只有 2 GB 权重绝不表示 2 GB 就能训练。
2. LoRA:只训练低秩增量
冻结预训练矩阵 $W\in\mathbb R^{d_{out}\times d_{in}}$,把更新写成低秩分解:
$A\in\mathbb R^{r\times d_{in}}$、$B\in\mathbb R^{d_{out}\times r}$,且 $r\ll d$。训练参数从 $d_{out}d_{in}$ 降到 $r(d_{in}+d_{out})$。优化器 states 和梯度只需为 A/B 保存。
LoRA 假设任务适配所需权重变化近似低 intrinsic rank。它可插入 attention/MLP 的若干线性层,推理前还能把 $BA$ 合并进 $W$,因此不必增加额外路径延迟。
低 rank 不等于永远不损失能力:任务跨度大、数据多、需要重塑底层表示时,全量微调可能更强;target modules、rank、scaling 和数据质量都重要。
例 2:LoRA 参数量
$W$ 为 $4096\times4096$,原矩阵有 $16{,}777{,}216$ 参数。取 rank $r=8$:
仅为原矩阵的 $65{,}536/16{,}777{,}216=0.390625\%$;前向仍需使用完整 base matrix。
3. QLoRA 与普通量化的区别
QLoRA 把冻结的 base weights 存成 4-bit,计算时按需要反量化到计算 dtype,并通过它反向传播到 BF16/FP16 LoRA adapters。它不是用 4-bit optimizer 去更新所有 base parameters。
QLoRA 还引入适合近似正态权重分布的 NF4、double quantization 和 paged optimizers 来降低内存峰值。主要节省是 base model 存储;adapter、activations 和部分计算仍用更高精度。
4. Quantization 在压缩什么?
| 对象 | 收益 | 主要风险 |
|---|---|---|
| Weight-only | 模型更小、权重带宽更低 | 反量化与 kernel 是否高效 |
| Weights + activations | 矩阵乘可用低精度硬件 | activation outliers、校准 |
| KV cache | 长上下文/大 batch cache 更小 | attention 质量与解码 kernel |
Per-channel/group scaling 通常比整张 tensor 一个 scale 更准确。位宽更低不保证 wall-clock 更快:如果硬件缺少对应 kernel,频繁 pack/unpack 可能抵消收益。
例 3:对称 int8 量化
一组权重最大绝对值 1.27,int8 正范围到 127,scale=$1.27/127=0.01$。权重 0.37 量化为 $q=\operatorname{round}(0.37/0.01)=37$,反量化 $37\times0.01=0.37$;权重 0.374 则变 0.37,误差 -0.004。
5. KV cache 为什么省计算却吃显存?
自回归生成第 $t$ 个 token 时,过去 token 的 K/V 不会改变。缓存后只需计算新 token 的 Q/K/V,并让新 Query 关注缓存;否则每一步都要重算全部历史。
KV cache 大小大致与下式成正比:
2 代表 K 和 V,$L$ 是层数,$T$ 是上下文长度。长上下文和并发请求使 cache 成为 serving 主显存瓶颈。
Multi-Query Attention 让所有 Query heads 共享一组 K/V;Grouped-Query Attention 让一组 Query heads 共享 K/V,位于 MHA 与 MQA 之间。它们减少 KV heads,从而降低 cache 和 memory bandwidth。
例 4:KV cache 精确量级
$L=32,T=4096,H_{kv}=8,d_{head}=128$,bf16 2 bytes,batch 1:
Batch 16 时约 8 GiB。若从 32 KV heads 改为 8,cache 正好降到四分之一。
6. FlashAttention 优化的不是数学结果
朴素 attention 会把巨大 $N\times N$ score/softmax matrix 写到 GPU HBM,再多次读回。FlashAttention 按 block 在片上 SRAM 中计算,并用 online softmax 分块归一化,避免 materialize 完整矩阵。
它是 exact attention(允许正常浮点误差),主要降低 HBM IO 和中间显存。标准 dense attention 的理论 FLOPs 仍约 $O(N^2)$;它让同样计算更贴合 GPU memory hierarchy,而不是把算法突然变成线性。
例 5:不 materialize score matrix
序列 8,192、单 head 的 fp16 score matrix 有 $8192^2=67{,}108{,}864$ 项,约 128 MiB。32 heads 若都显式保存就是约 4 GiB(单层、未计其他激活)。FlashAttention 分块维护 online softmax 统计量,避免把这张完整矩阵写回 HBM。
7. vLLM / PagedAttention 管理的是请求碎片
不同请求长度、生成速度和 beam 数不同。若为每个请求预留连续最大 KV buffer,会浪费大量空闲空间并产生碎片。PagedAttention 把 KV cache 分成固定大小 blocks,用类似虚拟内存的 block table 把逻辑连续 token 映射到非连续物理块。
这让 block 可按需分配、共享和释放,配合 continuous batching 在请求到达/结束时动态调整 batch,提高吞吐。它优化的是 serving memory management,不是新的 attention 训练目标。
例 6:连续预留与分页
三个请求实际需要 100、260、20 个 token,却都按最大 512 预留:占 1,536 slots,实际只用 380,利用率 24.7%。若 page size 16,各自需 7、17、2 页,共 416 slots,利用率 91.3%。
8. Speculative decoding 为什么还能保持目标分布?
小 draft model 快速提出多个 token,大 target model 一次并行验证。按接受/拒绝规则修正后,输出仍可采样自 target distribution。若 draft 与 target 高度一致,一次 target forward 接受多个 token,减少串行步数;若接受率低,额外 draft 计算可能不划算。
例 7:speculative 的有效步长
Draft 每轮提议 4 tokens,平均接受 3 个,再由 target 补 1 个,则一次 target 验证平均前进约 4 tokens;生成 100 tokens 约需 25 次 target rounds,而普通 decoding 需 100 次。真实速度还要扣除 draft 成本与拒绝浪费。
9. 多 GPU 训练到底切分什么?
| 方法 | 切分对象 | 主要通信 |
|---|---|---|
| Data Parallel | 样本;每卡复制完整模型 | 梯度 all-reduce |
| ZeRO / FSDP | optimizer、gradients、parameters 分片 | 按需 all-gather / reduce-scatter |
| Tensor Parallel | 单层大矩阵的行/列或 heads | 层内 collective |
| Pipeline Parallel | 按层分 stage | stage 间 activations;micro-batch pipeline |
| Context/Sequence Parallel | 长序列维 | attention/sequence collectives |
现实大模型常组合 3D/4D parallelism。最佳拓扑取决于模型形状、节点内 NVLink、节点间网络、batch 和 sequence length;“能跑”与“GPU 利用率高”是不同目标。
例 8:ZeRO-3 / FSDP 的理想分片下限
若静态模型状态共 160 GB,分到 8 卡,理想均分是每卡 20 GB,而 data parallel 每卡都要 160 GB。实际峰值还包含 all-gather 中的临时完整参数片段、activations 与通信 buffer,所以不会恰好只有 20 GB。
这些技术优化的层次不同,不能互相替代。LoRA 不解决 activation memory,FlashAttention 不减少模型参数,KV cache 不加速训练,ZeRO/FSDP 也不会让单 token 推理自动变快。
自测:先算后展开
1. LoRA 主要省下哪部分训练显存?
冻结 base weights 后,只为低秩 adapter 保存梯度与 optimizer states;base 权重仍需存储和参与前向。
2. KV cache 为什么随 context 线性增长?
每层要为每个历史 token 保存 K 和 V;token 数增加一倍,缓存条目也约增加一倍。
3. FlashAttention 与稀疏 attention 的本质差别?
FlashAttention 通过 tiling/IO 优化精确 dense attention;稀疏 attention 改变被计算的连接集合以降低理论计算。
4. FSDP 与 tensor parallel 切分什么不同?
FSDP 在 data-parallel workers 间分片模型状态并按需聚合;tensor parallel 把同一层矩阵运算本身跨卡拆开。
5. 7B 参数仅以 fp16 存权重约多大?
$7\text{B}\times2$ bytes = 14 GB(十进制),不含量化 metadata、runtime buffer 与 cache。
6. Context 从 2K 增至 8K,KV cache 变几倍?attention score 数变几倍?
KV cache 随长度线性,变 4 倍;dense score 数随长度平方,变 16 倍。