Files
replaysim/docs/rs4_frontier_h20_tp1_alignment.md

33 KiB

RS4 Frontier H20 TP1 Alignment

This note compares Frontier H20 TP1 against the real vLLM TP1 run on dash2 for coder_100.

Setup

Real vLLM:

  • Runtime: vLLM 0.11.1
  • Host/GPU: dash2, NVIDIA H20
  • Model: /home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B
  • TP: 1
  • KV capacity: 244,496 tokens = 15,281 blocks at block size 16
  • Run: runs/vllm_gpu_smoke_20260624/tp1_coder100_uncapped

Frontier:

  • Frontier root: /tmp/replayserve-frontier-rs1b
  • Frontier commit: d9cfeb6d8791fbf2f295dd9744c56a666171776e
  • Model config name: qwen3-a3b-30b-moe
  • Device: h20
  • Network node SKU: h20_dgx
  • TP: attn_tensor_parallel_size=1, moe_tensor_parallel_size=1, moe_expert_parallel_size=1
  • max_tokens_in_batch=32768, batch_size_cap=64, block size 16
  • Prefix cache on, chunked prefill on
  • long_prefill_token_threshold=32768
  • Config: configs/rs4_frontier_h20_tp1.json
  • Run: runs/rs4_frontier_h20_tp1_20260624

The high long-prefill threshold is deliberate. Frontier's earlier threshold 64 run under-counted prefix hits because long prompts were admitted in 64-token chunks, unlike the current real vLLM run.

KV Capacity

run KV blocks KV tokens note
Frontier planner_kv 17,385 278,160 Frontier H20 memory planner, no non-KV overhead
Frontier vllm_kv_15281 15,281 244,496 Explicitly matched to real vLLM TP1
vLLM TP1 15,281 244,496 From vLLM memory profiling

So only vllm_kv_15281 has the same KV block count as real vLLM TP1.

Results

run completed prefix hit tokens / ratio preemptions TTFT p50/p95 TPOT p50/p95 E2E p50/p95 decode tok/s
Frontier planner_kv 96/100 110,608 / 0.240691 0 0.986/128.991s 0.582/0.582s 279.092/1706.675s 19.4
Frontier vllm_kv_15281 92/100 103,168 / 0.242542 0 0.964/182.639s 0.582/0.582s 305.290/1765.347s 19.4
vLLM TP1 real 100/100 119,152 / 0.251082 sidecar estimate 8 4.503/29.060s 0.066/0.621s 41.841/97.366s 567.4

The latency/throughput rows are not calibrated. Frontier still uses dummy execution timing, so TPOT is a constant simulator artifact.

Prefix Admission Check

For TP1, real vLLM has preemption. Therefore the sidecar theoretical prefix-hit estimate is not the right observed comparator for every request. The observed vLLM scheduler signal is the first computed: value in stdout.log for each request start.

Using first-start computed: tokens:

Frontier run compared rows Frontier computed sum vLLM first-start computed sum mismatch
planner_kv 96 110,608 108,208 one request differs
vllm_kv_15281 92 103,168 103,168 exact match

So with the KV block count explicitly matched, Frontier's prefix-cache admission matches real vLLM TP1 for every row where Frontier emits complete cache metrics.

Current Alignment Judgment

Aligned:

  • H20 device and Qwen3-30B-A3B structural model config can run in Frontier.
  • TP1 scheduler knobs can be matched.
  • KV block count can be matched explicitly at 15,281 blocks.
  • First-admission prefix-cache hit tokens match real vLLM TP1 on completed rows when KV blocks are explicit.

Not aligned:

  • Frontier emits complete request/cache metrics for only 92/100 requests in the explicit-KV run, while vLLM completes 100/100.
  • Frontier reports 0 preemptions; real vLLM TP1 reports 8 preemptions across 5 repeated-start requests.
  • Frontier timing is not comparable because it still uses dummy execution prediction. The current latency/throughput gap is expected and not a calibrated simulator error.

Next work:

  • Treat RS6 as the current profiled baseline and investigate why it omits complete latency/cache metrics for requests 70, 77, 88, and 90.
  • Instrument Frontier's vLLM V1 scheduler around KV block allocation, free-block count, and preemption victim selection. Real vLLM TP1 has 8 preemptions, while Frontier still reports 0 with the same explicit 15,281-block capacity.
  • Add a per-request Frontier/vLLM comparator that reports TTFT/TPOT/E2E ratios, prefix hits, and completion/preemption status on the same request ids.
  • Calibrate CPU/scheduler/CUDA-graph effects separately from op profile timing; RS6 removed the 4096-token linear/MoE extrapolation as the primary explanation for the remaining gap.

