跳到主要内容

容量与成本规划

容量与成本规划回答两个问题:

需要多少资源才能稳定服务?
每个请求、每个用户、每个业务线大概要花多少钱?

LLM 服务不能只按 QPS 估算容量。真正决定资源消耗的是 token、上下文长度、输出长度、并发、KV Cache、模型大小、推理框架和延迟目标。

一句话概括:

LLM 容量 = token 吞吐 + 显存容量 + 调度效率 + 延迟目标 + 冗余

1. 先明确业务目标​

容量规划不能从 GPU 数量开始,而要从业务目标开始。

需要先回答:

  • 服务是在线聊天、API 调用、内部助手、长文档总结,还是离线批处理?
  • 目标模型是什么?
  • 是否需要流式输出?
  • 用户能接受的 TTFT、ITL 和 p99 是多少?
  • 峰值流量是多少?
  • 输入和输出 token 分布是什么?
  • 是否有长上下文请求?
  • 是否有 RAG、工具调用或多模态输入?
  • 可接受的错误率、限流率和排队时间是多少?
  • 是否需要多区域、灾备或高可用冗余?

不同场景的容量目标差异很大。

场景优先目标
在线聊天TTFT、ITL、p99、稳定性
企业知识库问答RAG 延迟、引用质量、token 成本
长文档总结长上下文容量、KV Cache、超时控制
批量生成tokens/s、总完成时间、单位成本
多租户 API配额、公平性、隔离和账单

不要用离线 benchmark 的峰值 tokens/s 直接推线上容量。线上流量更复杂,有长尾、有突发、有取消、有工具调用,也有用户端慢消费。

2. QPS、并发和 Token Throughput​

LLM 服务里,QPS 只是入口请求数,不等于真实工作量。

更重要的是:

指标含义
request rate每秒进入多少请求
concurrency同时有多少请求在处理
input tokens/s每秒处理多少输入 token
output tokens/s每秒生成多少输出 token
total tokens/s输入和输出合计吞吐
active sequences推理引擎中运行的序列数
KV Cache usage当前上下文占用的缓存资源

一个粗略关系是:

平均并发 ≈ 请求到达率 × 平均请求耗时

但在 LLM 服务里,请求耗时又受 input tokens、output tokens、排队和流式输出影响。

例如两个请求都是 1 QPS:

请求类型input tokensoutput tokens资源压力
短问答300200较低
长文档总结320002000极高

所以容量规划要按 token 分布做,而不是只按请求数做。

3. 输入输出 Token 分布​

规划前要收集或估算真实流量分布。

至少需要:

  • input tokens p50 / p90 / p99。
  • output tokens p50 / p90 / p99。
  • 每日请求量。
  • 峰值请求速率。
  • 流式请求比例。
  • 长上下文请求比例。
  • 超时和取消比例。
  • 不同业务线或租户的流量占比。

建议按长度分桶:

桶示例
短输入短输出500 in / 300 out
长输入短输出16000 in / 500 out
短输入长输出1000 in / 3000 out
长输入长输出32000 in / 4000 out

这四类请求对系统的压力完全不同。

  • 长输入主要压 prefill、TTFT 和 KV Cache 初始分配。
  • 长输出主要压 decode、ITL、运行 slot 和 KV Cache 持续占用。
  • 长输入长输出最容易造成长尾和显存压力。

如果没有真实日志,可以先用产品假设和压测样本估算,但上线后要尽快用真实 token 分布修正。

4. 显存容量组成​

推理显存大致由几部分组成:

总显存占用
= 模型权重
+ KV Cache
+ runtime / framework 开销
+ CUDA workspace
+ 临时激活和 buffer
+ 碎片和安全余量

其中模型权重是启动时的固定成本,KV Cache 是运行时随上下文和并发变化的成本。

权重显存可以粗略估算:

权重显存 ≈ 参数量 × 每个参数字节数

常见精度:

精度每参数字节数说明
FP16 / BF162 bytes常见推理精度
FP81 byte依赖硬件和框架支持
INT81 byte需要量化方案支持
INT40.5 byte显存低,但质量和性能需验证

