Skip to content

fix(qwen35): chunk dense-TP prefill at the rank's prefill batch scaled by the TP degree - #725

Open
alpineQ wants to merge 1 commit into
warpfront:masterfrom
alpineQ:fix/dense-tp-prefill-chunk
Open

fix(qwen35): chunk dense-TP prefill at the rank's prefill batch scaled by the TP degree#725
alpineQ wants to merge 1 commit into
warpfront:masterfrom
alpineQ:fix/dense-tp-prefill-chunk

Conversation

@alpineQ

@alpineQ alpineQ commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Dense-TP serve fed the prefill 32 tokens at a time, so every kernel below ran at M=32 (under the MMQ batch floor) and the 128 per-layer collectives fired once per 32 tokens instead of once per chunk; the chunk is now the rank's prefill batch scaled by the TP degree, and prefill on 2× gfx1100 goes from 31 % slower than one card to faster than it (8k prompt: 72.1 → 54.7 s wall including load; 33k prompt tp=2: 649 → 773 tok/s, byte-identical output).

What was wrong

ep_serve_qwen35_dense_tp (crates/hipfire-generate/src/qwen.rs) iterated prompt_ids.chunks(32). forward_prefill_dense_tp re-chunks internally at prefill_max_batch (512 on gfx1100), so the inner chunker was fine — it just never saw more than 32 tokens per call. Two consequences visible in a rocprof kernel trace of the same 8k prompt (tp=2 vs tp=1):

1 card 2 cards
dispatches 45 922 845 916
attention_q8_0_flash_prefill_wmma calls / grid 256 / 24 576 8 608 / 768
dominant residual GEMM MMQ (_mmq_full_set) _residual_wmma

