llm-jp-4.1 8B thinking for onwx — 日本語に強い 8B を AMD Ryzen AI の NPU で
日本語 | English
国立情報学研究所 大規模言語モデル研究開発センターの llm-jp-4.1-8b-thinking を、onwx 用に変換したものです。onwx は LLM を AMD Ryzen AI の NPU(XDNA2)だけで 動かすアプリで、このリポジトリにはモデルと、このモデル専用の NPU プログラムが入っています(アプリは別にインストールします)。
重みは int4(128 個ごとのスケールと最小値つき)で NPU に載せ、行列計算・アテンション・LM ヘッドまで 1 トークンの計算をすべて NPU の 32 個の AI エンジンで行います。NPU 向けのプログラムはビルド済みなので、PC の上でコンパイルを待つことはありません。
|
Ryzen AI Max+ 395(Windows) |
| プロンプトの読み込み |
1,000 トークンで約 6.3 秒、4,000 トークンで約 13 秒(応答開始まで。0.3.0 の 2〜7 倍) |
| 文章の生成 |
約 11 tok/s |
| ダウンロード |
5.8 GB |
| 使用メモリ |
約 4.8 GB + 文脈 1k トークンあたり約 65 MB |
(onwx 0.4.0、Ryzen AI Max+ 395(Windows)で NPU の電力モードを performance にして測定。Ryzen AI 300 シリーズ(HX 370 など)も NPU は同じ 32 個の AI エンジンで、同じ方式で動きます。標準の電力モードでは NPU のクロックが下がって 2 割ほど遅くなります。電力モードは管理者の PowerShell で C:\Windows\System32\AMD\xrt-smi.exe configure --pmode performance。Windows の Copilot+ の AI 機能が NPU を使っていると遅くなることがあります)
使い方
- onwx(アプリ、0.2.2 以降)を入れます。 Windows はスタートメニューで「PowerShell」を開き、次の 1 行を貼って Enter(Ubuntu は onwx の README の
curl ... | bash)。
powershell
irm https://huggingface.co/ryugyosoft/onwx/resolve/main/install.ps1 | iex
- タスクトレイの赤い onwx アイコンから開く onwx ウィンドウ の「モデル」タブで llm-jp-4.1 8B thinking を選び、「ダウンロード」を押します(5.8 GB)。
- 「サーバー」タブで「ロード」を押します。
- 「チャット」ですぐ試せます。他のアプリからは OpenAI 互換 API として使えます(base URL は
http://127.0.0.1:8100/v1)。
from openai import OpenAI
c = OpenAI(base_url="http://127.0.0.1:8100/v1", api_key="none")
r = c.chat.completions.create(model="llm-jp-4.1-8b-onwx", messages=[{"role": "user", "content": "こんにちは"}])
print(r.choices[0].message.content)
動く PC
- XDNA2 NPU の AMD Ryzen AI:Ryzen AI 300 シリーズ(Strix Point、例:Ryzen AI 9 HX 370)、Ryzen AI Max シリーズ(Strix Halo)
- Windows 11 と AMD の NPU ドライバー(32.0.203 以降で確認)。Ubuntu は試験的(amdxdna ドライバーと XRT が必要)
- メモリ 16 GB 以上
しくみ
- モデル:Llama 型の 8B(32 層すべてアテンション、クエリ 32 ヘッド・キー/バリュー 8 ヘッド、ヘッド幅 128)。いつも考えてから答えるモデルで、考えた部分(analysis チャンネル)と答え(final チャンネル)は onwx が分けて扱います。
- 重み:線形層を int4(128 個ごとに bf16 のスケールと最小値)にしています。量子化の前に、入力側を 1024 個ずつアダマール行列とランダムな符号で回転した重み(W·D·H/32)にしてあり、NPU 上でも入力を同じように回転します。回転すると外れ値が散らばり、重みの int4 も、プロンプト処理の int8 の活性化も誤差が小さくなります。さらに GPTQ(較正データで int4 の丸めの誤差を後の列に振り分ける方法)で量子化しているので、形式は同じまま誤差が小さくなっています(NPU の出力と元の bf16 の分布の KL:単純な丸め 0.26 → GPTQ 0.012)。
- 生成(1 トークンずつ):16 個の AI エンジンが重みを読みながら行列×ベクトルを計算し(int4 を bf16 に直して積和)、4 個がアテンションを受け持ちます。
- プロンプトの読み込み:32 トークン以上は 1,024 / 2,048 トークンずつまとめ、NPU の 32 個の AI エンジン全部で 1 層ずつ処理します。行列計算は行列ユニットのブロック浮動小数点(bfp16)で、int4 の重みはその層を計算する直前に NPU 上で bfp16 に展開します(展開した重みは持ち続けないので、使用メモリの増加は約 0.5 GB)。アテンションは int8 のキャッシュを読むフラッシュアテンションで、途中の値は層の間も NPU のメモリに置いたままです。32 トークンに満たない端数は 1 トークンずつ読みます。1 トークンずつ読んだ場合との差は、出力の分布の KL で 0.002 程度です。
- キャッシュ:アテンションのキーと値は、ヘッドごとにアダマール行列で回転してから int8 で持ちます(0.3.0 の bf16 の半分のメモリ。出力の分布への影響は KL 0.0003 程度)。
- 文脈:最大 65536 トークン(モデルの上限)。キー・値のヘッドが多いので、長い文脈ほどメモリを使います(64k トークンで約 9 GB)。
ファイル
| ファイル |
中身 |
blobs/L*.wgt |
各層の重み(int4、NPU が読む並び) |
blobs/head.wgt |
LM ヘッド(int4) |
embed.bf16 |
単語の埋め込み(bf16、元のまま) |
plans/ |
NPU プログラム(xclbin と命令列:生成用・プロンプト用(pfx/)) |
xdna.json、engine.json |
プログラムとモデルの設定 |
tokenizer.json ほか |
元のモデルのトークナイザーとチャットテンプレート |
ライセンス
元のモデルと同じ Apache-2.0 です。モデルの重みは llm-jp/llm-jp-4.1-8b-thinking に由来します。