Performance Gap

Use Frontier vllm_kv_15281 as the current aligned-KV simulator point. This matches the real vLLM TP1 KV block count, but it still uses Frontier dummy execution timing.

metric Frontier H20 TP1 explicit KV real vLLM H20 TP1 gap
completed requests 92/100 100/100 not aligned
TTFT p50 0.964s 4.503s Frontier 0.21x real
TTFT p95 182.639s 29.060s Frontier 6.28x real
TPOT p50 0.582s 0.066s Frontier 8.81x real
TPOT p95 0.582s 0.621s Frontier 0.94x real
E2E p50 305.290s 41.841s Frontier 7.30x real
E2E p95 1765.347s 97.366s Frontier 18.13x real
RPS 0.0217 0.6880 vLLM 31.74x Frontier
decode tok/s 19.4 567.4 vLLM 29.20x Frontier

Interpretation:

  • The prefix admission path is close after explicit KV matching, but performance is not calibrated.
  • Frontier uses dummy execution timing; its TPOT is nearly constant at 582 ms, while real vLLM TP1 has p50 TPOT 66 ms and p95 TPOT 621 ms.
  • Frontier does not reproduce real vLLM's TP1 preemption behavior: real vLLM had 8 preemptions, while Frontier reported 0.
  • Frontier emits complete request/cache metrics for only 92 rows in this run, so p95 and throughput are not yet on the same request set.
  • The TTFT sign is mixed: Frontier p50 TTFT is too optimistic, but p95 TTFT is far too pessimistic. This is consistent with uncalibrated execution timing plus different queue/preemption dynamics.

RS5 Profiled Frontier Timing

Frontier does support replacing dummy timing with real CSV profiles through the random-forest execution-time predictor. The required non-dummy flags are wired in tools/run_frontier_sweep.py, and the active profiled config is configs/rs5_frontier_h20_tp1_profile.json.

Profile data collected on dash2 H20 TP1:

  • Linear ops: linear_op.csv, CUDA event, max tokens 4096.
  • Attention: attention_combined.csv, CUDA event, max sequence/chunk 18000, with 15417 standard rows plus 612 true-mixed rows. Online replay needs the true-mixed rows to train attn_prefill_mixed and attn_decode_in_mixed.
  • MoE: moe_vllm_fused.csv, CUDA event, max tokens 4096, vLLM fused MoE backend.

Frontier vLLM 0.11.1 profiling needed local compatibility patches in patches/frontier-vllm-0.11.1-profiling-compat.patch:

  • RoPE helper fallback when vLLM 0.11.1 get_rope() no longer accepts the legacy rotary_dim keyword.
  • _get_config_dtype_str fallback for vLLM fused MoE config dtype.
  • ReplicatedLinear(disable_tp=True) fallback to torch Linear when vLLM TP group is not initialized in standalone profiling.
  • fused_topk() variable-return handling.
  • invoke_fused_moe_kernel() 0.11.1 signature compatibility.

The first profiled MoE attempt used Frontier's frontier_loop backend and was not faithful to vLLM serving. It predicted moe_grouped_gemm at about 16 ms for 24 tokens and 19 ms for 1024 tokens, causing TPOT around 0.93 s. The vLLM fused MoE profile predicts about 0.32 ms for 24 tokens and 0.87 ms for 1024 tokens.

run completed prefix hit ratio TTFT p50/p95 TPOT p50/p95 E2E p50/p95 total tok/s decode tok/s
Frontier dummy vllm_kv_15281 92/100 0.2422 0.964/182.639s 0.582/0.582s 305.290/1765.347s 131.3 19.4
Frontier profiled frontier_loop MoE 93/100 0.2492 3.320/310.235s 0.930/1.767s 492.097/2038.538s 165.9 24.6
Frontier profiled vLLM fused MoE 97/100 0.2376 0.355/13.695s 0.056/0.098s 27.032/119.019s 2056.7 304.5
Frontier profiled vLLM fused MoE, linear/MoE 32K 96/100 0.2484 0.909/12.763s 0.057/0.146s 30.939/119.636s 2348.9 347.8
vLLM TP1 real 100/100 0.2511 4.503/29.060s 0.066/0.621s 41.841/97.366s 3832.3 567.4

