推理优化
10.4 容量规划:从 SLO 与峰值 QPS 反推集群规模
容量规划的完整方法论:算力需求(FLOPs 模型)、显存需求(权重+KV缓存+激活)、单副本压测、集群规模与成本估算
容量规划成本估算FLOPs显存压测
部署的最后一步:买多少卡。容量规划的输入是”业务承诺”(峰值 QPS、SLO),输出是”卡数与成本”。这一节给出一套完整的计算方法:算力(FLOPs)→ 显存(KV Cache)→ 单副本实测 → 集群规模 → 成本。
📑 目录
- 1. 容量规划的完整流程
- 2. 算力需求估算:FLOPs 模型
- 3. 显存需求估算:权重 + KV Cache + 激活
- 4. 单副本实测:把理论变成数据
- 5. 集群规模与成本估算
- 📝 总结
- 🎯 自我检验清单
- 📚 参考资料
1. 容量规划的完整流程
业务输入(必须量化,否则一切白算)
├── 峰值 QPS(含未来 6-12 个月的成长系数)
├── 平均 prompt token 数、平均输出 token 数
├── SLO(TTFT p95、TPOT p95)——第 9.1 章
└── 冗余系数(故障转移 + 扩缩容延迟缓冲)
五步法:
1. 算力估算 → 理论吞吐上限(FLOPs 模型,第 2 节)
2. 显存估算 → 单卡能塞下什么(第 3 节)
3. 单副本压测 → 该模型+该卡的实测吞吐与时延(第 4 节)
4. 求副本数 → max(算力所需, 显存所需, SLO 所需)(第 5 节)
5. 成本估算 → 卡数 × 单价 + 存储网络(第 5 节)
📌 关键点:第 2、3 步是”理论天花板”,第 4 步是”现实地板”——理论算出的吞吐永远高于实测(图捕获、调度开销、IO 竞争)。容量规划必须落在实测数据上,理论只用来预筛”这个模型在这张卡上有没有可能”。
2. 算力需求估算:FLOPs 模型
2.1 一次请求的 FLOPs
LLM 推理的算力消耗:每生成一个 token ≈ 2 × 参数量 FLOPs(2N 法则,即每个参数做一次乘一次加;prefill 每处理一个 token 同理)。
单个请求总 FLOPs ≈ 2N × (prompt_tokens + output_tokens)
例:Llama-3.1-70B(N = 70e9),prompt 2000 token,输出 512 token
单请求 FLOPs = 2 × 70e9 × (2000 + 512) ≈ 3.5e14 FLOPs
2.2 理论吞吐上限
理论吞吐 = 单卡 FP16 算力 × 利用率系数 / 单 token FLOPs
例:H100(FP16 ≈ 989 TFLOPS),利用率取 0.35(推理典型值)
每秒可处理 token = 989e12 × 0.35 / (2 × 70e9) ≈ 2470 token/s
按平均输出 512 token、平均请求 prompt 2000 token:
每秒可处理请求 ≈ 2470 / (2000 + 512) ≈ 0.98 req/s ≈ 3.5k req/h
2.3 利用率系数的经验值
| 场景 | 利用率系数 | 说明 |
|---|---|---|
| 纯 decode(KV 命中) | 0.2-0.4 | 访存受限(第 2 章) |
| 混合负载 | 0.3-0.5 | 取决于 batch 大小与 prefill 占比 |
| 大 batch + 长序列 | 0.5-0.7 | 算力利用率最高 |
💡 提示:利用率系数是”容量规划最大的不确定性”——所以第 4 步的实测不可跳过。理论估算差 2 倍很正常,用实测值回填系数,后续估算才有意义。
3. 显存需求估算:权重 + KV Cache + 激活
3.1 显存构成
单副本显存 = 权重 + KV Cache + 激活/图 + 冗余
① 权重(FP16 无量化):2 × 参数量
Llama-3.1-70B → 140 GB(一张 H100 80G 放不下 → 至少 TP2 或量化)
② KV Cache:2(K+V)× 2(FP16)× 层数 × 头维度 × 序列长度 × batch
简化式:KV Cache ≈ 2 × hidden_size × num_layers × max_seq_len × batch × 2 bytes
③ 激活与 CUDA Graph:通常占显存的 10-20%(峰值 prefill 时刻)
④ 冗余:留 10-20% 余量(碎片、加载峰值)
3.2 一个算例:Llama-3.1-70B 在 H100-80G
权重(FP16) = 140 GB ✗ 一张卡放不下
权重(INT8 量化) = 70 GB
KV Cache 预算 = 80 - 70 - 10(激活) ≈ 10 GB(几乎没空间)
结论:70B 用 INT8 单卡 ≈ 塞得下但 KV 极小 → 低并发
正经方案:TP2(权重 140/2=70G/卡)+ 每卡 KV 预算 ~6G
或 4-bit 量化单卡(~40G 权重),KV 空间充足
3.3 显存是”硬约束”,算力是”软约束”
| 约束 | 性质 | 表现 |
|---|---|---|
| 显存 | 硬——超了直接 OOM | 决定”这个模型最少几张卡” |
| 算力 | 软——超了只变慢 | 决定”满足 QPS 需要几张卡” |
实际需要的卡数 = max(显存最小卡数, 算力所需卡数, SLO 所需卡数)
📌 关键点:先算显存、再算算力——显存算不过直接排除方案(比如 70B FP16 单卡 80G 直接排除),省掉后面的压测。量化(第 4 章)在这里的收益是”把显存约束下移一个档位”。
4. 单副本实测:把理论变成数据
4.1 测什么
| 项 | 方法 | 产出 |
|---|---|---|
| 最大吞吐 | 9.2 节压测(vllm bench serve/throughput) | req/s、token/s |
| SLO 拐点 | 逐步加压,记录 TTFT/TPOT 分位数 | 满足 SLO 的最大 QPS |
| 显存边界 | 长序列 + 大 batch | KV 上限、OOM 边界 |
4.2 压测负载要贴近生产
必须复刻:
- prompt 长度分布(平均值 + 长尾!长尾决定 KV 需求)
- 输出长度分布(QPS 相同,输出翻倍 → 吞吐需求翻倍)
- 前缀重复度(命中率高 → 有效吞吐大增,10.3 前缀路由)
不要用:
- 单一固定长度(严重低估长尾)
- 随机无前缀 prompt(高估算力需求——生产有缓存命中)
4.3 压测产出样例
模型:Llama-3.1-70B(INT8),H100 × 2(TP2),prompt 2000/输出 512
max_throughput ≈ 1500 token/s
SLO 内最大 QPS ≈ 1.2 req/s(TTFT p95 < 2s)
KV 缓存上限 ≈ 40k token(单副本并发上限)
💡 提示:同一模型在不同业务负载下,“SLO 内最大 QPS”能差 3-5 倍。容量规划报告里必须附上压测负载画像——没有画像的数字无法复现,也无法在业务变化时重新校准。
5. 集群规模与成本估算
5.1 副本数计算
例:业务承诺 峰值 10 QPS,SLO 内单副本 1.2 QPS
副本数 = 10 / 1.2 ≈ 8.3 → 取 9
加冗余:9 × 1.3(30% 冗余:故障转移 + 扩缩容延迟缓冲)≈ 12 副本
再加高峰缓冲:峰值 × 成长系数 1.5(未来 12 个月)→ 13-14 副本
卡数 = 副本数 × 单副本卡数(TP2 → ×2)≈ 26-28 张 H100
5.2 成本估算公式
月成本 = 卡数 × 单卡月成本 + 存储/网络 + 人力运维
单卡月成本参考(2025-2026 市场价,地区差异大):
H100 80G ≈ \$2.5-4/h(按需云)→ 月 ~\$1800-2900(7×24)
A100 80G ≈ \$2-3/h
L40S ≈ \$1-1.5/h(性价比推理卡)
例:28 张 H100 按需 ≈ 28 × \$2.5/h × 720h ≈ \$50k/月
包年/预留 ≈ 省 40-60%
推理专用卡(L40S/H200/国产卡)→ 按算力需求重算,通常更优
5.3 省钱杠杆(按效果排序)
| 杠杆 | 机制 | 幅度 |
|---|---|---|
| 预留实例/包年 | 削云厂商溢价 | 40-60% |
| 量化降档(第 4 章) | 4-bit → 单卡塞更大模型 / KV 翻倍 | 30-50% 卡数 |
| 投机解码(第 5 章) | 同卡更多 token/s | 20-60% |
| PD 分离(第 7 章) | 两类资源按需配比 | 20-40% |
| KV offload / LMCache | 缓存跨实例共享 | 10-30% |
| 缩容策略(10.3) | 低谷缩副本 | 视负载曲线 |
📌 关键点:容量规划的产出不是”一个数字”,而是一个可调模型——QPS、prompt/输出长度、SLO、量化档位、冗余系数,每个参数都能调,每个参数调了都有成本影响。把公式做成表格/脚本(输入业务参数 → 输出卡数与成本),业务变化时 5 分钟重算,而不是重新做一遍规划。
📝 总结
- 五步法:算力(FLOPs)→ 显存 → 单副本实测 → 副本数 → 成本
- 2N 法则:每 token ≈ 2 × 参数量 FLOPs;理论吞吐 = 算力 × 利用率 / 单 token FLOPs
- 显存是硬约束:权重 + KV Cache + 激活 + 冗余;先算显存排除方案
- 实测不可跳过:利用率系数是最大不确定性,用实测回填
- 副本数 = max(显存, 算力, SLO) × 冗余系数 × 成长系数
- 省钱杠杆:预留实例 > 量化 > 投机解码 > PD 分离 > KV offload > 缩容
- 产出是可调模型,不是一次性数字
🎯 自我检验清单
- 单 token 的 FLOPs 为什么是 2N?能推导吗?
- 理论吞吐的上限公式与利用率系数经验值?
- 显存四件套是什么?70B FP16 为什么一张 H100 放不下?
- 为什么容量规划必须实测?压测负载要复刻哪些特征?
- 副本数 = max(显存, 算力, SLO) × 冗余 × 成长 的每一步含义?
- 六个省钱杠杆按效果排序?
- 怎么把容量规划做成”可调模型”?
📚 参考资料
- vLLM 官方文档:Performance Benchmarking(吞吐与时延基准)(https://docs.vllm.ai/en/latest/performance/benchmarks/benchmarks.html)
- vLLM 官方文档:Optimization(显存优化技巧)(https://docs.vllm.ai/en/latest/configuration/optimization.html)
- NVIDIA 白皮书:Achieving Peak Performance for LLM Inference(FLOPs 模型与利用率分析)
- Kubernetes 成本管理最佳实践(https://kubernetes.io/docs/concepts/cluster-administration/)