考察点
这是资源评估的基本功题,面试官想确认你报资源需求时不是拍脑袋。核心考点三个:推理显存 = 权重 + KV cache + 激活,会口算;训练显存为什么远超推理(Adam 优化器状态、梯度、混合精度副本),记住 16-18 倍系数的由来;量化每降一档精度省多少。追问常往 KV cache 随并发增长、ZeRO 切分、梯度检查点省显存的代价上走。
参考答案
推理显存
推理时显存主要三块:模型权重、KV cache、激活值和框架开销。
权重最简单:参数量 × 每参数字节数。fp16/bf16 每参数 2 字节,7B 模型就是 7 × 2 = 14GB。INT8 量化减半到约 7GB,INT4 再减半到约 3.5GB。口算公式:fp16 下显存 GB 数 ≈ 参数量(B) × 2。
KV cache被低估最多。公式:2 × 层数 × KV head 数 × head 维度 × 序列长度 × batch size × 2 字节。以 LLaMA-2-7B(32 层、32 KV 头、head 维度 128)为例:每 token 的 KV cache = 2 × 32 × 32 × 128 × 2B ≈ 0.5MB。一个 4K 上下文的请求就占约 2GB,batch 开 8 个就是 16GB——比权重还大。这就是为什么线上推理是 memory-bound,也是 GQA(KV 头砍到 1/4)和 KV cache 量化的价值所在。注意 KV head 数看具体模型,GQA 模型的 KV cache 要按 KV 头而非 Q 头算。
激活与开销:推理激活不大(逐 token 算),但框架本身(CUDA context、显存碎片、vLLM 预留)通常要留 2-4GB 余量。
结论:7B fp16 单卡推理,权重 14GB + 适度并发 KV cache,一张 24GB 卡(4090/A10)能跑;INT4 量化后 8GB 卡也够用。70B fp16 要 140GB+,得 2 张 A100-80G 起步。
训练显存
训练比推理贵一个数量级,因为多了梯度、优化器状态和混合精度副本。以最常用的 Adam + bf16 混合精度为例,每个参数要存:
| 内容 | 精度 | 字节/参数 |
|---|---|---|
| 权重副本(master weights) | fp32 | 4 |
| Adam 一阶动量 m | fp32 | 4 |
| Adam 二阶动量 v | fp32 | 4 |
| 梯度 | fp32 | 4 |
| 前向/反向用的权重 | bf16 | 2 |
| 梯度(bf16,视实现) | bf16 | 0-2 |
合计约 16-18 字节/参数。7B 全量训练光参数相关状态就要 7 × 16 ≈ 112GB,单卡放不下,这就是为什么 7B 全量微调通常要 4-8 张 A100,或者上 ZeRO。
还没算激活值:反向传播要存每一层的中间输出,随 batch size 和序列长度线性增长,长序列训练时激活能占到和参数状态同量级。对策是梯度检查点(activation checkpointing):只存部分层的激活,反向时重算,用约 30% 的额外计算换激活显存大幅下降,基本是训练标配。
省显存的工程手段
- ZeRO(DeepSpeed):把优化器状态、梯度、参数按数据并行的卡数切分。ZeRO-3 下 7B 的参数状态 112GB 摊到 8 卡,每卡只剩 14GB,加上切分后的参数和激活,单卡 A100-80G 可行。代价是通信量上升。
- LoRA/QLoRA:冻结基座,只训低秩适配矩阵,优化器状态只为 LoRA 参数开(通常不到 1% 参数量),7B LoRA 微调单卡 24GB 可行;QLoRA 再把基座量化到 4bit,单卡 4090 就能玩。这是应用方做定制微调的现实选择。
- 量化推理:INT8 基本无损,INT4(GPTQ/AWQ)掉点可控,显存直接减半再减半。
训练时间估算(FLOPs 视角)
顺带记住训练 FLOPs 公式:C ≈ 6 × N × D,N 是参数量,D 是训练 token 数(系数 6 = 前向 2 + 反向 4)。7B 模型训 1T token 约需 6 × 7e9 × 1e12 = 4.2e22 FLOPs,按 A100 实际利用率(MFU 40% 左右,约 120 TFLOPS 有效算力)折算,大约 1000 张 A100 跑 4 天,或 100 张跑 40 天。这个量级感能帮你在面试里快速评估「这个需求靠不靠谱」。推理 FLOPs 约 2 × N × 生成 token 数,这就是为什么推理便宜得多。
可能的追问
- 为什么训练用 Adam 而不是 SGD? Transformer 训练对自适应学习率高度敏感,Adam 收敛速度和稳定性远好于 SGD;代价就是 m、v 两份状态吃掉 8 字节/参数,才有 Sophia、Lion 等省显存优化器的研究。
- 8 卡 A100 能全量训 70B 吗? 参数状态 70 × 16 = 1120GB,ZeRO-3 摊到 8 卡每卡 140GB,超了;需要更多卡或 ZeRO-Offload 把优化器状态放 CPU,吞吐会打折。
- 推理时 batch 开大为什么吞吐提升但有限? 权重只读一次被多请求摊薄,但 KV cache 随 batch 线性涨,显存先满;且长序列下 attention 的显存读取成为瓶颈,vLLM 的 PagedAttention 就是为解决 KV cache 碎片和过量预留。