Current judgment:

  • The profiled vLLM fused MoE run is the first useful timing baseline. TPOT p50 is close to real vLLM, but throughput is still about 54% of real vLLM and TTFT/E2E tails do not align.
  • After extending linear and MoE profiles to 32768 tokens and adding prefill_hot MoE rows, the cache hit ratio is nearly aligned (0.2484 vs vLLM 0.2511), throughput improves to about 61% of real vLLM, and TTFT p50 moves from 0.08x to 0.20x of real vLLM. This confirms that the 4096 profile ceiling was a real source of error.
  • Prefix/cache accounting remains close but not exact: the profiled run emits complete cache metrics for 96/100 requests in the 32K run, with token hit ratio 0.2488 vs vLLM's sidecar estimate 0.2511.
  • Frontier still reports zero preemptions, while real vLLM TP1 had 8 preemption events. This affects completion set, TTFT tail, and E2E tail.
  • The remaining gaps are no longer explained by the linear/MoE 4096-token extrapolation alone. The 32K run still has TTFT p50 at 0.20x, TTFT p95 at 0.44x, TPOT p95 at 0.23x, and throughput at 0.61x of real vLLM. This points to missing CPU/scheduler/CUDA-graph modeling plus Frontier's scheduler and completion/preemption fidelity.
  • The 32K run still completes only 96/100 requests in latency/cache metrics (70, 77, 88, 90 missing), while real vLLM completes 100/100. This is a Frontier lifecycle/metrics or scheduler-fidelity issue to debug separately.

2026-06-24 Follow-Up

Handled in the ReplayServe harness:

  • tools/run_frontier_sweep.py now passes an absolute metrics output path into Frontier. Frontier runs with cwd=/tmp/replayserve-frontier-rs1b; relative metrics paths can otherwise be written under the Frontier scratch instead of ReplayServe's run directory.
  • tools/postprocess_frontier_smoke.py now emits a completion block with completed_requests, total_requests, and missing_latency_request_ids.
  • tools/aggregate_runs.py now marks a run as incomplete when postprocess reports missing latency rows. The latest RS6 summary is therefore incomplete, not a clean pass.

Latest RS6 vs real vLLM TP1 after the 32K profile and harness fixes:

metric Frontier RS6 32K profile real vLLM TP1 Frontier / vLLM
completed requests 96/100 100/100 0.96
prefix token hit ratio 0.2488 0.2511 0.99
preemption events 0 8 0.00
TTFT p50 0.909s 4.503s 0.20
TTFT p95 12.763s 29.060s 0.44
TPOT p50 0.0569s 0.0661s 0.86
TPOT p95 0.146s 0.621s 0.23
E2E p50 30.939s 41.841s 0.74
E2E p95 119.636s 97.366s 1.23
total tok/s 2348.9 3832.3 0.61
decode tok/s 347.8 567.4 0.61

Preemption experiment:

  • A local trial enabled waiting-admission preemption in Frontier Phase 2. It did produce preemption events, but it was not a valid alignment improvement: Frontier completed only 79/100 requests and amplified the early-decode disappearance pattern. That config was removed from configs/.
  • This means the remaining preemption gap is not just "turn on preemption in Phase 2". Frontier's batch/runtime-epoch lifecycle needs a deeper fix before its preemption behavior can be considered faithful to vLLM TP1.

Current interpretation:

  • Prefix/cache replay is close: token-weighted prefix hit ratio is within about 1% relative of the vLLM synthetic replay estimate.
  • Completion/preemption is not aligned. Requests 70, 77, 88, and 90 begin decode in RS6 but never reach completion metrics; vLLM completes all 100 requests and logs 8 preemption events.
  • Timing is partially useful but not fully calibrated. Linear and MoE profiles now cover the trace's long-prefill range up to 32768 tokens, so the old 4096 extrapolation is no longer the main explanation. The remaining TTFT/TPOT/E2E gap likely comes from missing CPU/scheduler overhead, decode CUDA graph modeling, and Frontier scheduler lifecycle differences.

2026-06-25 500-Request Stress

Generated traces/fixtures/coder_500 from the first 500 rows of qwen_coder_blksz_16.jsonl:

  • row_count=500
  • max_total_tokens=21318
  • overflow_count=0
  • partial_final_block_rows=466

Frontier RS8 used the same H20 TP1 Qwen3-30B-A3B full32K profile and explicit KV block count as RS6:

  • Config: configs/rs8_frontier_h20_tp1_profile_full32k_coder500.json
  • Run: runs/rs8_frontier_h20_tp1_profile_full32k_coder500_20260625
  • Runtime: 492 seconds
  • Status: incomplete
