Ternary Bonsai 2 27B for onw — 2 ビットの 27B を Intel NPU で(Lunar Lake 以降専用)
日本語 | English
Prism ML の Ternary-Bonsai-2-27B(Qwen3.8-27B を三値の重みで学習し直したモデル)を、onw(俺のNPUがこんなに動くわけない)用に変換したものです。重みは三値(−1・0・+1)を 2 ビットのまま NPU に載せます。27B のモデルが、メモリ 16 GB の Lunar Lake の NPU で動きます。
まず断っておくと、これは実用というよりロマンです。 NPU で 27B が動く、というのを確かめるためのモデルです。回答は 4 tok/s 前後で、しかもプロンプトの処理が 1 トークンずつなので、長い文章を貼ると読み終わるまでに何分もかかります(下の「制限」を読んでください)。短い質問を投げて、27B の答えをゆっくり眺める用途に向いています。
Lunar Lake(Core Ultra シリーズ 2、NPU 4000)以降の NPU 専用です。 2 ビットの重みは NPU 4 以降のハードウェアでしか計算できず、Meteor Lake・Arrow Lake(NPU 3720)ではコンパイルできません。onw ウィンドウは Lunar Lake 以降の PC でだけ一覧に出します。
64 トークン用のグラフは試作したが失敗(onw 3.2.0)
4B・9B は onw 3.2.0 で 64 トークン用のグラフ(プロンプトを 10 倍以上速く処理)を入れましたが、27B は試作して、出すのをやめました。
- 作って動かすことはできました(Panther Lake でプロンプト約 60 tok/s、生成約 4.5 tok/s)。
- ただし NPU のメモリを 13.8 GB 使い、メモリ 16 GB の PC に載りません。2 ビットの重みを NPU で計算するには、128 個の重みごとに 16 バイトの「重みテーブル」がグラフごとに必要で、27B ではグラフ 1 組あたり 3.4 GB になります。1 トークン用と 64 トークン用の 2 組で、テーブルだけで重み(6.8 GB)と同じ大きさです。
- 初回のコンパイルも Panther Lake で 36 分かかりました。
このため 27B は、これまでどおり 1 トークン用のグラフだけです。テーブルを持たずに済む方法を Intel に要望しています。
測定(onw 1.4.9)
| Lunar Lake(NPU 4000、メモリ 16 GB) | Panther Lake(NPU 5010、メモリ 64 GB) | |
|---|---|---|
| 生成速度(思考オフ) | 約 4.2 tok/s | 約 3.9 tok/s |
| プロンプト処理 | 約 4 tok/s(1 トークンずつ) | 約 4 tok/s(1 トークンずつ) |
| 使用メモリ(プロセス) | 約 9.6 GB | 約 9.9 GB |
| 初回起動(NPU 向けコンパイル) | 約 10 分 | 約 2 時間半 |
| 2 回目以降の起動 | 約 15 秒 | 約 20 秒 |
| ダウンロード | 7.6 GB | 7.6 GB |
2 台で、同じ質問に一字一句同じ答えが返りました(日本語・英語・俳句で確認)。
制限
- プロンプトは 1 トークンずつ処理します。 Intel の NPU コンパイラー(8.3・8.4)は、2 ビットの重みを複数トークンのブロックで計算すると結果を間違えます(1 トークンなら正しい)。そのため、このモデルには 1 トークン用のグラフしか入れていません。1,000 トークンのプロンプトなら 4 分ほど待ちます。会話の続きは前回の分を再利用するので、2 回目以降の質問は新しく書いた分だけ待ちます。コンパイラーの不具合は onw の NPU キットで直しましたが、64 トークン用のグラフはメモリに収まらないため入れていません(上の「試作したが失敗」)。
- 思考(reasoning)は既定でオフにしています。Bonsai 2 は思考をオンにすると何千トークンも考え続けることがあり、この速度では答えにたどり着きません。思考を使うなら、チャット画面の思考の段階を「少し」か「普通」にしてください(このモデルのテンプレートは low・medium・xhigh の 3 段階で、「しっかり」は xhigh になります)。
- MTP 先読み・先読み検証(PLD)は使えません(どちらも複数トークンのブロックが要るため)。
- 画像は読めません(元の Bonsai 2 には画像エンコーダーが付いていますが、このモデルには入れていません)。
- 精度は、三値で学習した 27B の精度です。Prism ML の説明では元の Qwen3.8-27B に近いとされていますが、INT4 の 27B よりは落ちます。
仕組み
- 重み:Bonsai の MLX 版(2 ビット、グループ 128)の値をそのまま使い、OpenVINO の
u2型の定数として NPU に渡します。詰め直しや再量子化はしていません(損失なし)。NPU 上では 2.125 ビット/重み(三値 2 ビット+グループごとの f16 の倍率)で、27B の層が 6.5 GB です。 - アダマール回転:Bonsai 2 は、重みを「ブロック 1,024 のウォルシュ・アダマール変換で回した基底」で学習しています。そのため、行列の掛け算の前に入力を同じように回す必要があり、onw はこれをグラフの中で計算します(32×32 の 2 段に分けた形。1 層あたりのコストは 1% 未満)。
- 埋め込み:回した状態で保存されている行を、読み込み時に元の基底に戻して INT8 の表にしています(ホスト側で参照)。
- そのほかは Qwen3.5 系の onw モデルと同じ作りです(Gated DeltaNet+ゲート付きアテンション、ページ式の INT8 KV キャッシュ)。詳しくは onw の技術解説。
使い方
- onw 1.4.9 以降を入れます(onw の「インストール」)。
- onw ウィンドウの「モデル」タブで Ternary Bonsai 2 27B (2-bit) を選び、「ダウンロード」を押します(Lunar Lake 以降の PC でだけ表示されます)。
- 「サーバー」タブで「ロード」。初回は NPU 向けのコンパイルに Lunar Lake で約 10 分、Panther Lake で約 2 時間半かかります。
上級者向け:hf download ryugyosoft/Ternary-Bonsai-2-27B-onw で取得したフォルダを onw serve フォルダ で起動できます。
ライセンス
Apache-2.0(元モデルと同じ)。重みは Prism ML の Ternary-Bonsai-2-27B の 2 ビットの値をそのまま並べ直したもので、学習も再量子化もしていません。Created using Bonsai by Prism ML.