Repository navigation
Releases: zephel01/Abyss
Release list
Abyss v1.3.88 — Qwen3.8-Flash-Next の長いプロンプトが速く(8K +52%、32K +76%)
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 では既定でオフです。
- 1 トークンずつの経路では 1 回、検証窓では 3 回分を 1 回にしています。出力はビット単位で同じです(
--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=0is 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=0is 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)
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_paritynow 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=2keeps 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=0turns 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)
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 pointsSTRATA_GLM_PRIORat the shipped profile for a Qwen3.8 pack (any quant) without anexpert_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/1switches 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)
--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)が使えるように
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": falseon a request still gives the unedited model.
- Off without a file; with a file,
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 の投機デコード(検証窓)でエキスパートの重みが消えていた不具合を修正
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_srcup 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 --benchhas a drafter check. It asks the first answer again token by token and shows where the two part (docs/BENCH.md).GEN ... spec=0on the--servewire asks for one answer without speculative decoding.tools/mtp_greedy_check.pycompares 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 に
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 65536ran out of VRAM:--benchin 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--benchchecks 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
変更点
- 読み込み中の
/healthは 503(Retry-After: 5)を返すように変更。本文は従来どおり"status": "loading"と進み具合(段階・% / GB)。- 「200 = 準備完了」とみなすクライアント(llama-swap のヘルスチェックやスクリプトの待ちループ)が、エンジンの準備が終わるまで待つようになります。
- Abyss Terminal は 503 の本文を読んで、これまでどおり読み込みの進み具合を表示します。
- エンジンの準備が終わったら 200(v1.3.80 より前と同じ)。
Changes
/healthanswers 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
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);
lswitches,--layoutpicks, 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
/healthsays the stage and % / GB. - Another PC:
--url http://<host>:8082 --key-env <API key variable>(e.g. over Tailscale); logs throughGET /api/log(authenticated); stop with an authenticatedPOST /api/shutdown. - Demos:
./abyss.sh --terminal --demo r9700(lowspec / split / multi4 / multi8 / multi10 / loading / starting / down), no server needed. ./abyss.sh --helplists 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
変更点(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 --calibratemeasures 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.