metric Frontier RS6 100 reqs Frontier RS8 500 reqs
completed requests 96/100 439/500
missing latency/cache rows 4 61
prefix token hit ratio 0.2488 0.1192
preemption events 0 0
TTFT p50/p95 0.909/12.763s 136.776/340.237s
TPOT p50/p95 0.0569/0.146s 0.0564/0.0894s
E2E p50/p95 30.939/119.636s 177.800/397.291s
total tok/s 2348.9 4733.7
decode tok/s 347.8 656.2

Missing request ids in RS8:

70,77,88,90,103,106,134,135,142,143,153,154,176,178,183,184,186,188,210,211,216,222,245,246,263,272,274,278,291,298,299,300,320,325,334,335,347,348,363,367,373,374,393,399,403,409,412,413,414,433,434,437,439,450,453,460,469,475,476,479,497

The incomplete-row issue clearly scales: 4/100 missing in RS6 becomes 61/500 missing in RS8. This makes RS8 invalid for final performance claims, but useful as a stress signal for Frontier lifecycle/metrics fidelity.

The lower prefix hit ratio is not by itself proof of adapter failure. The unbounded trace-side trie estimate for coder_500 is 0.3868 token hit ratio, but the H20 TP1 configuration has finite KV capacity (num_blocks=15281, about 244K tokens). The 500-request window has 2.7M prompt tokens, so KV eviction can substantially reduce real prefix hits. The dash1 vLLM run below is the current finite-cache comparator for whether Frontier's behavior is faithful.

Real vLLM TP1 500 was first attempted on dash2 with the same settings as tp1_coder100_uncapped (max_num_seqs=64, max_num_batched_tokens=32768, gpu_memory_utilization=0.85, CUDA_VISIBLE_DEVICES=0), but did not start because dash2 was already occupied by eight existing agentic-kvc vLLM serve processes on ports 8000-8007. Each H20 had about 89GB allocated, and vLLM failed with free memory below the required 0.85 utilization target. Those processes were not killed; the temporary ReplayServe GPU lock was released.

A replacement vLLM TP1 500 run completed on dash1:

  • Run: runs/vllm_gpu_smoke_20260625_dash1/tp1_coder500_uncapped
  • Runtime: vLLM 0.11.1
  • Host/GPU: dash1, one NVIDIA H20 via CUDA_VISIBLE_DEVICES=0
  • Model: /home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B
  • Command knobs: TP=1, max_model_len=32768, max_num_seqs=64, max_num_batched_tokens=32768, gpu_memory_utilization=0.85, prefix caching on, chunked prefill on
  • vLLM profiled KV capacity: 244,496 tokens = 15,281 blocks at block size 16
  • Replay wall time after engine startup: 595.116 seconds
  • Process elapsed including model load/startup: 2026-06-25T03:08:18Z to 2026-06-25T03:19:41Z
metric Frontier RS8 500 reqs vLLM TP1 500 reqs vLLM / Frontier
completed requests 439/500 500/500 not aligned
preemption events 0 63 not aligned
repeated/preempted request ids 0 57 not aligned
TTFT p50 136.776s 185.658s 1.36
TTFT p95 340.237s 375.895s 1.10
TPOT p50 0.0564s 0.0498s 0.88
TPOT p95 0.0894s 0.0919s 1.03
E2E p50 177.800s 224.270s 1.26
E2E p95 397.291s 417.356s 1.05
requests/s 0.661 0.840 1.27
total tok/s 4733.7 5282.9 1.12
decode tok/s 656.2 732.3 1.12

Because Frontier emits latency/cache rows for only 439 requests, the latency comparison above mixes Frontier's completed subset with vLLM's complete 500-row run. Restricting vLLM to the same 439 request ids gives:

metric Frontier RS8 439 rows vLLM same 439 ids vLLM / Frontier
TTFT p50 136.776s 169.968s 1.24
TTFT p95 340.237s 375.760s 1.10
TPOT p50 0.0564s 0.0498s 0.88
TPOT p95 0.0894s 0.1071s 1.20
E2E p50 177.800s 218.606s 1.23
E2E p95 397.291s 416.110s 1.05

Prefix/cache comparison needs careful metric naming:

  • The unbounded ReplayServe trie estimate for all 500 rows is 1,047,632 hit tokens / 2,708,110 prompt tokens = 0.3868 token hit ratio.
  • vLLM's finite-cache scheduler log is much lower under this pressure: first-start computed: ratio is 0.0979, last-start ratio is 0.1643, and max-per-request ratio is 0.1655.
  • On the same 439 request ids where Frontier emits complete metrics, vLLM's first-start computed: ratio is 0.1050, last-start ratio is 0.1665, and max-per-request ratio is 0.1679.
  • Frontier RS8 reports replayserve_token_hit_ratio=0.1192 and frontier_block_hit_ratio=0.1191, which is in the same order as vLLM's finite-cache scheduler signal but far below the unbounded trace-side estimate.

