Skip to content

Releases: zephel01/Abyss

Abyss v1.3.88 — Qwen3.8-Flash-Next の長いプロンプトが速く(8K +52%、32K +76%)

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 16:51

Qwen3.8-Flash-Next で、長いプロンプトを読む速さが大きく上がりました。RTX 5090(PCIe Gen4 x4)、ISTA-DASLab GSQ-RCO IQ3_S で、v1.3.87 と v1.3.88 のビルドを交互に測りました(./abyss.sh --bench --full、文脈 65536)。

プロンプト v1.3.87 v1.3.88
2K トークン 1,061〜1,120 tok/s 1,145〜1,202 tok/s(+5%)
8K トークン 1,477〜1,561 tok/s 2,240〜2,376 tok/s(+52%)
32K トークン 1,702〜1,720 tok/s 3,002〜3,027 tok/s(+76%)

45.5K トークンのプロンプト(埋めた答えを探すテスト)は、1 本 26〜29 秒 → 14〜17 秒になりました。答えは新旧とも 3 回中 3 回見つかっています。答えを出す速さ(decode)は変わりません。品質も KL 0.0022 のままです。

  • プロンプトの疎なアテンション(QSA の 12 層で、2,051 セルより後の行)を、64 行まとめて 1 回で処理するようにしました。
    • これまでは、行ごと・層ごとに「選んだセルを集める」と「アテンション」を GPU に頼んでいました。
    • 今は、各行が選んだセルを KV キャッシュから直接読みます。同じ KV グループの 6 ヘッドで、K/V の読み込みを使い回します。
    • 出力は前とビット単位で同じです(qsa_rows_parity で、文脈 8K / 32K、選ぶセル 4〜2,051 個で確かめました)。
    • インデクサのキーの追加も、1 トークンずつではなく、サブバッチごとに 2 回の処理にまとめました。結果は同じバイトです。
    • 12K トークンの測定で、この部分は 2,000 ms → 346 ms になりました。
    • STRATA_Q4X_QSA_BATCH=0 で、元の処理に戻ります。HIP では既定でオフです(コンパイルは確認済み。AMD のカードでは動かしていません)。
  • GDN(delta-net)の中間の処理(q/k の正規化、ゲート、再帰、出力の正規化、q8_1)を、1 回の処理にまとめました。
    • 1 トークンずつの経路では 1 回、検証窓では 3 回分を 1 回にしています。出力はビット単位で同じです(gdn_core_parity)。
    • 1 トークンあたり約 0.09 ms 縮みましたが、答えの速さは揺れの範囲内でした。
    • STRATA_Q4X_GDN_FUSE=0 で、元の処理に戻ります。HIP では既定でオフです。
  • --bench のドラフターの確認が、ほぼ同点の入れ替わりを「TOO EARLY」と報告しなくなりました。
    • ドラフターありとなしの答えが最初の 12 トークン以内で分かれたとき、同じ書き出しのあとの 2 つのトークンを、モデルに採点させます(LOGP)。
    • 差が 1 nat 以内なら、ほぼ同点の入れ替わりとして問題なしにします。それより離れていれば、これまでどおり TOO EARLY です。
    • 5090 では、分かれた場所の差は 0.01〜0.13 nats でした。間違ったトークンだと、18〜28 nats も低くなります。
  • AI PRO R9700 では確かめていません(今は PC に挿していないため)。

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


Qwen3.8-Flash-Next reads long prompts much faster. RTX 5090 (PCIe Gen4 x4), ISTA-DASLab GSQ-RCO IQ3_S, the v1.3.87 and v1.3.88 builds alternated (./abyss.sh --bench --full, ctx 65536):

prompt v1.3.87 v1.3.88
2K tokens 1061-1120 tok/s 1145-1202 tok/s (+5%)
8K tokens 1477-1561 tok/s 2240-2376 tok/s (+52%)
32K tokens 1702-1720 tok/s 3002-3027 tok/s (+76%)

