云服务和 AI Infra / 第一部分 基础
第 2 章 AI 工作负载有什么不同
一个普通的 Web 服务,瓶颈通常在数据库、网络或者 CPU。把同样的经验直接搬到大语言模型上,往往会估错成本,也会选错机器。这一章先建立直觉:AI 工作负载到底“重”在哪里。
两种负载:训练与推理
训练是用大量数据反复调整模型参数,通常集中在一段时间内、占用大量加速卡,结束后产出一份权重。推理是拿这份权重回答一个个具体请求,它没有“结束”的时候,只要服务在线就一直在消耗资源。
对于大多数应用团队,真正长期面对的是推理:直接调用模型 API,或者自己部署开源模型提供服务。本书的重点也在这里。
要点训练一次很贵,推理每天都在花钱。
显存是第一约束
部署一个模型,首先要问的是:它放得进显存吗?显存里主要有两样东西。
- 模型权重。参数量乘以每个参数的字节数。70 亿参数的模型用 FP16(每个参数 2 字节)存放,大约需要 14 GB。
- KV 缓存。生成文本时,模型为已经处理过的每个 Token 保存注意力的键和值,上下文越长、同时服务的请求越多,占用越大。
KV 缓存的大小可以粗略估算:
# 每个 Token 的 KV 缓存字节数
kv_bytes_per_token = 2 * n_layers * n_kv_heads * head_dim * bytes_per_value
# 例:32 层、32 个 KV 头、head_dim = 128、FP16(2 字节)
2 * 32 * 32 * 128 * 2 = 524,288 字节 ≈ 0.5 MiB
# 一个 4096 Token 的请求 ≈ 2 GiB
也就是说,一张卡除了放下权重,还要为“同时在处理的上下文总长度”留出空间。这直接决定了一张卡能同时服务多少请求。
要点权重和 KV 缓存决定一张卡能放下什么。
延迟与吞吐
大语言模型的回答是一个 Token 一个 Token 生成的。衡量体验时,常用两个延迟指标:
| 指标 | 含义 | 用户感受 |
|---|---|---|
| 首 Token 延迟 | 从发出请求到收到第一个 Token 的时间 | “它开始回答了吗” |
| 每 Token 间隔 | 后续 Token 之间的平均时间 | “它说得够快吗” |
| 吞吐 | 单位时间内整套服务生成的 Token 总数 | 决定成本,而不直接决定体验 |
把多个请求合在一起批处理,可以更充分地利用加速卡,提高吞吐、降低单位成本;但每个请求可能要多等一会儿。推理服务的很多工程工作,都是在这两者之间找平衡。
要点批处理提高吞吐,但会拉长等待。
对架构的影响
把上面三点放回整条路径中看:
- 容量规划的单位从“每秒请求数”变成“每秒 Token 数”和“同时在处理的上下文长度”。
- 选机器先看显存和显存带宽,再看算力。
- 成本按 GPU 小时或按 Token 计,空闲的 GPU 同样在花钱,所以伸缩策略比传统服务更重要。
要点按 GPU 和 Token 规划,而不只是按请求数。