Current 500-request judgment:

  • Frontier's timing profile is now in the right broad range for this stressed H20 TP1 run: TPOT p50/p95 and E2E p95 are close to vLLM, and aggregate token throughput is within about 12%.
  • The run is still not a faithful simulator result because completion and preemption diverge: Frontier drops 61 latency/cache rows and reports zero preemptions, while real vLLM completes all 500 requests and logs 63 preemption events across 57 request ids.
  • The 500-request trace invalidates the earlier use of the unbounded sidecar prefix estimate as the primary comparator. Finite KV capacity, eviction, and preemption must be part of the prefix-cache replay metric.

ReplayServe TODO:

  • Treat incomplete Frontier runs as invalid for final performance claims unless the comparison explicitly reports the missing request set.
  • Keep the focused Frontier debug guard in the local patch: sequential mode now fails if completed_requests < total_requests at drain time and reports the missing request state.
  • Add a comparator that reports both unbounded trace-side prefix reuse and finite-cache observed reuse from vLLM scheduler logs; do not compare Frontier's finite-cache hit ratio directly to the unbounded trie estimate.
  • Profile or import vLLM CPU overhead records for H20 TP1 before enabling skip_cpu_overhead_modeling=false; without those records Frontier falls back to zero CPU overhead.
  • Collect kernel-only/decode-CUDA-graph timing profiles before using decode_cuda_graph_mode=full_decode_only; the current RS6 profile is CUDA event/eager timing.

2026-06-25 200-Request Timestamp Scale 2/3

Generated traces/fixtures/coder_200_ts0667 from the first 200 rows of qwen_coder_blksz_16.jsonl, with each timestamp multiplied by 2/3 in the fixture files:

  • row_count=200
  • timestamp_scale=0.6666666666666666
  • last_timestamp=30.711333333333332
  • max_total_tokens=18985
  • partial_final_block_rows=182

Important: in the current replay semantics, smaller timestamp scale makes arrivals denser. It reduces the arrival window from about 46.1s to 30.7s for the first 200 requests. This does not reduce queue pressure relative to the same 200 requests at scale 1.0; it only reduces the request count relative to the 500-request stress.

Frontier RS9:

  • Config: configs/rs9_frontier_h20_tp1_profile_full32k_coder200_ts0667.json
  • Run: runs/rs9_frontier_h20_tp1_profile_full32k_coder200_ts0667
  • Runtime: 460 seconds
  • Status: incomplete

vLLM dash1 TP1:

  • Run: runs/vllm_gpu_smoke_20260625_dash1/tp1_coder200_ts0667_uncapped
  • Runtime: vLLM 0.11.1
  • Host/GPU: dash1, one NVIDIA H20 via CUDA_VISIBLE_DEVICES=0
  • vLLM profiled KV capacity: 244,496 tokens = 15,281 blocks at block size 16
  • Replay wall time after engine startup: 242.813 seconds
metric Frontier RS9 200 ts=2/3 vLLM TP1 200 ts=2/3 vLLM / Frontier
completed requests 176/200 200/200 not aligned
preemption events 0 26 not aligned
TTFT p50 20.580s 34.563s 1.68
TTFT p95 96.718s 120.804s 1.25
TPOT p50 0.0584s 0.0515s 0.88
TPOT p95 0.2359s 0.2535s 1.07
E2E p50 73.207s 83.622s 1.14
E2E p95 189.240s 183.727s 0.97
requests/s 0.583 0.824 1.41
total tok/s 3913.4 4864.8 1.24
decode tok/s 593.3 737.5 1.24

Restricting vLLM to the same 176 request ids where Frontier emits complete metrics gives:

metric Frontier RS9 176 rows vLLM same 176 ids vLLM / Frontier
TTFT p50 20.580s 27.896s 1.36
TTFT p95 96.718s 120.804s 1.25
TPOT p50 0.0584s 0.0520s 0.89
TPOT p95 0.2359s 0.2539s 1.08
E2E p50 73.207s 82.645s 1.13
E2E p95 189.240s 183.727s 0.97

Prefix/cache comparison:

  • The unbounded ReplayServe trie estimate for all 200 rows is 270,336 hit tokens / 1,002,154 prompt tokens = 0.2698 token hit ratio.
  • vLLM finite-cache scheduler signal for all 200 rows: first-start computed: ratio 0.1392, last-start ratio 0.2126, max-per-request ratio 0.2129.
  • On the same 176 request ids where Frontier emits complete metrics, vLLM first-start ratio is 0.1487, last-start ratio is 0.1926, and max-per-request ratio is 0.1927.
  • Frontier RS9 reports replayserve_token_hit_ratio=0.1703 and frontier_block_hit_ratio=0.1700, again between vLLM first-start and last/max finite-cache scheduler signals.