例如 32B 参数模型使用 BF16 权重,权重本身约:

32B × 2 bytes ≈ 64GB

实际加载还要考虑框架开销、tensor parallel 切分、量化元数据和运行时 buffer。

5. KV Cache 对容量的影响​

KV Cache 是 LLM 在线推理容量规划的重点。

它和这些因素相关:

  • 模型层数。
  • hidden size。
  • attention heads / KV heads。
  • KV Cache 精度。
  • 上下文长度。
  • 并发序列数。
  • 是否使用 GQA / MQA。
  • 推理框架的 cache block 管理。

直观理解:

上下文越长,并发越高,KV Cache 越大。

长上下文服务常见瓶颈不是权重放不下,而是 KV Cache 先占满。

容量规划时要区分:

项特点
模型权重固定占用,启动后基本稳定
KV Cache随并发、上下文和输出长度变化
runtime buffer随框架和 batch 参数变化

如果服务支持 128k 上下文,但大部分请求只有 2k,不代表每个请求都要按 128k 实际消耗 KV Cache。现代推理框架通常按实际 token 或 block 分配。但 max_model_len 设置过大仍可能影响预留策略、调度上限和最坏情况容量。

对应阅读:KV Cache。

6. 延迟目标决定可用吞吐​

同一组 GPU 可以在不同延迟目标下给出不同容量。

例如:

  • 离线批处理可以接受更高延迟,追求最大 tokens/s。
  • 在线聊天需要较低 TTFT 和稳定 ITL,不能把 batch 堆到极限。
  • 多租户 API 要控制 p99 和公平性,不能让少数长请求拖垮整体。

所以容量不是单一数字,而是一个条件:

在 p99 TTFT < 2s、p99 ITL < 200ms、错误率 < 0.1% 的条件下,
系统能稳定承载多少请求和 tokens/s。

压测报告如果只给峰值吞吐,没有延迟、错误率、token 分布和显存信息,不能用于生产容量规划。

7. GPU 数量估算​

一个实用估算流程:

  1. 明确模型、精度、上下文长度和推理框架。
  2. 测出单副本在目标延迟下的稳定吞吐。
  3. 用真实 token 分布估算峰值 token 需求。
  4. 按峰值需求除以单副本稳定吞吐。
  5. 加上冗余、故障和发布灰度所需容量。

粗略公式:

所需副本数 ≈ 峰值 token/s 需求 ÷ 单副本稳定 token/s

再考虑:

  • N+1 冗余。
  • 灰度发布双版本并行。
  • worker 重启和模型加载时间。
  • 区域故障或节点维护。
  • 长尾流量和突发峰值。

不要直接用理论 FLOPS 估算线上吞吐。实际吞吐受显存带宽、attention 实现、KV Cache、batch、输入输出长度、框架参数、多卡通信和调度策略影响。

8. 峰值流量和冗余​

容量规划要按峰值,不是按日均。

需要关注:

  • 日内峰值。
  • 周期性峰值。
  • 活动或发布带来的突发。
  • 批处理任务是否和在线流量抢资源。
  • 某个租户或用户的异常流量。

常见冗余策略:

策略说明
N+1任意一个副本故障时仍能承载目标流量
灰度冗余新旧版本同时运行,避免切换时无容量
峰值余量为突发请求保留 buffer
队列降级超过容量时排队、限流或异步化
多集群容灾区域故障时可切换

冗余不是浪费。LLM worker 加载模型可能很慢,如果没有余量,故障恢复期间会直接影响线上用户。

9. 多模型共享资源​

一个平台通常同时服务多个模型:

  • 小模型低成本处理简单任务。
  • 大模型处理复杂任务。
  • embedding 模型做检索。
  • rerank 模型做排序。
  • 多模态模型处理图片或音频。

共享资源时要注意:

  • 不同模型显存占用不同。
  • 不同模型的 token/s 不可直接相加。
  • 大模型和小模型混部可能造成资源碎片。
  • embedding / rerank 的 CPU、GPU 和批处理策略不同。
  • 热门模型和冷门模型的副本策略不同。

