容量规划场景
vllm-sr-sim 回答仅靠第一性原理无法解决的机队规划问题:拆分阈值设在哪、在真实排队动态下机队是否真能达标、某工作负载下哪种 GPU 最便宜、何时应预置下一档资源。
全文使用的 GPU 单价:
| GPU | $/hr | $/yr |
|---|---|---|
| A10G 24 GB | $1.01 | $8.85 K |
| A100 80 GB | $2.21 | $19.4 K |
| H100 80 GB | $4.02 | $35.2 K |
P99 TTFT = P99(KV 槽排队等待) + 平均 prefill 时间。
每个 KV-cache 槽在模型中相当于 M/G/c 排队的一个服务台。
何时拆分池 — 简短版
在打开模拟器前,先用下列筛选:
重尾服务时间(智能体 / 长上下文)?
→ 必须拆分。同构池无论加多少 GPU 都无法满足 SLO。
ctx 比例 R = long_max_ctx / B_short,长请求比例 f:
R ≤ 2× 或 f > 30% → 同构通常更便宜;拆分为隔离延迟
R ≥ 4× 且 f < 10% → 高流量(λ > ~100 req/s)下拆分更便宜
R ≥ 16× 且 f < 5% → 任意有意义流量下拆分更便宜
以下各「谜题」是单靠经验法则无法解决的。
谜题 1 — 究竟应在何处拆分?
**问题:**规则说「要拆分」——但 token 阈值应设在哪?
最优阈值完全取决于 CDF 形状。太低则长池承担过多流量;太高则短池的槽位优势消失。pareto 命令会扫过 CDF 的每个断点并给出成本–延迟前沿。
vllm-sr-sim pareto \
--cdf data/lmsys_cdf.json --lam 100 --slo 500 --long-max-ctx 65536
LMSYS 结果(λ=100,A100,同构基线 = $271K / 14 GPU):
B_short α-short n_s n_l GPUs $/yr saving P99-s P99-l SLO Pareto
---------------------------------------------------------------------------------------
512 63.8% 2 13 15 $ 290K -7.1% 9ms 25ms ✓ ★
1,024 83.1% 2 10 12 $ 232K +14.3% 10ms 36ms ✓ ★
2,048 94.8% 2 7 9 $ 174K +35.7% 12ms 63ms ✓ ★
4,096 98.4% 3 5 8 $ 155K +42.9% 13ms 108ms ✓ ★ ← 最优
8,192 99.7% 4 4 8 $ 155K +42.9% 14ms 212ms ✓ ★
12,288 99.9% 5 3 8 $ 155K +42.9% 14ms 319ms ✓ ★
**洞见:**B_short=4096 最优 —— 约 98% LMSYS 流量低于该阈值,短池(max_ctx=4096 时 256 个 KV 槽)比同构池(max_ctx=65536 时 16 槽)槽效率高 16×。结果:14 GPU → 8 GPU,成本 −43%。若选 B_short=512,仅约 64% 流量走短池,多数仍进昂贵长池,成本比同构高 7%。
Azure 结果(λ=200,A100,同构基线 = $465K / 24 GPU):
整段 Azure CDF 在 8192 token 内,ctx 比例仅约 2×。最佳 Pareto(B_short=3072)仅省约 4% —— 槽位增益不足以抵消 Erlang 碎片化。价值在于延迟隔离:短池 P99 从同构 26 ms 降至 19 ms,利于分层 SLA。
智能体结果(λ=200,A100,同构基线 = $9293K / 480 GPU):
B_short saving P99-s P99-l SLO
16,384 +13.3% 69ms 339ms ✓ ← 最优
32,768 +12.9% 86ms 593ms ✗ ← SLO 失败:长池 prefill 主导
B_short=16384(相对同构 64 槽 vs 16 槽)节省 64 GPU。超过 32768 后长池请求的 prefill 达 300–600 ms,直接突破 500 ms SLO —— P99 失败来自 prefill 成本而非排队等待,只有完整仿真才能看见。