Missing request ids in RS9:

70,78,80,86,87,89,96,101,102,105,125,126,131,132,135,144,145,146,147,148,149,150,151,198

Current 200-request judgment:

  • Reducing the request count from 500 to 200 substantially reduces TTFT and E2E tails, but scale=2/3 is still a dense-arrival stress test. vLLM TTFT p95 is still 120.8s.
  • Frontier timing is closer than the old 100-request dummy/profile baselines: TPOT p50/p95 and E2E p50/p95 are broadly aligned.
  • Completion/preemption remains the blocking fidelity issue: Frontier drops 24 rows and reports zero preemptions; vLLM completes all 200 and logs 26 preemptions across 22 repeated-start request ids.
  • To actually reduce queue pressure for the same first 200 requests, use a timestamp scale greater than 1. The follow-up scale 2 and 3 runs below do this.

2026-06-25 200-Request Timestamp Scale 2 and 3

Generated two more first-200 fixtures from qwen_coder_blksz_16.jsonl:

fixture timestamp scale last timestamp max total tokens
coder_200_ts2 2.0 92.134s 18,985
coder_200_ts3 3.0 138.201s 18,985

These are the intended lower-arrival-pressure runs. The request payloads are the same first 200 rows as coder_200_ts0667; only timestamps differ.

Frontier RS10:

  • Config: configs/rs10_frontier_h20_tp1_profile_full32k_coder200_ts2_ts3.json
  • Run: runs/rs10_frontier_h20_tp1_profile_full32k_coder200_ts2_ts3
  • Status: incomplete for both fixtures

vLLM dash1 TP1:

  • Runs: runs/vllm_gpu_smoke_20260625_dash1/tp1_coder_200_ts2_uncapped and runs/vllm_gpu_smoke_20260625_dash1/tp1_coder_200_ts3_uncapped
  • Runtime: vLLM 0.11.1
  • Host/GPU: dash1, one NVIDIA H20 via CUDA_VISIBLE_DEVICES=0
  • vLLM profiled KV capacity: 244,496 tokens = 15,281 blocks at block size 16

Run-level comparison:

metric Frontier scale 2 vLLM scale 2 Frontier scale 3 vLLM scale 3
completed requests 182/200 200/200 184/200 200/200
preemption events 0 43 0 16
TTFT p50 8.118s 9.217s 0.779s 1.166s
TTFT p95 67.850s 69.211s 35.918s 32.258s
TPOT p50 0.0544s 0.0497s 0.0544s 0.0462s
TPOT p95 0.0747s 0.0686s 0.0773s 0.0714s
E2E p50 51.118s 55.002s 40.641s 33.213s
E2E p95 162.607s 142.338s 158.434s 122.789s
requests/s 0.593 0.803 0.544 0.780
total tok/s 3846.1 4742.5 3490.6 4608.1
decode tok/s 583.1 719.0 529.2 698.6

Restricting vLLM to the same request ids where Frontier emits complete metrics:

metric Frontier scale 2 182 rows vLLM same 182 ids Frontier scale 3 184 rows vLLM same 184 ids
TTFT p50 8.118s 8.574s 0.779s 0.945s
TTFT p95 67.850s 68.934s 35.918s 32.258s
TPOT p50 0.0544s 0.0501s 0.0544s 0.0461s
TPOT p95 0.0747s 0.0686s 0.0773s 0.0679s
E2E p50 51.118s 53.263s 40.641s 33.213s
E2E p95 162.607s 141.264s 158.434s 122.789s

Prefix/cache comparison:

metric scale 2 scale 3
unbounded trace-side token hit ratio 0.2698 0.2698
vLLM first-start computed: ratio 0.1433 0.1471
vLLM last-start computed: ratio 0.2382 0.1968
vLLM max-per-request computed: ratio 0.2383 0.1998
Frontier replayserve_token_hit_ratio 0.1448 0.1523
Frontier frontier_block_hit_ratio 0.1446 0.1521