建议把模型分成资源池:

资源池适合任务
低延迟小模型池分类、改写、轻量问答
主力聊天模型池在线对话和 RAG
长上下文模型池文档总结和长上下文问答
离线批处理池批量生成和评测
embedding / rerank 池检索链路

资源池隔离可以防止离线任务或长上下文请求拖慢在线聊天。

10. 成本组成​

LLM 服务成本通常包括:

成本项说明
GPU 成本云 GPU 租用、自建折旧、电力和机房
CPU / 内存tokenizer、RAG、API 服务、工具调用
存储模型文件、向量库、日志、缓存
网络跨区传输、对象存储下载、外部 API
工程运维监控、部署、故障处理、版本管理
第三方 API外部模型、搜索、OCR、工具服务

线上成本不只来自 GPU。RAG 系统里的向量库、rerank、日志存储和工具调用也可能成为显著成本。

11. 单请求成本估算​

单请求成本可以从 token 和资源时间两种角度估算。

如果使用外部模型 API,通常按 token 计费:

单请求成本
= input_tokens × 输入单价
+ output_tokens × 输出单价
+ 其他工具或检索成本

如果自建 GPU,通常按 GPU 时间分摊:

单位 token 成本
≈ GPU 每小时成本 ÷ 每小时稳定输出 token 数

更完整地看:

单请求成本
≈ input token 成本
+ output token 成本
+ RAG 检索成本
+ rerank 成本
+ 工具调用成本
+ 日志和存储成本

输出 token 往往比输入 token 更贵,因为 decode 阶段逐 token 生成,持续占用运行 slot 和 KV Cache。

12. 云 GPU 与自建 GPU​

云 GPU 和自建 GPU 的取舍要看利用率、弹性、运维能力和现金流。

方案优势风险
云 GPU启动快、弹性好、少运维、适合波动流量长期高利用率时成本可能高,库存和实例规格受限
自建 GPU长期高利用率下单位成本可能低,可控性强前期投入高,运维复杂,扩容慢,硬件折旧和故障风险
混合模式基础流量自建,峰值用云补充调度、数据同步、版本一致性更复杂

粗略判断:

  • 流量不稳定、业务验证期:优先云 GPU。
  • 长期稳定高利用率:可以评估自建。
  • 峰谷明显:考虑混合模式。
  • 对数据驻留、网络和安全有强要求:自建或专有云更常见。

不管哪种方式,都要按真实利用率计算。GPU 长期空闲时,账面单价再低也不一定便宜。

13. 降本手段​

常见降本方式:

方式作用风险
选择更小模型降低权重显存和单 token 成本能力可能不足
量化降低显存和带宽压力质量和兼容性需验证
蒸馏用小模型承接部分任务训练和评估成本增加
路由分层简单任务走小模型,复杂任务走大模型路由错误会影响质量
prompt 压缩减少 input tokens信息丢失风险
RAG chunk 控制减少无效上下文召回不足风险
prefix cache复用固定前缀依赖请求模式
输出长度限制控制 decode 成本用户可能觉得回答不完整
批处理提高吞吐在线延迟可能变差

降本不能只看成本下降,还要看质量、延迟和故障风险。

例如 INT4 量化可能显著降低显存,但如果导致格式遵循变差、工具调用错误增加,整体业务成本可能反而上升。

14. 成本治理​

成本治理要变成系统能力,而不是靠人工提醒。

建议实现:

  • 按租户、用户、业务线统计 token。
  • 设置 token/min、token/day、monthly budget。
  • 对超长输入和长输出设置硬上限。
  • 对低优先级任务排队或异步化。
  • 对异常 token 增长告警。
  • prompt 版本发布前做 token diff。
  • 输出 finish_reason = length 时记录截断率。
  • 对 RAG chunk 数和工具调用次数设置预算。

典型预算策略:

普通用户:
max_input_tokens = 8000
max_output_tokens = 1000
token_per_minute = 20000

长文档任务:
进入异步队列
限制并发
单独计费或单独资源池