A 45.5K-token prompt (needle test) 26-29 s -> 14-17 s, the needle found 3 of 3 on both. Decode unchanged; quality KL 0.0022 as before.

  • The prompt's sparse attention (the 12 QSA layers, rows past 2,051 cells) runs 64 rows a launch instead of a gather and an attention launch a row and a layer, each row reading its own selected cells straight from the KV cache, one block the six heads of a KV group (one K / V read for six heads). The same bits as before (qsa_rows_parity: 8K / 32K contexts, 4-2,051-cell selections). The indexer's block keys are appended a sub-batch at a time in two launches instead of one a token (the same bytes). The stage took 2,000 ms of a 12K-token run, now 346. STRATA_Q4X_QSA_BATCH=0 is the old way; off by default on HIP (it compiles; not run on an AMD card).
  • The delta-net middle (q/k norm, gates, recurrence, output norm, q8_1) runs in one launch on the token path and three in one in the verify windows, the same bits (gdn_core_parity). About -0.09 ms a token; the decode speed moved within the noise. STRATA_Q4X_GDN_FUSE=0 is the old way; off by default on HIP.
  • --bench's drafter check no longer calls a near-tie "TOO EARLY": when the answers with and without the drafter part within the first 12 tokens, the token path scores both tokens after the same start (LOGP); within 1 nat is an early near-tie (fine), farther apart is still TOO EARLY. On the 5090 the parts measured 0.01-0.13 nats apart, a wrong token 18-28 nats below.
  • Not checked on an AI PRO R9700 (not in the PC).

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

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

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.

Abyss v1.3.86 — Qwen3.8-Flash-Next が約 3 分の 1 速く(RTX 5090 で 87.6 → 116.1 tok/s)

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 08:45

Qwen3.8-Flash-Next の答えが、約 3 分の 1 速くなりました。RTX 5090(PCIe Gen4 x4)、ISTA-DASLab GSQ-RCO IQ3_S、文脈 32K で測りました。

v1.3.85 v1.3.86
./abyss.sh --bench の答え(3 問、MTP ドラフター on) 87.6 tok/s 116.1 tok/s
文章 2 本、ドラフター on(256 トークン、greedy) 約 84 / 約 80 約 114 / 約 111
コード 2 本、ドラフター on 約 88 / 約 98 約 118 / 約 128
1 トークンずつ(GEN spec=0)、4 本の平均 約 79 約 106
使うエキスパートが VRAM にある割合 60〜77% 80〜94%
CPU レーンに回る数 1 トークン 217 個(6.0 ms) 109 個(3.1 ms)
品質の確認(bench/ref との KL) 0.0019 0.0022
  • Qwen3.8 のルーティングの統計を、Abyss に同梱しました(data/expert_counts/qwen38-flash-next.txt。文章・コード・数学・日本語の 36 本のプロンプト、820 万ルート)。
    • Qwen3.8 のパックには統計が入っていないため、これまではエキスパートが番号順に VRAM へ入っていました(各層の 0〜249 番)。
    • これからは、統計の無い Qwen3.8 のパック(量子化の種類は問いません)で、サーバーが同梱の統計を使います。よく使われる順に温め、層ごとの VRAM の枠も使われ方に合わせます(一律 250 個 → 205〜322 個)。パックに自分の統計があれば、そちらを使います。
  • Qwen3.8 では、RAM と VRAM のエキスパートの入れ替えを早めました。 1 回に最大 16 個、入れ替える条件は「今いるものの 2 倍 + 8 回」です。ほかのモデルは、DeepSeek V4 の 8 MB のエキスパートに合わせた今までの値(8 個、4 倍 + 16)のままです。Qwen3.8 のエキスパートは約 2 MB で、1 回の写しは約 0.3 ms です。
    • 入れ替えの規則だけで約 88 → 約 100 tok/s、統計だけで約 115、両方で約 118 tok/s です。
  • Qwen3.8 のハイパー接続の混ぜ合わせ(1 トークンに 97 回)を、5 回の起動から 2 回にまとめました。出力はビット単位で同じです(-DSTRATA_PARITY_HC4=ON の hc4_fused_parity で、全部の出力をバイト単位で比べています)。
    • 混ぜ合わせの時間は 1 トークン 2.98 → 2.21 ms、1 トークンずつのときで約 +8% です。検証窓は、まだ 5 回の起動のままです。
    • HIP(AMD)では既定でオフです(足し算の順番が違い、ビット一致にならないため)。STRATA_Q4X_HC_FUSE=0 / 1 で切り替えられます。
  • KL が 0.0019 から 0.0022 に動いたのは、CPU で計算するエキスパートが変わったためです(CPU と GPU で丸め方が違います)。測るたびの揺れと同じ程度です。
  • ほかのモデルは変わりません。RTX 5090 の GLM-5.3-Flash Maya-S-v2 で、答え 64.1 tok/s、8K のプロンプト 1090 tok/s です(v1.3.85 のビルドは 63.2 / 1100)。
  • AI PRO R9700 では確かめていません(今は PC に挿していないため)。統計と入れ替えの規則は CPU 側の処理なので、Radeon でも効くはずです。結果を issue で教えてもらえると助かります。

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