Current scale 2 and 3 judgment:

  • The user's intended scale=2 and scale=3 runs do reduce queueing. vLLM TTFT p95 drops from 120.8s at scale=2/3 to 69.2s at scale=2 and 32.3s at scale=3.
  • scale=3 is the first run where vLLM p50 TTFT is near 1s. The p95 is still high because long prompts and KV pressure remain, but the severe all-request queueing seen in the 500-request run is much reduced.
  • Frontier timing is now close on TTFT and TPOT for the completed-row subset, especially at scale=2. However, Frontier still misses completion/cache rows and still reports zero preemptions.
  • Completion/preemption is therefore still the main Frontier fidelity blocker: scale=2 misses 18 rows and vLLM logs 43 preemptions; scale=3 misses 16 rows and vLLM logs 16 preemptions.

2026-06-25 Frontier Lifecycle Fix For RS10

The missing-row root cause was Frontier lifecycle handling after decode-phase preemption. Missing requests were preempted after prefill/decode had started, then left in this inconsistent state:

preempted=True
is_prefill_complete=True
num_processed_tokens=0
scheduled=False
completed=False

The next waiting admission computed num_new_tokens=0 and removed the request from the queue, so sequential simulation drained with fewer completed requests but no remaining scheduler work.

The updated ReplayServe Frontier patch now:

  • replays decode-phase preemption by treating already-produced tokens as the next prefill segment and the remaining tokens as decode work;
  • preserves unfinished zero-token waiting requests instead of silently dropping them;
  • reports metrics against user-facing trace prompt/output lengths after runtime token splitting;
  • fails fast if sequential mode drains before all generated requests complete.

Verification runs:

run old completion fixed completion Frontier preemptions prefix token hit ratio status
coder_200_ts2 182/200 200/200 33 0.2313 pass
coder_200_ts3 184/200 200/200 20 0.2177 pass

Fixed-run paths:

  • runs/rs10_preemption_replay_fix_ts2/frontier_h20_tp1_profile_full32k/coder_200_ts2/vllm_kv_15281_profile_full32k
  • runs/rs10_preemption_replay_fix_ts3/frontier_h20_tp1_profile_full32k/coder_200_ts3/vllm_kv_15281_profile_full32k

Updated run-level comparison:

metric Frontier scale 2 fixed vLLM scale 2 Frontier scale 3 fixed vLLM scale 3
completed requests 200/200 200/200 200/200 200/200
preemption events 33 43 20 16
TTFT p50 9.595s 9.217s 1.001s 1.166s
TTFT p95 77.503s 69.211s 45.947s 32.258s
TPOT p50 0.0542s 0.0497s 0.0534s 0.0462s
TPOT p95 0.0665s 0.0686s 0.0686s 0.0714s
E2E p50 61.458s 55.002s 44.761s 33.213s
E2E p95 174.484s 142.338s 154.548s 122.789s
requests/s 0.594 0.803 0.574 0.780
total tok/s 3506.3 4742.5 3390.0 4608.1
decode tok/s 531.6 719.0 513.9 698.6

Current judgment after the fix:

  • The completion/preemption lifecycle blocker for RS10 is fixed: both scale 2 and scale 3 now emit 200 request rows and complete postprocess.
  • Frontier preemption is now in the same order as vLLM, but not exact: scale 2 is 33 vs 43 events, scale 3 is 20 vs 16 events.
  • Prefix hit ratio changed materially because preempted requests now replay and re-enter prefix-cache admission instead of disappearing. It is no longer valid to compare the old incomplete RS10 prefix ratios against vLLM.
  • Timing remains close in TPOT but Frontier is still slower in aggregate throughput, about 0.74x of vLLM total/decode token throughput for both scale 2 and scale 3. TTFT/E2E tails are still worse after the completion set becomes complete.
  • Remaining gap is no longer "missing metrics rows"; it is scheduler/preemption fidelity plus CPU/scheduler/CUDA-graph timing calibration.

2026-06-25 H20 TP2/TP4 Comparison

The TP2/TP4 comparison uses the same first-200 coder_200_ts2 and coder_200_ts3 fixtures. The vLLM runs are on dash1 with /home/admin/cpfs/wjh/models/Qwen/Qwen3-30B-A3B, vLLM 0.11.1, max_model_len=32768, max_num_seqs=64, max_num_batched_tokens=32768, gpu_memory_utilization=0.85, prefix caching on, and chunked prefill on.

vLLM measured KV capacity:

TP KV tokens KV blocks
2 1,104,880 69,055
4 2,833,232 177,077

