Files
aituner/docs/harness-ablation/qwen30b-slo-robustness-20260624.md

165 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Qwen30B SLO robustness - 2026-06-24
本文整理 Qwen30B-A3B community vLLM 0.20 case 在三档 SLO 下的 harness/naive
对比,并解释不同 SLO 为什么没有导致完全不同的最终 topology却改变了可承载负载边界
和 bottleneck 判断。
原始报告位于远端共享 checkout
```text
.aituner-reports/qwen30b-slo-robust-gpt55-dash1-20260623T163521Z-strict/report.md
.aituner-reports/qwen30b-slo-robust-gpt55-dash1-20260623T163521Z-medium/report.md
.aituner-reports/qwen30b-slo-robust-gpt55-dash1-20260623T163521Z-loose/report.md
```
## 实验设计
Case: `qwen30b-a3b-slo-{strict,medium,loose}-gpt55`
共同设置:
- Served model: Qwen30B-A3B community vLLM 0.20。
- Hardware: H20允许 1/2/4/8 GPU topology。
- Trace: chat 0-8k输出长度 128。
- Search: `sampling_u in [0, 1.0]`tolerance 0.001max 6 probes。
- Objective: 在 pass rate >= 0.95 下最大化 `request_rate / used_gpu_count`
- Tuner model: `gpt-5.5`
三档 SLO
| SLO | TTFT step rule | TPOT |
| --- | --- | ---: |
| strict | <=4k: 1s, <=32k: 2s, else: 3s | 40 ms |
| medium | <=4k: 2s, <=32k: 4s, else: 6s | 50 ms |
| loose | <=4k: 4s, <=32k: 8s, else: 12s | 70 ms |
## 结果摘要
| SLO | Harness final req/s/GPU | Naive final req/s/GPU | Final speedup | AUC speedup | Harness TTT |
| --- | ---: | ---: | ---: | ---: | ---: |
| strict | 2.2083 | 0.8000 | 2.7604x | 2.7886x | 1 |
| medium | 3.2583 | 0.8000 | 4.0729x | 4.0729x | 1 |
| loose | 3.2583 | 1.0458 | 3.1155x | 4.4622x | 1 |
三个 SLO 下 harness 都在第一个 trial 到达该 SLO 下的 reference best。naive 在 8 个
trials 内没有达到 95% reference target。
## 最终 tune 出来的配置
三档 SLO 的最终 best topology 都是:
```text
tensor-parallel-size = 2
data-parallel-size = 1
enable-expert-parallel = false
```
但这不表示 SLO 没有影响。SLO 改变的是同一个 topology 的可行负载上限:
| SLO | Best config | Best sampling_u | Total req/s | req/s/GPU | Pass rate |
| --- | --- | ---: | ---: | ---: | ---: |
| strict | `TP=2, DP=1` | 0.484375 | 4.4167 | 2.2083 | 1.0000 |
| medium | `TP=2, DP=1` | 0.750000 | 6.5167 | 3.2583 | 1.0000 |
| loose | `TP=2, DP=1` | 0.750000 | 6.5167 | 3.2583 | 1.0000 |
strict 到 medium/loose 的主要变化是 feasible frontier 右移:同一个 `TP=2, DP=1`
配置在 strict 下只能稳定承载 `sampling_u=0.484375`,在 medium/loose 下可以承载
`sampling_u=0.75`
## 为什么 `TP=2, DP=1` 稳定胜出
AITuner 的 scoring 不是 raw throughput而是 SLO-constrained per-GPU throughput
```text
J(c, SLO) = max_u request_rate(c, u) / used_gpu_count(c)
subject to pass_rate(c, u, SLO) >= 0.95
```
这解释了为什么 `TP=4` 没有赢。`TP=4` 的单请求 latency 更低、总吞吐可以更高,
但它使用两倍 GPUper-GPU objective 反而下降:
| SLO | Config | Total req/s | Used GPUs | req/s/GPU | 解释 |
| --- | --- | ---: | ---: | ---: | --- |
| strict | `TP=2, DP=1` | 4.4167 | 2 | 2.2083 | strict best |
| strict | `TP=4, DP=1` | 4.4167 | 4 | 1.1042 | latency 更低,但 GPU efficiency 更差 |
| medium/loose | `TP=2, DP=1` | 6.5167 | 2 | 3.2583 | medium/loose best |
| medium/loose | `TP=4, DP=1` | 8.3667 | 4 | 2.0917 | raw throughput 更高,但 per-GPU 不划算 |
因此 harness 学到的不是“越多 GPU 越好”,而是更具体的机制:
```text
TP=1: 单请求 prefill/decode latency 偏高SLO-constrained load frontier 低。
TP=2: 足够缓解 latency同时 GPU 数量仍低per-GPU objective 最优。
TP=4: 继续降低 latency但通信和 GPU 数量成本超过收益。
```
## SLO 改变 bottleneck 的方式
strict 下,`TP=2, DP=1``sampling_u=0.484375` 可行,但下一档
`sampling_u=0.5` 直接进入 queueing collapse
| Point | Pass rate | 主要失败原因 |
| --- | ---: | --- |
| strict, `u=0.484375` | 1.0000 | 无 |
| strict, `u=0.5` | 0.0290 | `tpot_ms>40`, `ttft_ms>1000/2000`, `slo_pass_rate_unrecoverable` |
medium/loose 下TTFT 阈值放宽后,同一 topology 能承载更高 arrival intensity。
但是在 `u=0.765625` 仍会进入不可恢复的排队区:
| SLO | Feasible point | Next infeasible point | 主要失败原因 |
| --- | --- | --- | --- |
| medium | `u=0.75`, pass 1.0000 | `u=0.765625`, pass 0.6900 | `tpot_ms>50`, `slo_pass_rate_unrecoverable` |
| loose | `u=0.75`, pass 1.0000 | `u=0.765625`, pass 0.2900 | `tpot_ms>70`, `slo_pass_rate_unrecoverable` |
这说明 SLO 放宽不是无限提高吞吐。服务系统还有 queueing stability frontier
超过 frontier 后,即使单个请求的 steady-state latency 看起来可控,排队也会让 pass rate
迅速崩掉。
## 其他候选配置的信号
`TP=1, DP=1` 对 SLO 更敏感:
| SLO | `TP=1, DP=1` req/s/GPU | 解释 |
| --- | ---: | --- |
| strict | 2.2000 | 接近 strict best但略低于 `TP=2` |
| medium | 2.2000 | 仍低于 `TP=2` |
| loose | 2.8500 | 宽松 SLO 下受益明显,但仍低于 `TP=2` |
`gpu-memory-utilization=0.92` 在 medium/loose 中与 `TP=2` 打平:
| SLO | Config | req/s/GPU |
| --- | --- | ---: |
| medium | `TP=2, gpu-memory-utilization=0.92` | 3.2583 |
| loose | `TP=2, gpu-memory-utilization=0.92` | 3.2583 |
这说明该 workload 的主瓶颈不是 KV memory headroom而是 topology 和 queueing
frontier。
EP family 在该环境下不稳定:
```text
TP=4, EP=2/4, enable-expert-parallel=true -> engine_launch exit_code=2
```
这些失败 trial 没有进入 best candidate但它们说明当前 failure memory 还可以继续加强:
同一类 EP launch failure 出现后,后续 proposal 应更积极地屏蔽该 family。
## 对 paper claim 的含义
这组实验支持的 claim 是:
1. Harness 对 SLO 变化有稳定收益strict/medium/loose 三档均显著优于 naive。
2. Harness 不是固定写死某个 knob。它通过 SLO-constrained probing 找到 feasible
frontier在本 case 中最终 topology 相同,但可承载负载边界随 SLO 改变。
3. Harness 的 value 来自 topology-first candidate family、per-GPU scoring 和
validator 对 failed family 的处理,而不是自然语言 prompt 的偶然表达。
这组实验尚不能单独 claim
- 所有模型和 workload 上都 robust。
- `TP=2, DP=1` 是全局最优。
- EP family 已经被最优处理。
对应的后续证据应放在 roadmap 中跟踪:局部 grid/near-optimum、跨模型 2x2、跨 workload
SLO robustness以及 failure-memory ablation。