Qwen3.8-Flash-Next decodes about a third faster. RTX 5090 (PCIe Gen4 x4) with ISTA-DASLab GSQ-RCO IQ3_S, ctx 32K:

v1.3.85 v1.3.86
./abyss.sh --bench decode (3 questions, MTP drafter on) 87.6 tok/s 116.1 tok/s
2 prose answers, drafter on (256 tokens, greedy) ~84 / ~80 ~114 / ~111
2 code answers, drafter on ~88 / ~98 ~118 / ~128
token by token (GEN spec=0), the 4 answers' mean ~79 ~106
VRAM hits 60-77% 80-94%
CPU lane 217 experts a token (6.0 ms) 109 (3.1 ms)
quality check (KL against bench/ref) 0.0019 0.0022
  • A routing profile for Qwen3.8 ships with Abyss (data/expert_counts/qwen38-flash-next.txt: 36 prompts of prose, code, math and Japanese, 8.2M routes). Its packs have no profile of their own, so the experts went into VRAM in id order (experts 0-249 of every layer). The server now points STRATA_GLM_PRIOR at the shipped profile for a Qwen3.8 pack (any quant) without an expert_counts.txt: the experts warm in its order, and each layer gets a VRAM share by its routing (205-322 slots instead of 250 each). A pack's own profile still wins.
  • Qwen3.8 swaps experts between RAM and VRAM sooner: up to 16 moves a token boundary, a swap at 2 x the resident's count + 8 (others keep 8 and 4 x + 16, tuned for DeepSeek V4's 8 MB experts; Qwen3.8's are ~2 MB, ~0.3 ms a copy). The swap rule alone: ~88 -> ~100 tok/s; the profile alone ~115; both ~118.
  • Qwen3.8's hyper-connection mixes (97 a token) run in two launches instead of five, with the same bits (hc4_fused_parity, -DSTRATA_PARITY_HC4=ON, compares every output byte for byte). The mixes take 2.98 -> 2.21 ms a token; token by token ~+8%. The verify windows still use the five launches. Off by default on HIP (HIP sums in another order); STRATA_Q4X_HC_FUSE=0 / 1 switches it.
  • The KL moves from 0.0019 to 0.0022 because the CPU now computes other experts than before (CPU and GPU round differently), as between two runs.
  • Other models are unchanged: GLM-5.3-Flash Maya-S-v2 on the 5090, decode 64.1 tok/s, 8K prompt 1090, as the v1.3.85 build (63.2 / 1100).
  • Not checked on an AI PRO R9700 (not in the PC). The profile and the swap rule run on the CPU side, so they should help on Radeon too; a report in an issue is welcome.

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

Abyss v1.3.85 — 無検閲化で拒否が残る種類の依頼を、作成に足せるように(--cyber / --extra-harmful)

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 06:24

--abl-build のあとも、ある種類の依頼だけ拒否が残るときのために、tools/abl_prompts.py に 2 つのオプションを足しました。拒否は種類ごとに別の方向に乗っていることがあり、作成は、依頼文に出てくる方向しか見つけないためです。

  • --cyber N: マルウェアや不正アクセスの依頼文を N 問、作成の有害側に必ず入れます。ForbiddenQuestions の Malware カテゴリと、AdvBench / MaliciousInstruct の cyber 系の言葉から取ります(139 問。評価に使う JailbreakBench からは取りません)。
  • --extra-harmful FILE(--extra-n N): 自分で用意した依頼文を、同じように有害側に必ず入れます。1 行に 1 問(UTF-8)、空行と # の行は読み飛ばし、"prompt" を持つ JSON の行も読めます。Abyss は中身を配っていません。自分で書いてください。

実測(RTX 5090、Qwen3.8-Flash-Next ISTA IQ3_S、greedy)

作成 JBB の拒否(81 問) Malware / Hacking XSTest の過剰拒否 数学 文章の KL(en / ja / code / md)
標準の mix、--abl-rank 3 11.1% 5 問中 4 問 0.8% 44 / 50 0.028 / 0.015 / 0.046 / 0.029
--cyber 30、--abl-rank 4 1.2% 5 問中 0 問 0.0%(50 問) 43 / 50 0.027 / 0.015 / 0.057 / 0.033

--cyber 30 だけで rank 3 のままだと、マルウェアの拒否は残りました。消したのは 4 本目の方向(18 層)です。

使い方、確かめ方、テストに使う依頼文と分けることは、docs/UNCENSOR.ja.md の「自分の依頼文を足す」にあります。