Frontier RS12 uses explicit matching KV blocks and fresh H20 TP2/TP4 profiles:

  • Config: configs/rs12_frontier_h20_tp2_tp4_profile_full32k_coder200_ts2_ts3.json
  • Run: runs/rs12_frontier_h20_tp2_tp4_profile_full32k_coder200_ts2_ts3
  • Profile source: dash1:/home/admin/cpfs/wjh/replayserve_frontier_profiles/h20_tp2_tp4_qwen3_30ba3b_full32k_20260625_true_mixed
  • Linear/MoE profiles cover TP2/TP4 up to 32768 tokens.
  • Attention profile covers TP2/TP4 standard attention plus 1260 true-mixed prefill+decode rows. The true-mixed rows are required; standard attention alone fails with missing attn_decode_in_mixed predictions.

All four Frontier runs completed 200/200 request rows. Neither Frontier nor the vLLM TP2/TP4 logs reported preemption events. Prefix token hit ratio is exactly the same in Frontier postprocess and vLLM's trace-side synthetic estimate: 0.2697549478.

Run-level comparison:

TP fixture metric Frontier vLLM Frontier / vLLM
2 coder_200_ts2 requests/s 0.776 1.278 0.61
2 coder_200_ts2 total tok/s 4581 7547 0.61
2 coder_200_ts2 decode tok/s 695 1144 0.61
2 coder_200_ts2 TTFT p50/p95 0.269/6.745s 0.225/0.715s 1.20/9.43
2 coder_200_ts2 TPOT p50/p95 0.0430/0.0529s 0.0300/0.0434s 1.43/1.22
2 coder_200_ts2 E2E p50/p95 26.05/106.76s 16.45/72.53s 1.58/1.47
4 coder_200_ts2 requests/s 0.853 1.536 0.55
4 coder_200_ts2 total tok/s 5035 9073 0.55
4 coder_200_ts2 decode tok/s 763 1376 0.55
4 coder_200_ts2 TTFT p50/p95 0.098/0.386s 0.170/1.420s 0.57/0.27
4 coder_200_ts2 TPOT p50/p95 0.0337/0.0384s 0.0163/0.0283s 2.06/1.36
4 coder_200_ts2 E2E p50/p95 18.65/84.94s 9.26/43.62s 2.01/1.95
2 coder_200_ts3 requests/s 0.688 1.088 0.63
2 coder_200_ts3 total tok/s 4062 6426 0.63
2 coder_200_ts3 decode tok/s 616 974 0.63
2 coder_200_ts3 TTFT p50/p95 0.134/0.574s 0.154/0.627s 0.87/0.92
2 coder_200_ts3 TPOT p50/p95 0.0394/0.0467s 0.0191/0.0280s 2.07/1.67
2 coder_200_ts3 E2E p50/p95 21.79/101.59s 9.96/53.98s 2.19/1.88
4 coder_200_ts3 requests/s 0.737 1.254 0.59
4 coder_200_ts3 total tok/s 4355 7403 0.59
4 coder_200_ts3 decode tok/s 660 1122 0.59
4 coder_200_ts3 TTFT p50/p95 0.089/0.346s 0.100/0.318s 0.89/1.09
4 coder_200_ts3 TPOT p50/p95 0.0311/0.0358s 0.0094/0.0128s 3.30/2.80
4 coder_200_ts3 E2E p50/p95 16.90/83.01s 5.55/27.87s 3.05/2.98

TP scaling comparison:

fixture metric Frontier TP4 / TP2 vLLM TP4 / TP2
coder_200_ts2 total tok/s speedup 1.10 1.20
coder_200_ts2 decode tok/s speedup 1.10 1.20
coder_200_ts2 TPOT p50 reduction 0.78 0.54
coder_200_ts3 total tok/s speedup 1.07 1.15
coder_200_ts3 decode tok/s speedup 1.07 1.15
coder_200_ts3 TPOT p50 reduction 0.79 0.49

Current TP2/TP4 judgment:

  • Functional replay is aligned for this setting: same request rows, same trace-side prefix reuse ratio, matched vLLM KV block counts, and no preemption on either side.
  • Absolute performance is not aligned. Frontier reports only 55-63% of vLLM total/decode throughput across TP2/TP4, and TPOT is especially pessimistic at TP4.
  • Relative TP scaling is also under-estimated. vLLM's TP4 improves TPOT p50 by about 46-51% over TP2, while Frontier improves by only about 21-22%.
  • The remaining gap is therefore not caused by missing rows, prefix-cache mismatch, or KV capacity mismatch in these runs. It points to timing model limitations: missing CPU/scheduler/CUDA-graph modeling, random-forest profile interpolation error, and imperfect modeling of vLLM's TP-dependent decode execution path.
  • These RS12 results are acceptable for continuing ReplayServe integration and rough qualitative trends. They are not yet acceptable as calibrated absolute performance predictions.