推理和训练有什么不一样
前面讲了训练。但大模型跑起来后,更多时间是在做推理——响应用户请求,生成回答。
推理和训练差别很大,优化方向完全不同。这篇讲清楚两者的区别。
核心区别
训练
- 目标:更新模型参数,让模型变「聪明」
- 方向:前向 + 反向传播
- 数据:大批量(batch size 几百几千)
- 耗时:几天到几个月
- 状态:有状态(要存梯度、优化器状态)
推理
- 目标:用训练好的模型生成输出
- 方向:只有前向传播
- 数据:小批量(单条或几十条)
- 耗时:毫秒到秒级
- 状态:无状态(每次请求独立)
显存占用对比
训练时显存
模型参数:14GB(7B × FP16)
梯度:14GB
优化器状态:28GB(Adam)
激活值:几十 GB(取决于 batch size)
────────────────
总计:80-120GB+
推理时显存
模型参数:14GB(7B × FP16)
KV Cache:动态增长(取决于上下文长度和并发数)
输入输出:很小
────────────────
总计:14GB + KV Cache
推理不用存梯度和优化器状态,显存占用小很多。但 KV Cache 是新的显存大户。
计算特点对比
训练
- 计算密集:大 batch,矩阵乘法可以充分并行
- 带宽不敏感:数据复用率高
- 瓶颈:通常是算力
推理
- 访存密集:每生成一个 token 要读一遍模型参数
- 带宽敏感:数据复用率低
- 瓶颈:通常是显存带宽
为什么推理是带宽瓶颈
看 Transformer 的推理过程:
生成第 N 个 token 时:
- 读取全部模型参数(几十 GB)
- 做矩阵乘法(计算量相对不大)
- 输出一个 token
每生成一个 token 都要读一遍参数。
算一下:
- 7B 模型 FP16 = 14GB 参数
- 要达到 50 tokens/s
- 需要 14GB × 50 = 700 GB/s 带宽
A100 的显存带宽是 2 TB/s,勉强够。但如果模型更大、速度要求更高,带宽就成瓶颈了。
延迟 vs 吞吐
推理场景关注两个指标:
延迟(Latency)
单个请求从开始到结束的时间。
- 首 token 延迟(TTFT):收到请求到输出第一个 token 的时间
- 每 token 延迟(TPOT):生成每个 token 的平均时间
- 总延迟:整个回答生成完的时间
用户体验主要看 TTFT 和 TPOT。TTFT 快,用户感觉响应快;TPOT 低,打字效果流畅。
吞吐(Throughput)
单位时间处理的请求数或生成的 token 数。
- tokens/s:每秒生成多少 token
- requests/s:每秒处理多少请求
运营成本主要看吞吐。吞吐越高,单位成本越低。
延迟和吞吐的矛盾
- 追求低延迟:batch size 小,GPU 利用率低,吞吐差
- 追求高吞吐:batch size 大,排队时间长,延迟高
要在两者之间找平衡。
Prefill 和 Decode
大模型推理分两个阶段:
Prefill(预填充)
处理用户输入的 prompt。
输入:「请介绍一下人工智能」(假设 10 个 token)
Prefill 阶段:
- 一次性处理 10 个 token
- 计算所有 token 的 K、V
- 存入 KV Cache
- 输出第一个 token
特点:
- 计算密集(可以并行处理所有输入 token)
- GPU 利用率高
- 延迟 = TTFT
Decode(解码)
自回归生成输出。
Decode 阶段:
- 每次只处理 1 个 token
- 读取 KV Cache
- 输出下一个 token
- 重复,直到生成完
第 1 步:生成「人」
第 2 步:生成「工」
第 3 步:生成「智」
...
特点:
- 访存密集(每步都要读 KV Cache 和模型参数)
- GPU 利用率低(只处理 1 个 token)
- 延迟 = TPOT × 输出 token 数
时间占比
对于长输出:
- Prefill:10-20%
- Decode:80-90%
Decode 是大头,所以推理优化主要优化 Decode。
推理优化方向
1. 减少计算量
量化:用更低精度表示参数
FP16 → INT8:计算量减半
FP16 → INT4:计算量减 75%
精度降低,速度提升,效果略有损失。
稀疏化:跳过不重要的计算
剪枝:去掉不重要的参数
2. 减少访存
KV Cache 优化:减少 KV Cache 大小
算子融合:减少中间结果的读写
FlashAttention:优化 Attention 计算的访存模式
3. 提高并行度
Continuous Batching:动态组 batch,提高 GPU 利用率
Speculative Decoding:用小模型预测,大模型验证
张量并行:多卡并行计算
4. 系统优化
高效 runtime:CUDA kernel 优化
调度优化:智能请求调度
内存管理:避免碎片,提高利用率
训练优化 vs 推理优化
| 方面 | 训练优化 | 推理优化 |
|---|---|---|
| 目标 | 更快收敛,更省显存 | 更低延迟,更高吞吐 |
| batch size | 越大越好 | 看场景权衡 |
| 精度 | FP16/BF16 混合 | INT8/INT4 量化 |
| 并行方式 | 数据+模型+流水线 | 张量并行为主 |
| 关键指标 | 训练吞吐(samples/s) | TTFT、TPOT、tokens/s |
| 典型工具 | DeepSpeed、Megatron | vLLM、TensorRT-LLM |
推理的部署模式
离线批处理
一次处理大量请求,不要求实时。
- 延迟不敏感
- 追求吞吐最大化
- 可以用大 batch
场景:数据标注、批量生成、评测
在线服务
实时响应用户请求。
- 延迟敏感
- 需要平衡延迟和吞吐
- 要考虑并发、排队
场景:聊天机器人、API 服务
边缘/端侧
在用户设备上运行。
- 资源受限(手机、PC)
- 隐私要求
- 需要极致压缩
场景:手机助手、本地应用
小结
推理和训练的核心区别:
| 方面 | 训练 | 推理 |
|---|---|---|
| 目的 | 更新参数 | 生成输出 |
| 计算 | 前向+反向 | 只有前向 |
| 瓶颈 | 算力 | 带宽 |
| 显存 | 参数+梯度+优化器+激活 | 参数+KV Cache |
| 指标 | 训练吞吐 | 延迟+推理吞吐 |
| 精度 | FP16/BF16 | INT8/INT4 |
推理的两个阶段:
- Prefill:处理输入,计算密集
- Decode:生成输出,访存密集
优化方向:量化、KV Cache 优化、Batching、系统优化
下一篇详细讲 KV Cache:为什么显存越用越多。