更新方法はいつもどおりで、git pull してから ./setup.sh を実行してください(今回はツールと説明書だけで、エンジンは変わっていません)。


Two options in tools/abl_prompts.py for a kind of request still refused after --abl-build: refusals can sit on a direction of their own for one kind of request, and the build only finds directions its prompts show.

  • --cyber N: forces N malware / hacking prompts into the build's harmful side, from ForbiddenQuestions' Malware category and cyber keyword matches in AdvBench / MaliciousInstruct (139; none from JailbreakBench, which is the test set).
  • --extra-harmful FILE (--extra-n N): forces your own prompts in the same way. One a line (UTF-8), blank and # lines skipped, JSON lines with a "prompt" read. Abyss ships no prompts for this; write your own.

Measured (RTX 5090, Qwen3.8-Flash-Next ISTA IQ3_S, greedy)

build JBB refused (81) Malware / Hacking XSTest over-refusal math text KL (en / ja / code / md)
the standard mix, --abl-rank 3 11.1% 4 of 5 0.8% 44 / 50 0.028 / 0.015 / 0.046 / 0.029
--cyber 30, --abl-rank 4 1.2% 0 of 5 0.0% (50) 43 / 50 0.027 / 0.015 / 0.057 / 0.033

--cyber 30 at rank 3 left the malware refusals; the 4th direction (layer 18) removed them.

How to use and check it, and keeping the file apart from your test prompts: docs/UNCENSOR.md, "Adding your own prompts".

Update as usual: git pull, then run ./setup.sh (tools and docs only this time; the engine is unchanged).

Abyss v1.3.84 — Qwen3.8-Flash-Next でも無検閲化(--uncensor)が使えるように

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 04:47

Qwen3.8-Flash-Next でも --abl-build と --uncensor(無検閲化)が使えるようになりました。これまでは、このモデルの速い経路で残差を取れていなかったため、--abl-build で作ったファイルを読み込んでも何も変わりませんでした。

  • 速い経路でも残差を取るようにしました。取る場所は、各層の入口と、最後の head の混ぜ合わせの後です(ほかのモデルと同じです)。
  • 層ごとの埋め込み(PLE)の行も残差への書き込みなので、編集の対象にしました。1 トークンずつの経路、プロンプトの経路、検証窓のどれでも効きます(V4.1 の Engram と同じ扱いです)。
    • ファイルがなければ何もしません。ファイルがあっても、リクエストで "uncensor": false を付ければ、編集なしの答えを返します。

実測(RTX 5090、ISTA-DASLab GSQ-RCO IQ3_S、編集する層は 39・43・36、消す方向は 3 本、ファイルは 31 KB)

  • 有害な質問の確認用 24 問で、断った答え: 23 → 3
  • 能力の問題 120 問(greedy)、編集あり / なし:
編集あり 編集なし
数学 45/50 42/50
コード 30/30 30/30
日本語 10/10 10/10
選択問題 20/20 20/20
MMLU-500 84.4% 84.8%(McNemar p 0.75、差なし)

配布されている無検閲版との比較は、まだ測っている途中です。

使い方は docs/UNCENSOR.ja.md にあります。

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


--abl-build and --uncensor now work on Qwen3.8-Flash-Next. The model's fast path did not capture the residual, so a file built for it did nothing.

  • The fast path captures the residual (at each layer's entry and after the head mix, as the other models).
  • The per-layer embedding (PLE) rows are a residual write too, so they are edited on the token path, the prompt path and the verify window, as V4.1's Engram.
    • Off without a file; with a file, "uncensor": false on a request still gives the unedited model.

Measured (RTX 5090, ISTA-DASLab GSQ-RCO IQ3_S, layers 39+43+36, rank 3, a 31 KB file)

  • 24 harmful check prompts, answers refusing: 23 -> 3
  • 120 capability items (greedy), edit on / off:
edit on edit off
math 45/50 42/50
code 30/30 30/30
Japanese 10/10 10/10
multiple choice 20/20 20/20
MMLU-500 84.4% 84.8% (McNemar p 0.75, no difference)

A comparison with downloaded uncensored releases is still running.

How to use it: docs/UNCENSOR.md.

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

Abyss v1.3.83 — CUDA の投機デコード(検証窓)でエキスパートの重みが消えていた不具合を修正

Choose a tag to compare

@zephel01 zephel01 released this 31 Oct 01:53

v1.3.74 から、CUDA で投機デコードを使うと答えが崩れていました。修正しました。

RTX 5090 で測りました。条件は Qwen3.8-Flash-Next ISTA IQ3_S、MTP ドラフター on、greedy です。能力問題 120 問と日常タスク 30 本の結果:

ドラフター on(修正前) ドラフター on(修正後) ドラフター off
数学 3/50 43/50 43/50
ループした答え — 2/130 3/130
速度 — 100.4 tok/s 72.0 tok/s
  • 原因: ルートカーネルが配列の外に書いていた。 v1.3.74 から、fetch_src の未使用欄を 16 個目まで 0 で消していました。ところが配列は max(8, k) 個しかありません。検証窓の列ごとの領域では、この配列の直後に plan_w(各エキスパートの重み)が置かれています。そのため、CUDA の検証窓では選ばれたエキスパートが全部重み 0 になり、共有エキスパートと CPU レーン分しか効いていませんでした。
    • 影響したのは窓を使う投機デコード全部です。Qwen3.8 の MTP ドラフター、DeepSeek V4.1 の DSpark、n-gram 窓が該当します。
    • V4.1 UD-IQ2_XXS + DSpark の答えは、修正前は 2〜6 トークン目でドラフトなしの答えと分かれていました。修正後は、16 トークン目以降で分かれるか、最後まで同じです。
    • 1 トークンずつの通常経路は影響を受けていません。
    • HIP(AMD)は、今 PC に AMD のカードが無いため確かめていません。
  • Qwen3.8 の窓のスクラッチ置き場を列ごとに分けました(最大 6 列。V4.1 と同じ方式)。これまでは列 3〜5 が同じ置き場を共有しており、ある列の読み込みが別の列のエキスパートを上書きすることがありました。
  • Qwen3.8 で 2,051 トークンを超えたとき: 却下された窓の列が、注意インデクサのキー末尾を書き換えたまま残る問題を直しました。
  • ./abyss.sh --bench に「ドラフターチェック」を追加しました。 最初の答えをもう一度 1 トークンずつ出させ、どこで分かれるかを表示します(docs/BENCH.ja.md)。
    • --serve の GEN ... spec=0 で、1 回分だけ投機デコードなしで答えさせられます。
    • tools/mtp_greedy_check.py を使うと、複数のプロンプトでまとめて比べられます。

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


CUDA speculative decoding: the verify windows kept their experts' weights again

Speculative decoding on CUDA gave wrong answers since v1.3.74. Fixed.

Measured on an RTX 5090 with Qwen3.8-Flash-Next ISTA IQ3_S, the MTP drafter on, and greedy decoding. The set was 120 capability items and 30 everyday tasks:

drafter on (before) drafter on (after) drafter off
math 3/50 43/50 43/50
looping answers — 2/130 3/130
speed — 100.4 tok/s 72.0 tok/s
  • Cause: the route kernel wrote past an array. Since v1.3.74 it cleared fetch_src up to 16 entries, but the array holds only max(8, k). In a verify window column's block, plan_w (the experts' weights) comes right after it. So every window column on CUDA ran without its routed experts: only the shared expert and the CPU lane's share were left.
    • This hit every windowed drafter: Qwen3.8's MTP, DeepSeek V4.1's DSpark, and the n-gram windows.
    • V4.1 UD-IQ2_XXS + DSpark answers parted from the no-draft answers at token 2-6. Now they part at token 16 or later, or not at all.
    • The token-by-token path was not affected.
    • HIP (AMD) is not checked: there is no AMD card in the test PC right now.
  • Qwen3.8's windows: one scratch slot set per column (up to 6 columns, as for V4.1). Columns 3-5 shared one set before, so a fetch for one column could overwrite another column's experts.
  • Qwen3.8 past 2,051 tokens: a rejected window column no longer leaves the attention indexer's key tail changed.
  • ./abyss.sh --bench has a drafter check. It asks the first answer again token by token and shows where the two part (docs/BENCH.md).
    • GEN ... spec=0 on the --serve wire asks for one answer without speculative decoding.
    • tools/mtp_greedy_check.py compares many prompts at once.

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