should_use_mmq needs batch_size >= 128 on RDNA3 (arch_caps.rs), so TP silently lost the i8-WMMA MMQ prefill path that single-GPU gets (#60), and issued 32 768 collectives for an 8k prompt instead of 2 048.

What changes

  • qwen35::prefill_max_batch_tp(gpu, tp): the arch default scaled by tp (cap 2048). The prefill attention grid is local_heads × chunk / M_TILE and TP divides the heads, so a rank running the single-card chunk launches tp× fewer workgroups than one card and starves an already latency-bound kernel; scaling the chunk restores the single-card workgroup count. An explicit HIPFIRE_PREFILL_MAX_BATCH still wins.
  • ep_serve_qwen35_dense_tp chunks by it instead of 32; a missing EP state is a validation error instead of a silent 32 fallback.
  • forward_prefill_dense_tp sizes its per-rank prefill scratch to the call (min(cap, tokens.len())) instead of the arch ceiling.

PR #662's own table already shows TP2 raising prefill on 5× gfx1201 (462 → 549 tok/s); on 2× gfx1100 it fell 465 → 153 before this change.

Which surface(s) does this touch?

  • kernel
  • loadcrates/hipfire-generate serve path for dense TP
  • servecrates/hipfire-generate/src/qwen.rs
  • arch crate(s): hipfire-arch-qwen35 (qwen35/prefill.rs, qwen35/forward.rs)
  • crates/hipfire-quantize
  • control plane
  • docs / CI / scripts only
  • policy files

Test plan

  • ./scripts/no-gpu-ci.sh: Rust check + no-GPU unit tests + env/docs drift check pass; the Python stage reports 838 passed / 6 failed in tests/test_mq4c_repack.py, and those 6 fail identically on untouched master in this environment (NixOS: no /bin/bash, and the test module resolves a different mq4c_repack than the script) — not touched by this change
  • cargo build --release clean (cargo build --release --workspace --all-targets --locked)
  • cargo test --lib --workspace passes
  • load / serve changes: serve_harness.py --mode battery and --mode chain on qwen3.6:27b (registry fixture, sha 86a5f80f…) at --tp 2, plus battery at tp=1 for the unchanged path — JSON attached below
  • qwen_dense_tp2_parity (32-step greedy parity vs single GPU) PASS
  • Perf: numbers above are from the fixed-prompt protocol in docs/methodology/perf-benchmarking.md (byte-identical prompt, fresh process per arm); speed-gate baselines are single-GPU and not affected
local serve_harness JSON (tp=2 battery + chain, tp=1 battery)
// daemon md5 5aecae77f43bc04cf79f2971e62a6f3d (release build of this branch, gfx1100, ROCm 7.2 / HIP 7.2, 2x RX 7900 XTX)
// qwen3.6-27b.mq4 sha256 86a5f80fd29d545abb1093dead242725ced6d68b8607c6d566d897b1a82442dc (registry fixture qwen3.6:27b)
// --- q36-tp1-battery.json
[
 {
  "request_id": "chatcmpl-1051721-1",
  "ctx": 34,
  "cached": 0,
  "gen": 132,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 62,
  "prefill_ms": 115.0,
  "prefill_tok_s": 295.8,
  "decode_tok_s": 49.6,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.126,
  "wall_s": 2.78,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    ",
  "assistant_content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    start = 0\n    max_len = 0\n    start_index = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_len:\n            max_len = end - start + 1\n            start_index = start\n    \n    return s[start_index:start_index + max_len]\n```",
  "content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    start = 0\n    max_len = 0\n    start_index = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_len:\n            max_len = end - start + 1\n            start_index = start\n    \n    return s[start_index:start_index + max_len]\n```",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "ac7884ced07cabc95cd665752c0ede05",
  "atem_leak": false,
  "prompt_md5": "caf1acdae66df8381a3ce1b0727886ca",
  "expected_substrings": [
   "def "
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051721-3",
  "ctx": 30,
  "cached": 0,
  "gen": 84,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 69,
  "prefill_ms": 71.0,
  "prefill_tok_s": 422.5,
  "decode_tok_s": 49.8,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.091,
  "wall_s": 1.779,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "During the day, sunlight passes through a thinner layer of the atmosphere, causing shorter",
  "assistant_content": "During the day, sunlight passes through a thinner layer of the atmosphere, causing shorter blue wavelengths to scatter more effectively than other colors via Rayleigh scattering. At sunset, sunlight travels through a much thicker cross-section of the atmosphere to reach our eyes, which scatters away most of the blue and green light. Consequently, the remaining longer wavelengths, such as red and orange, dominate the sky's appearance during these times.",
  "content": "During the day, sunlight passes through a thinner layer of the atmosphere, causing shorter blue wavelengths to scatter more effectively than other colors via Rayleigh scattering. At sunset, sunlight travels through a much thicker cross-section of the atmosphere to reach our eyes, which scatters away most of the blue and green light. Consequently, the remaining longer wavelengths, such as red and orange, dominate the sky's appearance during these times.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "f5f1c4d17b48892e03bf90235a7f09e9",
  "atem_leak": false,
  "prompt_md5": "1579a134be91ab67653a176a5cb3007d",
  "expected_substrings": [
   "scatter"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051721-5",
  "ctx": 31,
  "cached": 0,
  "gen": 19,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 16,
  "prefill_ms": 71.5,
  "prefill_tok_s": 433.8,
  "decode_tok_s": 49.8,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.092,
  "wall_s": 0.473,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "The capital of France is Paris, and the river that runs through it is the Seine.",
  "assistant_content": "The capital of France is Paris, and the river that runs through it is the Seine.",
  "content": "The capital of France is Paris, and the river that runs through it is the Seine.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "ce8f1851f034f316731e0669291e69c2",
  "atem_leak": false,
  "prompt_md5": "8caca580290fb75cea2524f52dd6d094",
  "expected_substrings": [
   "Paris",
   "Seine"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051721-7",
  "ctx": 47,
  "cached": 0,
  "gen": 31,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 8,
  "prefill_ms": 103.6,
  "prefill_tok_s": 453.5,
  "decode_tok_s": 49.7,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.124,
  "wall_s": 0.748,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "assistant_content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "9d087beafcbdb8d117c1ae8df956b758",
  "atem_leak": false,
  "prompt_md5": "92bba2040a26fc8018f8e00769bccec9",
  "expected_substrings": [
   "\"name\"",
   "Alice",
   "\"age\"",
   "34",
   "\"city\"",
   "Lisbon"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051721-9",
  "ctx": 47,
  "cached": 0,
  "gen": 6,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 2,
  "prefill_ms": 103.9,
  "prefill_tok_s": 452.3,
  "decode_tok_s": 49.7,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.124,
  "wall_s": 0.245,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "Answer: 43",
  "assistant_content": "Answer: 43",
  "content": "Answer: 43",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "aaa69fa09d3048ef41d1e4642ff61026",
  "atem_leak": false,
  "prompt_md5": "eb63dba2cde2d0c46144775dbf19d7c8",
  "expected_substrings": [
   "Answer: 43"
  ],
  "retrieval_missing": []
 }
]
// --- q36-tp2-battery.json
[
 {
  "request_id": "chatcmpl-1051866-1",
  "ctx": 34,
  "cached": 0,
  "gen": 132,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 62,
  "prefill_ms": 28.6,
  "prefill_tok_s": 1187.3,
  "decode_tok_s": 33.8,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.506,
  "wall_s": 4.018,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    ",
  "assistant_content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    start = 0\n    max_length = 0\n    max_start = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_length:\n            max_length = end - start + 1\n            max_start = start\n    \n    return s[max_start:max_start + max_length]\n```",
  "content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    char_index = {}\n    start = 0\n    max_length = 0\n    max_start = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_length:\n            max_length = end - start + 1\n            max_start = start\n    \n    return s[max_start:max_start + max_length]\n```",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "ac7884ced07cabc95cd665752c0ede05",
  "atem_leak": false,
  "prompt_md5": "caf1acdae66df8381a3ce1b0727886ca",
  "expected_substrings": [
   "def "
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051866-3",
  "ctx": 30,
  "cached": 0,
  "gen": 78,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 69,
  "prefill_ms": 9.2,
  "prefill_tok_s": 3253.2,
  "decode_tok_s": 37.5,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.098,
  "wall_s": 2.169,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter m",
  "assistant_content": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter more easily than other colors when they hit gas molecules in the atmosphere. At sunset, sunlight travels through a thicker layer of atmosphere to reach our eyes, which scatters away most of the blue light before it arrives. Consequently, only the longer red and orange wavelengths remain visible, giving the sky its characteristic warm hues.",
  "content": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter more easily than other colors when they hit gas molecules in the atmosphere. At sunset, sunlight travels through a thicker layer of atmosphere to reach our eyes, which scatters away most of the blue light before it arrives. Consequently, only the longer red and orange wavelengths remain visible, giving the sky its characteristic warm hues.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "f5f1c4d17b48892e03bf90235a7f09e9",
  "atem_leak": false,
  "prompt_md5": "1579a134be91ab67653a176a5cb3007d",
  "expected_substrings": [
   "scatter"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051866-5",
  "ctx": 31,
  "cached": 0,
  "gen": 16,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 13,
  "prefill_ms": 12.9,
  "prefill_tok_s": 2405.0,
  "decode_tok_s": 38.0,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.098,
  "wall_s": 0.511,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "The capital of France is Paris, and the River Seine runs through it.",
  "assistant_content": "The capital of France is Paris, and the River Seine runs through it.",
  "content": "The capital of France is Paris, and the River Seine runs through it.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "ce8f1851f034f316731e0669291e69c2",
  "atem_leak": false,
  "prompt_md5": "8caca580290fb75cea2524f52dd6d094",
  "expected_substrings": [
   "Paris",
   "Seine"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051866-7",
  "ctx": 47,
  "cached": 0,
  "gen": 31,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 8,
  "prefill_ms": 12.5,
  "prefill_tok_s": 3773.2,
  "decode_tok_s": 37.7,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.123,
  "wall_s": 0.937,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "assistant_content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "9d087beafcbdb8d117c1ae8df956b758",
  "atem_leak": false,
  "prompt_md5": "92bba2040a26fc8018f8e00769bccec9",
  "expected_substrings": [
   "\"name\"",
   "Alice",
   "\"age\"",
   "34",
   "\"city\"",
   "Lisbon"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1051866-9",
  "ctx": 47,
  "cached": 0,
  "gen": 6,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 2,
  "prefill_ms": 13.2,
  "prefill_tok_s": 3554.1,
  "decode_tok_s": 39.0,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.122,
  "wall_s": 0.267,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "Answer: 43",
  "assistant_content": "Answer: 43",
  "content": "Answer: 43",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "aaa69fa09d3048ef41d1e4642ff61026",
  "atem_leak": false,
  "prompt_md5": "eb63dba2cde2d0c46144775dbf19d7c8",
  "expected_substrings": [
   "Answer: 43"
  ],
  "retrieval_missing": []
 }
]
// --- q36-tp2-chain.json
[
 {
  "request_id": "chatcmpl-1052221-1",
  "ctx": 34,
  "cached": 0,
  "gen": 143,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 67,
  "prefill_ms": 28.3,
  "prefill_tok_s": 1199.5,
  "decode_tok_s": 37.4,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.127,
  "wall_s": 3.93,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    if not s:\n        re",
  "assistant_content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    if not s:\n        return \"\"\n    \n    char_index = {}\n    start = 0\n    max_length = 0\n    max_start = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_length:\n            max_length = end - start + 1\n            max_start = start\n    \n    return s[max_start:max_start + max_length]\n```",
  "content": "```python\ndef longest_substring_without_repeating(s: str) -> str:\n    if not s:\n        return \"\"\n    \n    char_index = {}\n    start = 0\n    max_length = 0\n    max_start = 0\n    \n    for end, char in enumerate(s):\n        if char in char_index and char_index[char] >= start:\n            start = char_index[char] + 1\n        char_index[char] = end\n        if end - start + 1 > max_length:\n            max_length = end - start + 1\n            max_start = start\n    \n    return s[max_start:max_start + max_length]\n```",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "ac7884ced07cabc95cd665752c0ede05",
  "atem_leak": false,
  "prompt_md5": "caf1acdae66df8381a3ce1b0727886ca",
  "expected_substrings": [
   "def "
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1052221-3",
  "ctx": 203,
  "cached": 0,
  "gen": 97,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 86,
  "prefill_ms": 20.2,
  "prefill_tok_s": 10068.3,
  "decode_tok_s": 37.5,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.354,
  "wall_s": 2.934,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter m",
  "assistant_content": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter more easily than other colors when they hit molecules in the atmosphere, a phenomenon known as Rayleigh scattering. At sunset, the sun is lower on the horizon, so its light must pass through a thicker layer of atmosphere to reach our eyes, which scatters most of the blue light away before it arrives. This leaves the longer red and orange wavelengths to dominate the sky, creating the characteristic warm hues of sunset.",
  "content": "The sky appears blue during the day because shorter blue wavelengths of sunlight scatter more easily than other colors when they hit molecules in the atmosphere, a phenomenon known as Rayleigh scattering. At sunset, the sun is lower on the horizon, so its light must pass through a thicker layer of atmosphere to reach our eyes, which scatters most of the blue light away before it arrives. This leaves the longer red and orange wavelengths to dominate the sky, creating the characteristic warm hues of sunset.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "11d056de03ae7c34cab66f70026e8219",
  "atem_leak": false,
  "prompt_md5": "1579a134be91ab67653a176a5cb3007d",
  "expected_substrings": [
   "scatter"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1052221-5",
  "ctx": 328,
  "cached": 0,
  "gen": 16,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 13,
  "prefill_ms": 21.3,
  "prefill_tok_s": 15411.8,
  "decode_tok_s": 37.9,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.52,
  "wall_s": 0.932,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "The capital of France is Paris, and the River Seine runs through it.",
  "assistant_content": "The capital of France is Paris, and the River Seine runs through it.",
  "content": "The capital of France is Paris, and the River Seine runs through it.",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "186cd394d5ed9d1b349b396b22312c7a",
  "atem_leak": false,
  "prompt_md5": "8caca580290fb75cea2524f52dd6d094",
  "expected_substrings": [
   "Paris",
   "Seine"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1052221-7",
  "ctx": 388,
  "cached": 0,
  "gen": 31,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 8,
  "prefill_ms": 19.6,
  "prefill_tok_s": 19790.5,
  "decode_tok_s": 37.6,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.563,
  "wall_s": 1.377,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "assistant_content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "content": "{\n  \"name\": \"Alice\",\n  \"age\": 34,\n  \"city\": \"Lisbon\"\n}",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "4922ea4ca0ad833bac737c6a142d6684",
  "atem_leak": false,
  "prompt_md5": "92bba2040a26fc8018f8e00769bccec9",
  "expected_substrings": [
   "\"name\"",
   "Alice",
   "\"age\"",
   "34",
   "\"city\"",
   "Lisbon"
  ],
  "retrieval_missing": []
 },
 {
  "request_id": "chatcmpl-1052221-9",
  "ctx": 462,
  "cached": 0,
  "gen": 6,
  "finish": "stop",
  "think_words": 0,
  "ans_words": 2,
  "prefill_ms": 19.5,
  "prefill_tok_s": 23637.6,
  "decode_tok_s": 38.7,
  "decode_estimated": false,
  "tau": null,
  "cycles": null,
  "dflash": null,
  "mtp": null,
  "mtp_ngram": null,
  "ngram_mod_windows": null,
  "ngram_mod_drafts": null,
  "ngram_mod_accepted": null,
  "ngram_mod_accept_rate": null,
  "mtp_windows": null,
  "ar_windows": null,
  "mtp_retired": null,
  "mtp_window_timings": null,
  "ttft_s": 0.6,
  "wall_s": 0.745,
  "attractor": false,
  "empty": false,
  "runaway": false,
  "ans_preview": "Answer: 43",
  "assistant_content": "Answer: 43",
  "content": "Answer: 43",
  "reasoning_content": "",
  "tool_calls": [],
  "request_md5": "3d4e0408340737367c4669bb29b05910",
  "atem_leak": false,
  "prompt_md5": "eb63dba2cde2d0c46144775dbf19d7c8",
  "expected_substrings": [
   "Answer: 43"
  ],
  "retrieval_missing": []
 }
]

Hardware validation request (optional)

{
  "routes": [
    {"mode": "battery", "tag": "qwen3.6:27b"},
    {"mode": "chain",   "tag": "qwen3.6:27b"}
  ],
  "claim": "dense TP2 prefill is chunked at the rank prefill batch; tp=1 serve is unchanged. If the gate can drive `--tp 2` on the multi-GPU host, that is the route this change is about."
}

Architecture-trait change?

No.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant