容量规划场景
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 成本而非排队等待,只有完整仿真才能看见。
谜题 2 — 为何智能体机队达不到 SLO?
**问题:**24 张 H100、λ=20 req/s,利用率仅约 30%。解析说机队健康,DES 却说不行。
# 同构基线 —— 解析上可行
vllm-sr-sim optimize \
--cdf data/agent_heavy_cdf.json --lam 20 --slo 1000 \
--gpu-short h100 --gpu-long h100 \
--b-short 65536 --long-max-ctx 65536
# 双池 —— 修复
vllm-sr-sim optimize \
--cdf data/agent_heavy_cdf.json --lam 20 --slo 1000 \
--gpu-short h100 --gpu-long h100 \
--b-short 4096 --long-max-ctx 65536 --verify-top 3
| 配置 | GPU | 成本/年 | P99 TTFT | SLO 1000ms |
|---|---|---|---|---|
| 同构 65K ctx | 24 | $845 K | 1 052 ms | ✗ 失败 |
| 双池 4K/65K | 25 | $880 K | 17ms / 147ms | ✓ |
解析为何失效: M/G/c 假设服务时间 i.i.d. 且方差有限。智能体请求服务时间跨度 10–300 秒,变异系数 cv²≫1。单条长请求可占用 KV 槽数分钟,使其他请求排队,即使 GPU 利用率看起来不高。DES 重放真实到达序列并暴露尖峰;Erlang-C 不能。
双池将约 46% 长请求(>4K token)路由到专用池,使其慢服务不会阻塞短请求。成本溢价约 +4% —— 相对 SLO 失败几乎是免费保险。
谜题 3 — 哪种 GPU 实际最便宜?
**问题:**A10G 单卡便宜但慢;H100 贵但快。给定工作负载谁最便宜?
for gpu in a10g a100 h100; do
vllm-sr-sim optimize --cdf data/azure_cdf.json --lam 100 --slo 500 \
--gpu-short $gpu --gpu-long $gpu --b-short 8192 --long-max-ctx 8192
vllm-sr-sim optimize --cdf data/azure_cdf.json --lam 100 --slo 500 \
--gpu-short $gpu --gpu-long $gpu --long-max-ctx 8192 --verify-top 3
done
结果(Azure,λ=100,SLO=500ms):
| GPU | 布局 | GPU 数 | 成本/年 | P99 TTFT |
|---|---|---|---|---|
| A10G | 双池 | 19 | $168 K ← 最低 | 155ms / 335ms |
| H100 | 同构 | 6 | $211 K | 26 ms |
| A100 | 双池 | 12 | $232 K | 52ms / 112ms |
| H100 | 双池 | 7 | $247 K | 13ms / 30ms |
非显然结论: A10G 双池(211K)更便宜 —— 更慢的 GPU 用双池路由补偿。因 Azure ctx 比(8192/4096=2×)使 A10G 每 GPU KV 槽从 64 变 128,足以抵消较低吞吐。
取决于你的约束:
| 优先级 | 选择 |
|---|---|
| 最低成本 | A10G 双池($168K) |
| 最少机架 / 功耗 | H100 同构(6 GPU) |
| 最低延迟 | H100 双池(短请求 P99 13ms) |
| 长上下文 / 智能体 | H100 或 A100 —— A10G 24GB VRAM 限制 KV |
谜题 4 — 何时需要加 GPU?
**问题:**流量增长 —— 在精确哪个 λ 下需要预置下一档 GPU,以避免被动违反 SLO?
vllm-sr-sim whatif \
--cdf data/azure_cdf.json --slo 500 \
--gpu-short h100 --gpu-long h100 --long-max-ctx 8192 \
--lam-range 25 50 100 150 200 300 400
GPU 阶梯阈值(双池,H100):
| λ (req/s) | GPU | 成本/年 | 在达到下列 λ 之前应加 GPU… |
|---|---|---|---|
| 25 | 4 | $141 K | λ = 65 |
| 50 | 5 | $176 K | λ = 90 |
| 100 | 7 | $247 K | λ = 130 |
| 150 | 10 | $352 K | λ = 185 |
| 200 | 12 | $423 K | λ = 270 |
| 300 | 18 | $634 K | λ = 370 |
| 400 | 23 | $810 K | — |
洞见: GPU 扩展次线性 —— 流量增 16×(25→400)而 GPU 仅约 5.75×(4→23)。用此表在阶梯前预置,而非事后。等到 SLO 已违反再扩容,至少会有一个流量档 P99 劣化。
谜题 5 — 哪种路由器会导致 SLO 违反?
**问题:**机队规模已算对。路由器是否重要?
vllm-sr-sim compare-routers \
--cdf data/agent_heavy_cdf.json --lam 20 --slo 1000 \
--gpu-short h100 --gpu-long h100 \
--n-s 2 --n-l 23 --long-max-ctx 65536 --n-req 5000
智能体机队(λ=20,n_s=2,n_l=23):
| Router | P99 TTFT | SLO 1000ms |
|---|---|---|
| LengthRouter | 495 ms | ✓ 99.98% |
| CompressAndRoute | 534 ms | ✗ 99.94% |
| RandomRouter | 292 ms | ✓ 100% |
两点意外:
-
CompressAndRoute 违反 SLO,尽管其设计为缩小机队规模。它将边界长度请求压缩并路由到短池;多请求同时到达时会压垮仅 2 张 GPU 的短池并抬高 P99。它是规划工具 —— 用于规模阶段发现更低 GPU 数,生产应部署 LengthRouter。
-
RandomRouter 通过 SLO,因负载均匀摊到 25 张 GPU,稀释重尾请求。其 P99 最低(292 ms),但脆弱:短请求与长请求共享槽,流量混合变化会导致不可预测的延迟劣化。
对聊天负载(Azure、低利用率)三者均可过 SLO —— 差异仅在智能体或近饱和机队才显著。
谜题 6 — 双池混合 GPU 类型能否省钱?
**问题:**短请求受内存带宽约束、便宜;长请求需要大 KV 与快 prefill。短池放便宜卡、长池只放高端卡能否降本?
vllm-sr-sim optimize \
--cdf data/azure_cdf.json --lam 100 --slo 500 \
--gpu-short a10g --gpu-long h100 --long-max-ctx 8192
vllm-sr-sim optimize \
--cdf data/lmsys_cdf.json --lam 100 --slo 500 \
--gpu-short a10g --gpu-long h100 --long-max-ctx 65536
vllm-sr-sim optimize \
--cdf data/lmsys_cdf.json --lam 100 --slo 500 \
--gpu-short a10g --gpu-long a100 --long-max-ctx 65536
Azure λ=100:
| 配置 | GPU | 成本/年 | P99 短 | P99 长 |
|---|---|---|---|---|
| 全 A100(基线) | 12 | $232 K | 52 ms | 112 ms |
| A10G 短 + H100 长 | 12 | $212 K | 155 ms | 30 ms |
| A10G 短 + A100 长 | 15 | $206 K | 155 ms | 112 ms |
LMSYS λ=100(max_ctx=65536):
| 配置 | GPU | 成本/年 | P99 短 | P99 长 |
|---|---|---|---|---|
| 全 A100(基线) | 8 | $155 K | 43 ms | 2 822 ms ✗ |
| A10G 短 + H100 长 | 7 | $141 K | 129 ms | 181 ms ✓ |
| A10G 短 + A100 长 | 9 | $132 K | 129 ms | 2 822 ms ✗ |
两点洞见:
-
Azure(短上下文): A10G+H100 相对全 A100 同 12 卡省约 9%。贵卡集中在长池,便宜 A10G 承担约 98% 短流量。
-
LMSYS(长上下文): A10G+A100 纸面便宜 11%,但 A100 长池无法满足 500 ms SLO。对高达 65536 token 的请求,A100 prefill 约 700–2800 ms;H100 凭借更大 chunk(1024 vs 512)与更低 W 将其减半。此处 H100 不是「奢侈」而是长池正确性要求。A10G 短 + H100 长相对全 A100 省约 9% 且修复全 A100 无法达到的 SLO。
谜题 7 — 何时应切换到解耦 prefill/decode?
**问题:**prefill 算力受限;decode 内存带宽受限。若独立扩缩两池,哪种配对成本最低?
vllm-sr-sim disagg \
--cdf data/azure_cdf.json --lam 100 \
--slo-ttft 500 --slo-tpot 100 \
--gpu-prefill h100 --gpu-decode a100 --max-ctx 8192
vllm-sr-sim disagg \
--cdf data/azure_cdf.json --lam 100 \
--slo-ttft 500 --slo-tpot 100 \
--gpu-prefill a100 --gpu-decode h100 --max-ctx 8192
Azure λ=100(平均 ISL≈1450 tok,OSL≈483 tok,TTFT 含 1.8× KV 传输开销):
| 配置 | GPU | 成本/年 | TTFT | TPOT |
|---|---|---|---|---|
| 全 A100 聚合 | 12 | $232 K | 26 ms | — |
| 全 H100 聚合 | 6 | $211 K | 8 ms | — |
| H100P + A100D | 7 (1P+6D) | $151 K | 162 ms | 91 ms |
| H100P + H100D | 4 (1P+3D) | $141 K | 162 ms | 45 ms |
| A100P + H100D | 4 (1P+3D) | $125 K ← 最低 | 492 ms | 45 ms |
洞见:
-
解耦相对聚合省 35–46%,代价是更高 TTFT(KV 传输使 raw prefill 约 ×1.8)。
-
A100P + H100D 优于 H100P + A100D,尽管 H100 单价约为 A100 的 1.82×。因 H100 decode 工人每秒处理请求数约为 A100 的 2.5×,所需张数更少(3 vs 6)。一张便宜 A100 在 λ=100 时已能承担全部 prefill。反直觉地,溢价 GPU 在 decode 池摊销成本。
-
解耦何时值得: 高吞吐、成本效率优先于延迟。解耦使每 GPU 成本约降 46%,但 TTFT 升至约 500 ms。若 SLO ≤ 200 ms,用 H100P(TTFT 约 162 ms)约 $141 K —— 仍比全 H100 便宜约 33%。
-
何时保持聚合: 低流量或延迟极关键(< 50 req/s,TTFT SLO ≤ 100 ms)。解耦增加运维复杂度(两套扩缩、KV 网络),在约 100 req/s 以下难以justify。