Skip to content

Abyss v1.3.87 — Qwen3.8-Flash-Next の MTP 付きが約 12% 速く(RTX 5090 で約 129 tok/s)

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 13:16
· 67 commits to main since this release

Qwen3.8-Flash-Next を MTP ドラフター付きで使うときの答えが、約 12% 速くなりました。RTX 5090(PCIe Gen4 x4)、ISTA-DASLab GSQ-RCO IQ3_S、文脈 32K で、v1.3.86 と v1.3.87 のビルドを同じセッションで交互に測りました(greedy の 256 トークンの答え 4 本を 2 回ずつ)。

v1.3.86 v1.3.87
./abyss.sh --bench の答え(3 問、MTP ドラフター on) 116.1 tok/s 128.5〜129.5 tok/s
4 本の平均、ドラフター on 約 116 約 130
1 トークンずつ(GEN spec=0)、4 本の平均 約 106 約 107(変わらず)
品質の確認(bench/ref との KL) 0.0022 0.0022

v1.3.85 から数えると、--bench の答えは 87.6 → 約 129 tok/s で、約 1.5 倍です。

  • MTP の検証窓でも、ハイパー接続の混ぜ合わせを 5 回の起動から 2 回にまとめました。出力はビット単位で同じです(v1.3.86 で 1 トークンずつの経路にしたのと同じ方法です。hc4_fused_parity で、1〜8 列の窓もバイト単位で比べています)。
    • 窓の 97 回の混ぜ合わせが、2 列で 2.6 → 1.8 ms、5 列で 5.5 → 2.6 ms になりました。ドラフター on で +7.7% です。
    • STRATA_Q4X_HC_FUSE=2 で、1 トークンずつの経路だけまとめて、窓は 5 回のままにできます(比べる用)。HIP では、これまでどおり既定でオフです。
  • MoE の経路を決めるカーネルで、上位のエキスパートを GPU の warp の集約命令で選ぶようにしました(NVIDIA の sm_80 以降)。
    • 選ばれるエキスパートと順番は、前と同じです(64〜512 個のエキスパート、1〜16 個の選択、同点、-inf、±0 で確かめました)。どのモデルも、出力は変わりません。
    • 1 回が約 45k → 約 36.5k サイクルになり、Qwen3.8 ではドラフター on でも 1 トークンずつでも +2% です。
    • このカーネルは、GLM、DeepSeek V4 / V4.1、Ornith、Qwen3.8 のすべてが使います。HIP は、元の選び方のままです。
  • Qwen3.8 では、ドラフターが動いている間に、検証窓が使う PLE の表の行を先に読んでおきます。 窓が行を待つ時間が 0.8〜1.1 ms から 0.1〜0.25 ms になり、ドラフター on で +3.1% です。STRATA_Q4X_PLE_PREFETCH=0 でオフにできます。
  • ほかのモデルも確かめました(RTX 5090、v1.3.86 のビルドとの比較)。
    • GLM-5.3-Flash Maya-S-v2 IQ2_XXS:答え 64.3 / 64.0 tok/s(v1.3.86 は 64.2)、8K のプロンプト 1087 / 1091(1087)。品質も同じです。
    • DeepSeek V4.1 UD-IQ2_XXS:答え 22.9 / 20.7 tok/s(21.6)、8K のプロンプト 360 / 319(356)。2 回目は SSD が遅い時間帯に当たりました。KL は 0.0081 / 0.0082(0.0080)です。
    • 経路のカーネルが書き込む内容は、全部(リクエストの領域、窓の列の領域、その後ろの見張り用のデータまで)、v1.3.86 とバイト単位で同じでした。
    • --bench のドラフターの確認は、新旧どちらのビルドでも、ときどき最初のほうで分かれます。エキスパートの置き場所によって動く、ほぼ同点の入れ替わりです。エキスパートの入れ替えを止めた状態で、V4.1 は新旧とも 3 回に 1 回 0 トークン目で、GLM は新で 3 回に 2 回、旧で 4 回に 1 回 7 トークン目で分かれました。
  • AI PRO R9700 では確かめていません(今は PC に挿していないため)。HIP は既定では変わりません(コンパイルは確認済み)。

更新方法はいつもどおりで、git pull してから ./setup.sh を実行してください。


Qwen3.8-Flash-Next with its MTP drafter decodes about 12% faster. RTX 5090 (PCIe Gen4 x4) with ISTA-DASLab GSQ-RCO IQ3_S, ctx 32K, the v1.3.86 and v1.3.87 builds alternated in one session (4 greedy answers of 256 tokens, twice):

v1.3.86 v1.3.87
./abyss.sh --bench decode (3 questions, MTP drafter on) 116.1 tok/s 128.5-129.5 tok/s
4 answers, drafter on (mean) ~116 ~130
token by token (GEN spec=0), the 4 answers' mean ~106 ~107 (unchanged)
quality check (KL against bench/ref) 0.0022 0.0022

From v1.3.85, --bench decode went 87.6 -> ~129 tok/s, about 1.5x.

  • The MTP verify windows' hyper-connection mixes run in two launches instead of five, with the same bits, as the token path's since v1.3.86 (hc4_fused_parity now also checks windows of 1-8 columns byte for byte). A window's 97 mixes took 2.6 ms at 2 columns and 5.5 ms at 5; now 1.8 and 2.6. Drafter on +7.7%. STRATA_Q4X_HC_FUSE=2 keeps the token path fused and the windows on five launches (for A/B); off by default on HIP, as before.
  • The MoE route kernel picks its top-k with the GPU's warp reductions (NVIDIA, sm_80 and newer). The same experts in the same order as before (checked over 64-512 experts, 1-16 picks, ties, -inf and +-0), so every model's output is unchanged; a route takes ~45k -> ~36.5k GPU cycles. Qwen3.8: drafter on and token by token both +2%. Every model routes through this kernel (GLM, DeepSeek V4 / V4.1, Ornith, Qwen3.8); HIP keeps the old selection.
  • Qwen3.8 reads a verify window's PLE table rows while the drafter runs, so the window waits for its rows 0.1-0.25 ms instead of 0.8-1.1 ms. Drafter on +3.1%. STRATA_Q4X_PLE_PREFETCH=0 turns it off.
  • Other models, on the 5090 against the v1.3.86 build:
    • GLM-5.3-Flash Maya-S-v2 IQ2_XXS: decode 64.3 / 64.0 tok/s against 64.2, 8K prompt 1087 / 1091 against 1087, the same quality.
    • DeepSeek V4.1 UD-IQ2_XXS: decode 22.9 / 20.7 against 21.6, 8K prompt 360 / 319 against 356 (the second run met a slow SSD spell), KL 0.0081 / 0.0082 against 0.0080.
    • The route kernel's whole output (request block, window column blocks, canaries after them) is byte-identical to v1.3.86's.
    • --bench's drafter check sometimes parts at the first tokens on both builds (a near-tie that moves with where the experts sit): with expert swaps pinned, V4.1 parted at token 0 in 1 of 3 runs on each build, GLM at token 7 in 2 of 3 on this build and 1 of 4 on v1.3.86's.
  • Not checked on an AI PRO R9700 (not in the PC). HIP is unchanged by default (it compiles).

Update as usual: git pull, then run ./setup.sh.