# Qwen27B tight-SLO 2x2 harness ablation - 2026-06-23 本文整理以下 aggregate report,并解释 harness 为什么能够让 tuning 更快、更有效: ```text .aituner-reports/qwen27b-tight-2x2-aggregate-20260623T005838Z/report.md ``` 这个实验是一个 2x2 ablation:模型强弱和是否启用 `use_harness` 交叉。 核心问题是:harness 是否提供了可复用的搜索结构,而不仅仅是更强 LLM 或者更长 prompt 带来的偶然收益。 ## 实验设计 Case: `qwen27b-tight-slo-2x2-aggregate`。 实验基座: - Served model: `qwen3.5-27b-256k-0223-internal`。 - Hardware: H20,最多 8 GPUs。 - Trace: `chat_w20260311_1000`,输入长度过滤到 0-8192 tokens, `replay_time_scale=1.0`,`max_concurrency=32`。 - SLO: pass rate >= 0.95;TTFT step rule 为 <=4096 input tokens 时 2s, <=32768 input tokens 时 4s,更长输入时 6s;TPOT <= 50 ms。 - Search: 在 `sampling_u in [0, 0.0625]` 上二分探测,tolerance 0.001, max 6 probes。 - Tunable envs: `VLLM_ENABLE_TORCH_COMPILE`。 - Tunable flags: `tensor-parallel-size`, `data-parallel-size`, `expert-parallel-size`, `gpu-memory-utilization`, `block-size`, `max-num-batched-tokens`, `max-num-seqs`, `enable-prefix-caching`, `enable-chunked-prefill`。 - Topology constraints: TP 和 DP 均在 `{1,2,4,8}` 中,允许的 TP*DP product 为 `{1,2,4,8}`,本 case 中 EP 固定为 1。 2x2 arms: | Arm | Tuner model | Harness | Trial budget used | | --- | --- | --- | ---: | | `gpt55_harness` | `gpt-5.5` | on | 2 | | `gpt55_naive` | `gpt-5.5` | off | 10 | | `gpt54mini_harness` | `gpt-5.4-mini` | on | 2 | | `gpt54mini_naive` | `gpt-5.4-mini` | off | 10 | 同一个 tuner model 内,主要差异是 `use_harness`。跨模型比较则用来判断: 更弱模型加 harness 是否能匹配或超过更强模型的 naive tuning。 ## Aggregate result Reference best: `0.4429 req/s/GPU`。 Convergence target: reference 的 95%,即 `0.4208 req/s/GPU`。 | Arm | Kind | Trials | Final req/s/GPU | Final/ref | Trials to target | Normalized AUC | Failed | No feasible | | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | | `gpt55_harness` | harness | 2 | 0.4429 | 1.0000 | 2 | 0.9484 | 0 | 0 | | `gpt55_naive` | naive | 10 | 0.0273 | 0.0616 | - | 0.0588 | 2 | 2 | | `gpt54mini_harness` | harness | 2 | 0.4429 | 1.0000 | 2 | 0.9450 | 0 | 0 | | `gpt54mini_naive` | naive | 10 | 0.0231 | 0.0522 | - | 0.0498 | 1 | 1 | Harness-vs-naive 检查全部通过: | Harness arm | Final vs best naive | AUC vs best naive | Pass | | --- | ---: | ---: | --- | | `gpt55_harness` | 16.2290x | 16.1296x | true | | `gpt54mini_harness` | 16.2290x | 16.0720x | true | 最关键的 ablation 信号是:`gpt-5.4-mini + harness` 和 `gpt-5.5 + harness` 达到同一个 final throughput,也都是 2 trials 达到 target; 而两个 naive arms 用满 10 trials 后仍低于 harness arms 16x 以上。 ## Agent loop 流程图 下面是当前 harness 化 agent loop 的抽象流程。LLM 仍然可以参与 proposal, 但它拿到的不是裸文本历史,而是结构化 observation、bottleneck diagnosis、 candidate actions 和 validator 约束;同时 validator 可以授权 stop,也可以阻止 重复失败或不合法配置。 ```mermaid flowchart TD A[Study spec: trace, SLO, search range, tunable knobs] --> B[Run one engine config] B --> C[Binary-search probes over sampling_u] C --> D[Build observation o_t] D --> E[Bottleneck classifier] E --> F[Candidate family generator] F --> G[Score candidate actions] G --> H[Prompt renderer / planner] H --> I[LLM or deterministic harness proposal] I --> J{Config validator} J -- invalid, repeated, unsafe --> F J -- valid config_patch --> B G --> K{Stop validator} K -- search_high_saturated_by_incumbent --> L[Stop and keep incumbent] K -- useful candidates remain --> H ``` 这个 loop 中,harness 的作用不是把 prompt 写得更漂亮,而是把 tuning 变成 一个受测量约束的决策过程: ```text measurement -> diagnosis -> candidate family -> scored action -> validated proposal/stop ``` ## 形式化设计:observation 每个 trial 结束后,AITuner 不只记录一段自然语言总结,而是形成结构化 observation: ```text o_t = ( config_t, probe_history_t, pass_rate_t, latency/SLO_failure_profile_t, request_rate_t, parallel_size_t, launch_status_t, prior_failures_t, incumbent_t ) ``` 本实验里 observation 中最重要的字段是: - `config_t`: 当前 trial 的 `flag_patch` 和 `env_patch`,例如 `TP=2, DP=1`。 - `probe_history_t`: 在不同 `sampling_u` 下二分探测得到的 feasible/infeasible 结果。 - `pass_rate_t`: 是否满足 target pass rate 0.95。 - `latency/SLO_failure_profile_t`: TTFT 和 TPOT 哪个先触发 SLO pressure。 - `request_rate_t`: 当前配置在 SLO 下能承载的 request rate。 - `parallel_size_t`: 该配置实际使用的并行规模,用于归一化 per-GPU objective。 - `prior_failures_t`: 之前哪些配置 launch failed 或 no feasible,避免重复试错。 - `incumbent_t`: 当前最优配置及其 `request_rate_per_gpu`。 目标函数是: ```text J(config_t) = request_rate_t / parallel_size_t subject to pass_rate_t >= 0.95 ``` 也就是说,harness 优化的是满足 SLO 后的 `req/s/GPU`,不是 raw throughput, 也不是 LLM 主观认为“更强”的配置。 ## 形式化设计:bottleneck classifier `bottleneck classifier` 把 observation 映射成 ranked bottleneck hypotheses: ```text b_t = ranked_bottleneck(o_t) ``` 它判断的不是“哪个 knob 看起来常用”,而是“当前 SLO failure 和 latency profile 说明哪个系统环节在限制 objective”。 常见分类包括: | Bottleneck | 典型证据 | 倾向 knob family | | --- | --- | --- | | `ttft_prefill` | 长 prompt 下 TTFT 接近或超过 SLO,prefill service time 是瓶颈 | 提高 TP,调整 prefill batching | | `decode_tpot` | TPOT p95/p99 超 SLO,decode token latency 是瓶颈 | 调整 `max-num-seqs`,提高 TP,降低 decode contention | | `admission_queueing` | waiting/arrival lag 增长,服务时间未必单独变差 | 提高 DP,调整 admission/concurrency knobs | | `memory_kv` | KV cache pressure、preemption、OOM、launch failure | 调整 `gpu-memory-utilization`、`block-size`、sequence/token caps | | `topology_comm` | TP 增加降低 latency 但 per-GPU efficiency 下降 | 回退 TP,比较 DP/TP tradeoff | 本实验里,两个 harness arms 都把 ranked bottleneck 识别为 `ttft_prefill`。原因是 workload 有 heavy-tailed long prompts,并且 TTFT SLO 很紧; 这意味着单个请求的 prefill service time 是主要限制。DP-only 只能增加 replica, 不能缩短一个长 prompt 的 prefill 路径,因此不是第一优先级。 ## 形式化设计:candidate family `candidate family generator` 根据 bottleneck 和 topology constraints 生成可比较的 action family: ```text A_t = candidate_knob_families( b_t, topology_constraints, prior_failures_t, incumbent_t ) ``` 在这个 case 中: - `b_t = ttft_prefill`。 - 允许的 TP frontier 是 `TP=1 -> TP=2 -> TP=4 -> TP=8`。 - 允许的 DP frontier 是 `DP=1,2,4,8`,但 DP-only 不直接缓解单请求 prefill latency。 - EP 固定为 1,因此不探索 expert parallel。 - 之前没有 failed topology,因此相邻 TP probe launch risk 低。 所以 harness 选择了: ```text trial-0001: TP=2, DP=1 trial-0002: TP=4, DP=1 ``` 这不是写死“Qwen27B 应该 TP4”。如果 classifier 输出的是 `admission_queueing`,candidate family 会更偏向 DP 或 `max-num-seqs`;如果输出是 `memory_kv`,则会更偏向 memory/cache/sequence knobs。 ## 形式化设计:scoring 每个 candidate action 都按同一个抽象打分: ```text score(a) = expected_bottleneck_relief(a) + information_gain(a) + launch_safety(a) - regression_risk(a) - measurement_cost(a) ``` 这些项在本实验里的含义是: - `expected_bottleneck_relief`: TP2/TP4 预计能降低 long-prefill compute latency, 直接作用于 `ttft_prefill`。 - `information_gain`: TP frontier probe 可以区分“需要 compute-latency relief” 还是“只是 admission/replica 不够”。 - `launch_safety`: TP2/TP4 均满足 topology constraints,没有重复 failed signature。 - `regression_risk`: TP 增加会带来通信开销,可能损害 per-GPU efficiency,所以必须用 `request_rate_per_gpu` 验证。 - `measurement_cost`: 每个 GPU trial 成本高;因此高信息量的 topology probe 优先于 多个局部 runtime tweak。 实际结果验证了这个 scoring: | Arm | Trial | Patch | req/s/GPU | Pass rate | 解释 | | --- | ---: | --- | ---: | ---: | --- | | `gpt55_harness` | 1 | `TP=2, DP=1` | 0.2142 | 0.9572 | 相邻 TP probe 已满足 SLO,但仍未饱和 search high。 | | `gpt55_harness` | 2 | `TP=4, DP=1` | 0.4429 | 0.9718 | TP frontier 继续缓解 prefill bottleneck,达到 reference best。 | | `gpt54mini_harness` | 1 | `TP=2, DP=1` | 0.1992 | 0.9707 | 弱模型也选择同一机制路径。 | | `gpt54mini_harness` | 2 | `TP=4, DP=1` | 0.4429 | 0.9727 | 弱模型加 harness 匹配强模型加 harness。 | ## 形式化设计:validator stop Stop 不是 LLM 自己说“我觉得差不多了”。Stop 必须通过 `stop validator`: ```text stop(o_t, incumbent_t, search_state_t, candidate_set_t) -> true/false ``` 本实验里 stop 的记录是: ```text tuning_stop_reason: harness_stop validator_reason: search_high_saturated_by_incumbent diagnosis: The incumbent's highest measured probe is feasible and is within the configured binary-search resolution of search.high. ``` 含义是: 1. 当前 incumbent 的最高测量 probe 已经 feasible。 2. 该 feasible probe 距离 `search.high` 已经在 binary-search tolerance 内。 3. 在当前搜索区间和 SLO 约束下,继续花 GPU trial 很难提高 measured objective。 4. 因此 validator 授权 stop,并保留当前 incumbent。 这给 harness 带来了 stop discipline:它既不会因为 LLM 过早自信而随便停,也不会在 已经 saturate search high 后继续 burn budget。 ## 实际 tune 了哪些 knobs Harness winning path 只改了 topology: ```text base config + tensor-parallel-size=4, data-parallel-size=1 ``` 它没有在 winning path 中调 scheduler/cache/memory knobs,因为 `ttft_prefill` bottleneck 下,首要动作是缩短单请求 prefill service time。 Naive arms 则走了另一个方向: | Arm | 所有 trials 使用的 topology | 变化过的 runtime knobs | Best req/s/GPU | | --- | --- | --- | ---: | | `gpt55_naive` | `TP=1, DP=8` | `max-num-batched-tokens`, `max-num-seqs`, `block-size`, `gpu-memory-utilization`, prefix caching, chunked prefill | 0.0273 | | `gpt54mini_naive` | `TP=1, DP=8` | `max-num-batched-tokens`, `max-num-seqs`, `block-size`, `gpu-memory-utilization` | 0.0231 | `gpt55_naive` 的第一个 proposal 明确选择 `TP=1, DP=8`,理由是模型能单卡放下, 因此 horizontal data parallelism 应该最大化 request rate,而 TP 会带来通信开销。 之后 naive proposals 一直保留 DP-heavy topology,只围绕 runtime knobs 搜索。 两个 naive arms 合计 20 个 trial slots 都没有进入 TP2/TP4 topology frontier。 ## 为什么比 baseline 更好 Baseline 失败的原因是优化了错误的因果路径。 对 `ttft_prefill`-bound workload,关键服务时间是单个请求的 prefill latency。 DP-heavy topology 可以增加 replica 数,但每个 replica 仍用 TP1 处理长 prompt; 它不能显著缩短单请求 prefill path。在 tight TTFT SLO 下,这会导致 feasible `sampling_u` 很低;再除以 GPU 数得到 `req/s/GPU` 后,结果只有 `0.02-0.027 req/s/GPU`。 Harness 的优化路径是: ```text observed SLO pressure -> classify as ttft_prefill -> choose legal TP frontier probe -> measure feasible req/s/GPU under the same SLO -> stop only when search.high is saturated by incumbent ``` 这条路径是可测量、可反驳的。如果 TP4 降低了 latency 但 `request_rate_per_gpu` 明显下降,harness 会 reject 这个 hypothesis。如果 bottleneck 是 admission/queueing 而不是 TTFT/prefill,同一个 knob-effect model 会偏向 DP 或 `max-num-seqs`,而不是 TP frontier。 因此,这个结果不是“Qwen27B case 里我们 prompt 诱导模型说 TP4”。更准确的结论是: harness 用 SLO-derived bottleneck evidence 把搜索导向了正确的 knob family, 再用 per-GPU objective 和 validator stop 验证这个方向。 ## 证据边界 这份报告强支撑 Qwen27B tight-SLO case 上的 harness 机制,但不能单独当作通用性证明。 当前可成立的结论是: - 在这个 case 中,harness 同时提升了 final quality、convergence speed、AUC 和 stop discipline。 - `gpt-5.4-mini + harness` 匹配 `gpt-5.5 + harness`,并显著超过 `gpt-5.5 + naive`,说明收益主要来自 harness 的结构化状态和 validator,而不是 单纯来自更强模型。 - 成功路径用的是通用机制:SLO-derived bottleneck classification、topology constraints、knob-effect scoring、per-GPU objective、validator-authorized stop。 - 还需要在其他 bottleneck/case 上继续验证,例如 prefill scheduler pressure、 decode TPOT pressure、memory/KV pressure、admission/queueing pressure。 ## 原始 aggregate report 摘录 ```text # qwen27b-tight-2x2-aggregate-20260623T005838Z ## Aggregate - Cases: `1` - Harness-vs-naive pass/checks: `2`/`2` - Winner counts: `{"final_best": {"gpt55_harness": 1}, "fastest_to_target": {"gpt55_harness": 1}, "normalized_auc": {"gpt55_harness": 1}}` ## By Kind | Kind | Arms | Mean final/ref | Mean AUC | Target reached | | --- | ---: | ---: | ---: | ---: | | `harness` | 2 | 1.0000 | 0.9467 | 2 | | `naive` | 2 | 0.0569 | 0.0543 | 0 | ## Cases ### qwen27b-tight-slo-2x2-aggregate - Reference best req/s/GPU: `0.4429` - Target fraction: `0.95` - Winners: `{"final_best": "gpt55_harness", "fastest_to_target": "gpt55_harness", "normalized_auc": "gpt55_harness"}` | Arm | Kind | Trials | Final/GPU | Final/ref | TTT | AUC | Failed | No feasible | | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | | `gpt55_harness` | `harness` | 2 | 0.4429 | 1.0000 | 2 | 0.9484 | 0 | 0 | | `gpt55_naive` | `naive` | 10 | 0.0273 | 0.0616 | - | 0.0588 | 2 | 2 | | `gpt54mini_harness` | `harness` | 2 | 0.4429 | 1.0000 | 2 | 0.9450 | 0 | 0 | | `gpt54mini_naive` | `naive` | 10 | 0.0231 | 0.0522 | - | 0.0498 | 1 | 1 | | Harness | Final vs best naive | Target speedup | AUC vs best naive | Pass | | --- | ---: | ---: | ---: | --- | | `gpt55_harness` | 16.2290 | - | 16.1296 | `True` | | `gpt54mini_harness` | 16.2290 | - | 16.0720 | `True` | ```