Learn learn.scuai.cn

云服务和 AI Infra / 第一部分 基础

第 2 章 AI 工作负载有什么不同

Preman · 样章

这是用于展示版式的示例章节,内容由页面模板附带,待作者替换为正式文稿。

一个普通的 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 总数决定成本,而不直接决定体验

把多个请求合在一起批处理,可以更充分地利用加速卡,提高吞吐、降低单位成本;但每个请求可能要多等一会儿。推理服务的很多工程工作,都是在这两者之间找平衡。

要点批处理提高吞吐,但会拉长等待。

对架构的影响

把上面三点放回整条路径中看:

Alg Infra API f g 本章所在
经 f 来的代码要在 Infra 上可靠运行,才能经 g 交付为 API。
  • 容量规划的单位从“每秒请求数”变成“每秒 Token 数”和“同时在处理的上下文长度”。
  • 选机器先看显存和显存带宽,再看算力。
  • 成本按 GPU 小时或按 Token 计,空闲的 GPU 同样在花钱,所以伸缩策略比传统服务更重要。

要点按 GPU 和 Token 规划,而不只是按请求数。