没有预算控制的 LLM API 很容易被少量长请求拉高成本。

15. 压测方法​

容量规划必须靠压测校准。

压测应覆盖:

类型目的
固定并发看不同并发下延迟和吞吐
固定请求速率模拟真实流量进入
ramp up找到服务恶化拐点
长短混合验证调度公平性
长上下文验证 KV Cache 和 TTFT
长输出验证 decode 和 ITL
突发流量验证队列、限流和恢复
灰度双版本验证发布期间容量余量

每次压测必须记录:

  • 模型和版本。
  • 精度和量化方式。
  • GPU 型号和数量。
  • 推理框架和启动参数。
  • input / output token 分布。
  • 并发或请求速率。
  • TTFT、ITL、E2E。
  • p50 / p90 / p99。
  • tokens/s。
  • 错误率、超时率、限流率。
  • GPU、显存、KV Cache。
  • worker 数量和副本策略。

没有这些上下文,压测结果不可复用。

16. 常见误区​

16.1 只按 QPS 估算​

QPS 相同,token 成本可能差几十倍甚至上百倍。

必须同时看 input tokens、output tokens、上下文长度和输出长度。

16.2 只看权重显存​

模型能加载,不代表能承载目标并发。

KV Cache、runtime buffer 和长上下文会显著增加运行时显存。

16.3 用峰值 benchmark 当生产吞吐​

benchmark 通常使用固定输入输出和理想 batch。生产环境有长尾、突发、取消、工具调用和多租户干扰。

应该使用目标延迟和错误率约束下的稳定吞吐。

16.4 忽略灰度和故障冗余​

发布新模型时,新旧版本可能同时运行。worker 故障、节点维护和模型冷启动也需要容量余量。

如果刚好按峰值配满,发布和故障都会变成风险。

16.5 只优化单 token 成本​

单 token 便宜不代表总体便宜。

如果小模型导致更多重试、人工介入或错误工具调用,业务总成本可能更高。

17. 实践检查清单​

做容量和成本规划时,至少确认:

  1. 有真实或可解释的 input / output token 分布。
  2. 区分在线聊天、长文档、批处理和 RAG 流量。
  3. 明确 TTFT、ITL、p99、错误率和限流率目标。
  4. 单副本吞吐来自目标延迟下的压测,而不是峰值 benchmark。
  5. 显存估算包含权重、KV Cache、runtime buffer 和安全余量。
  6. GPU 数量估算包含峰值、N+1、灰度和故障恢复。
  7. 长上下文和长输出请求有单独治理策略。
  8. 多模型资源池有隔离或优先级。
  9. 成本按模型、租户、业务线和 token 类型拆分。
  10. 有 token 预算、限流、告警和降级方案。
  11. 云 GPU、自建 GPU 或混合模式有利用率假设。
  12. 每次模型、prompt、RAG 或推理参数变更后重新观察成本指标。

18. 和其他概念的关系​

  • 和 并发与批处理:batch 和并发决定目标延迟下的稳定 token throughput。
  • 和 KV Cache:长上下文和高并发的显存瓶颈主要来自 KV Cache。
  • 和 推理服务架构:路由、调度、worker 和多副本决定资源利用率。
  • 和 可观测性:容量和成本规划依赖 token、延迟、GPU 和错误率指标。
  • 和 硬件选型:GPU 型号、显存、带宽和成本决定部署边界。
  • 和 模型部署流程:上线前必须用压测和灰度验证容量假设。

19. 总结​

LLM 容量规划的核心不是“买几张 GPU”,而是把业务流量翻译成 token、显存、延迟和冗余需求。

一个可靠的估算过程是:

业务目标
-> token 分布
-> 延迟和错误率目标
-> 单副本稳定吞吐压测
-> GPU 和副本数估算
-> 峰值、灰度和故障冗余
-> 成本拆分和预算治理

只看 QPS、只看权重显存、只看峰值 tokens/s,都会低估真实生产成本。真正可用的容量,是在用户体验、稳定性和成本都可接受的条件下,系统能长期维持的吞吐。