Abyss v1.3.82 — 8 GB GPU でも動く・prompt がまとめて読める(issue #23)、CUDA の VRAM 予約を 1.5 GB に

Choose a tag to compare

@zephel01 zephel01 released this 30 Oct 23:19

8 GB クラスの GPU(issue #23: RTX A2000 Laptop 8 GB + メモリ 64 GB)への対応と、大きい CUDA カードの VRAM 不足の修正です。
まとめのページ: docs/SMALL-VRAM.ja.md(English)。

  • エキスパートの置き場(pool)が route より小さくても起動します。 GLM-5.3-Flash / Ornith は毎層 8 個のエキスパートを使います。
    以前は層あたり 8 個分の置き場がないと起動を拒否していましたが、いまは 4 個(STRATA_GLM_POOL_FLOOR)あれば動きます。
    足りない分は予備枠・scratch 枠と CPU レーンが受け持ちます。4 未満の拒否文には「何 MB 足りないか」と対処
    (--max-context、--kv q4_0、IQ4_XS の dense pack)が出ます。
  • 小さい置き場でも prompt をまとめて(chunk で)読みます。 以前は各層に 13 個を残したため、9 個程度の置き場では
    prompt が 1 トークンずつでした。いまは prompt の間だけ 4 個を残して残りを貸します(STRATA_GLM_PREFILL_KEEP)。
  • CPU がリンクより十分速いときは、CPU レーンが RAM 層のエキスパートを全部受け持ちます(STRATA_GLM_LANE_LEAN、4 倍)。
    置き場が落ち着いてから切り替わり、ヒット率が落ちたら戻ります。OCuLink / Gen4 x4 の箱や Gen5 x16 の R9700 は変わりません。
  • CUDA も 12 GB を超えるカードでは VRAM を 1.5 GB 空けておきます(HIP は v1.3.68 から同じ。以前は 700 MB)。
    RTX 5090 で DeepSeek V4.1 UD-IQ2_XXS を --max-context 65536 で動かすと、--bench が prompt の attention で、
    DSpark 付きのコーディング実行が MMQ のバッファで out of memory になっていました。12 GB 以下のカードは 700 MB のままです。
  • bench/ref に Ornith-1.5-122B IQ3_XXS-B(16G64G 版)の品質参照を追加(--bench の品質チェックが効きます)。

実測(RTX 5090、PCIe Gen4 x4、メモリ 94 GB。8 GB 機は報告者のログと同じ大きさの置き場を STRATA_GLM_POOL_GB で与えて再現):

v1.3.81 v1.3.82
Ornith-1.5-122B IQ3_XXS-B、置き場 1.45 GB — prompt 2K / 8K 46 tok/s(1 トークンずつ) 356 / 347 tok/s
同 — decode / 品質(16 GB 実行との KL) 48.3 tok/s / 0.0073 45.5 tok/s / 0.0073
GLM-5.3-Flash Maya-S-v2、置き場 1.2 GB(層あたり 4 個) 起動拒否 起動、decode 9.1 tok/s(SSD 律速)、KL 0.039
GLM-5.3-Flash、32 GB(既定のまま) decode 64.6 / 8K prompt 1105 64.1 / 1099(誤差内)
DeepSeek V4.1 UD-IQ2_XXS、64K 文脈 --bench out of memory で停止 decode 23.1 tok/s、8K prompt 357、KL 0.0086
同 + DSpark、コーディング 8 問 out of memory 64.9 tok/s

ノート PC のカードはリンクも CPU も違うので、同じ置き場でも数値は下がります。prompt の伸び(約 7.7 倍)が要点です。

更新: ダッシュボードの About > Update、または git pull のあと ./setup.sh(変わったところだけ再コンパイル)。


8 GB-class GPUs (issue #23: an RTX A2000 Laptop 8 GB + 64 GB RAM) and a VRAM fix for big CUDA cards.
One page for it: docs/SMALL-VRAM.md (日本語).

  • The expert pool may hold fewer slots a layer than a route. GLM-5.3-Flash and Ornith route 8 experts a token per
    layer; the engine used to refuse to start below 8 slots a layer. It now starts with 4 (STRATA_GLM_POOL_FLOOR): the
    rest of a route runs from spare / scratch slots and the CPU lane. The refusal below 4 says how many MB are short and
    what frees them (--max-context, --kv q4_0, the IQ4_XS dense pack).
  • Prompts in chunks on a small pool. The prompt path left every layer 13 slots, so a pool of ~9 read prompts token
    by token. Such a pool now keeps 4 while a prompt runs and lends the rest (STRATA_GLM_PREFILL_KEEP).
  • The CPU lane takes every RAM-tier expert when it is much faster than the link (STRATA_GLM_LANE_LEAN, 4x), once
    the pool has settled, and steps back when the hit rate falls. OCuLink / Gen4 x4 boxes and an R9700 on Gen5 x16 are
    unchanged.
  • CUDA keeps 1.5 GB of VRAM free on cards over 12 GB (as HIP since v1.3.68; 700 MB before). An RTX 5090 running
    DeepSeek V4.1 UD-IQ2_XXS at --max-context 65536 ran out of VRAM: --bench in the prompt attention, a coding run
    with the DSpark drafter in its MMQ buffers. Cards of 12 GB or less keep 700 MB.
  • bench/ref: a quality reference for Ornith-1.5-122B IQ3_XXS-B (the 16G64G quant), so --bench checks it.

Measured (RTX 5090, PCIe Gen4 x4, 94 GB RAM; the 8 GB cases get the reporter's pool size via STRATA_GLM_POOL_GB):

v1.3.81 v1.3.82
Ornith-1.5-122B IQ3_XXS-B, 1.45 GB pool - prompt 2K / 8K 46 tok/s (token by token) 356 / 347 tok/s
the same - decode / quality (KL vs a 16 GB run) 48.3 tok/s / 0.0073 45.5 tok/s / 0.0073
GLM-5.3-Flash Maya-S-v2, 1.2 GB pool (4 slots a layer) refused starts, decode 9.1 tok/s (SSD-bound), KL 0.039
GLM-5.3-Flash, 32 GB (defaults) decode 64.6 / 8K prompt 1105 64.1 / 1099 (within noise)
DeepSeek V4.1 UD-IQ2_XXS, 64K context, --bench stopped: out of memory decode 23.1 tok/s, 8K prompt 357, KL 0.0086
the same + DSpark, 8 coding tasks out of memory 64.9 tok/s

A laptop card has a narrower link and a different CPU, so expect lower numbers on the same pool; the prompt's ~7.7x
is the point.

Update: the dashboard's About > Update, or git pull then ./setup.sh (recompiles only what changed).

Abyss v1.3.81 — 読み込み中の /health を 503 に / /health answers 503 while loading

Choose a tag to compare

@zephel01 zephel01 released this 30 Oct 11:42

変更点

  • 読み込み中の /health は 503(Retry-After: 5)を返すように変更。本文は従来どおり "status": "loading" と進み具合(段階・% / GB)。
    • 「200 = 準備完了」とみなすクライアント(llama-swap のヘルスチェックやスクリプトの待ちループ)が、エンジンの準備が終わるまで待つようになります。
    • Abyss Terminal は 503 の本文を読んで、これまでどおり読み込みの進み具合を表示します。
    • エンジンの準備が終わったら 200(v1.3.80 より前と同じ)。

Changes

  • /health answers 503 (Retry-After: 5) while the model loads; the body still says "status": "loading" and how far (stage, % / GB).
    • A client that reads 200 as "ready" (a llama-swap health check, a script's wait loop) now waits for the engine.
    • Abyss Terminal reads the 503's body and shows the loading progress as before.
    • 200 once the engine is ready, as before v1.3.80.

Abyss v1.3.80 — Abyss Terminal(ターミナルでサーバーを見る・動かす)/ Abyss Terminal

Choose a tag to compare

@zephel01 zephel01 released this 30 Oct 11:40

Abyss Terminal: ./abyss.sh --terminal

ターミナルの中で、サーバーの速さと中身をライブで見て、起動・停止・モデルの切り替えができる画面です。閉じてもモデルは動き続けます。

  • 2 つのレイアウト: Speed(大きな数字で速さ)と Devices(GPU / SSD / CPU を全部)。l で切り替え、--layout で指定、最後の選択を覚えます。GPU 3 枚以上は Devices が既定。
  • 複数 GPU・複数 SSD: GPU は 10 枚まで、SSD は何枚でも(SSD 2 枚のミラーの振り分けも表示)。
  • 1 トークンの時間の内訳をライブで(エンジンの STAT から、直近約 64 トークン): SSD 待ち、レーン、ミラーの分担、ドラフターの受理率と tokens/step、レーンの推定帯域 GB/s、ssd/cpu/pcie/gpu の判定。
  • 起動中の進み具合: エンジンより先にポートを開き、/health が読み込みの段階と % / GB を返す。
  • 別の PC から: --url http://<host>:8082 --key-env <API キーの環境変数>(Tailscale など)。ログも GET /api/log(認証付き)で見られる。停止は認証付き POST /api/shutdown。
  • デモ: ./abyss.sh --terminal --demo r9700(lowspec / split / multi4 / multi8 / multi10 / loading / starting / down)。サーバー無しで画面を確かめられる。
  • ./abyss.sh --help に全コマンドを載せた。
  • エンジン: STAT / INFO / PP / DONE に項目を追加(表示用の printf のみ)。

未確認: エンジンの新しい項目と早いポートの開放は、HIP コンパイラの構文チェックとホスト側のテスト(serve 204、tools 263、Terminal 51)まで。実エンジン(R9700 / RTX 5090)での確認はこれから。読み込み中の /health は v1.3.81 で 503 に変更。


Abyss Terminal: ./abyss.sh --terminal

Watch the server's speed and insides live from a terminal, and start / stop / switch models; closing it keeps the model serving.

  • Two layouts: Speed (big numbers) and Devices (every GPU / SSD / CPU); l switches, --layout picks, the last choice is remembered; Devices by default with 3+ GPUs.
  • Many GPUs and SSDs: up to 10 GPUs, any number of SSDs (with a two-SSD mirror's split).
  • Where a token's time goes, live (the engine's STAT, last ~64 tokens): SSD wait, the lane, the mirror split, the drafter's acceptance and tokens/step, the lane's estimated GB/s, and the ssd/cpu/pcie/gpu verdict.
  • Loading progress: the port is bound before the engine loads and /health says the stage and % / GB.
  • Another PC: --url http://<host>:8082 --key-env <API key variable> (e.g. over Tailscale); logs through GET /api/log (authenticated); stop with an authenticated POST /api/shutdown.
  • Demos: ./abyss.sh --terminal --demo r9700 (lowspec / split / multi4 / multi8 / multi10 / loading / starting / down), no server needed.
  • ./abyss.sh --help lists every command.
  • Engine: new STAT / INFO / PP / DONE fields (printf only).

Not yet checked: the engine's new fields and the early bind pass the HIP compiler's syntax check and the host tests (serve 204, tools 263, Terminal 51); the live check on an engine (R9700 / RTX 5090) follows. /health while loading answers 503 from v1.3.81.

Abyss v1.3.79 — 長い tool 引数のストリームを高速化 / Faster streamed tool calls

Choose a tag to compare

@zephel01 zephel01 released this 30 Oct 10:43

変更点(2026-10-30 の Strata/Maya 確認から 2 件。考え方は Maya #626 / #419、コードは Abyss 独自)

  • ストリームの tool 呼び出し: 本文が届くたびに先頭から終わりのタグを探していたため、長い引数では引数の長さの 2 乗で遅くなっていた(エージェントが 200 KB のファイルを Write すると 8 文字ずつの受信で CPU 約 1 秒)。新しく届いた断片と境目をまたぐぶんだけを探すようにし、200 KB で 1.0 秒 → 0.01〜0.06 秒。出力イベントは旧パーサと 7,680 通りの分け方で完全一致(GLM / Qwen / DSML V4・V4.1 の全形式)。
  • サーバーの接続に TCP_NODELAY: 1 トークンずつの SSE が前の断片の遅延 ACK を待たない(遅い回線で最大 40 ms ずつ)。
  • --calibrate の保存値(~/.config/project-maya/calibration.json)を GPU の PCIe リンク(世代・幅)とドライバの版でも区別。x16 スロットと OCuLink x4 の付け替えやドライバ更新のあとに、別の条件で測った値を使い回していた。古い形式の値は使わず、セットアップが「何で測った値か・今は何か・./abyss.sh --calibrate で測り直す」を 1 行で知らせる。

エンジンは v1.3.78 と同じ(サーバーとセットアップ側のみの変更)。RTX 5090 を OCuLink で付けたときのリンクの読み取りは今週末に確認します。


Changes (two items of the 2026-10-30 Strata/Maya review; ideas from Maya #626 / #419, Abyss's own code)

  • Streamed tool calls: every new piece searched the whole call body from the start for the end tag, so long arguments cost the square of their length (an agent's 200 KB Write at 8 characters a piece took about a second of CPU). Only the new piece plus the tail a split tag needs is searched now: 200 KB 1.0 s → 0.01-0.06 s, events identical to the old parser on 7,680 chunkings (every form: GLM, Qwen, DSML V4 and V4.1).
  • The server's connections set TCP_NODELAY: one-token SSE pieces no longer wait for the delayed ACK of the piece before (up to 40 ms each on a slow link).
  • --calibrate's store (~/.config/project-maya/calibration.json) keys by the GPU's PCIe link (gen/width) and driver too: a card moved between an x16 slot and an OCuLink x4, or a driver update, reused the tuning measured on the other. Older entries are not reused; the setup says in one line what they were measured on, what it is now, and that ./abyss.sh --calibrate measures again.

The engine is the same as v1.3.78 (server and setup changes only). The PCIe link as an RTX 5090 on OCuLink reports it is checked this weekend.