ryugyosoft/Qwen3.5-9B-onwx

来源:🤗image-text-to-textapache-2.0激活 9B12 GBother✓ 210 个校验和5 天前更新
或提交种子

Qwen3.5 9B for onwx — 画像も読める 9B を AMD Ryzen AI の NPU で

日本語 | English

Alibaba の Qwen3.5-9B を、onwx 用に変換したものです。onwx は LLM を AMD Ryzen AI の NPU(XDNA2)だけで 動かすアプリで、このリポジトリにはモデルと、このモデル専用の NPU プログラムが入っています(アプリは別にインストールします)。

重みは int4(128 個ごとのスケールと最小値つき)で NPU に載せ、行列計算・DeltaNet・アテンション・LM ヘッドまで 1 トークンの計算をすべて NPU の 32 個の AI エンジンで行います。画像のエンコーダー(ViT)は CPU で動きます。NPU 向けのプログラムはビルド済みなので、PC の上でコンパイルを待つことはありません。

Ryzen AI Max+ 395(Windows)
プロンプトの読み込み 1,000 トークンで約 2.5 秒、4,000 トークンで約 7.7 秒、32,000 トークンで約 82 秒(約 380〜520 tok/s)。CPU も使う設定なら約 2.1 秒 / 6.6 秒 / 74 秒
文章の生成 約 12 tok/s(32K の文脈で約 9 tok/s)、温度 0 なら MTP で 約 15 tok/s
画像 1 枚のエンコード 約 7 秒(CPU、最大 512×512 ピクセル相当、初回は読み込みに約 3 秒)
ダウンロード 7.6 GB
使用メモリ 約 5.8 GB + 文脈 1k トークンあたり約 15 MB(画像を使うと+約 1.7 GB)

(onwx 0.6.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 を使っていると遅くなることがあります)

FastFlowLM との比較

AMD Ryzen AI の NPU で LLM を動かす代表的なアプリ FastFlowLM(FLM)1.0.8 と、FLM 自身の flm bench と同じ測り方で比べました(同じ PC、NPU は performance モード、プロンプト 128〜32K トークン)。生成速度は、 どちらも MTP なし(温度 0 で 1 トークンずつ)の値で条件をそろえ、onwx の MTP を使った値は別に示しています (FLM の Qwen3.5 には MTP がありません)。

点線は、onwx の設定「CPU も使ってプロンプトの読み込みを速くする(消費電力が増えます)」をオンにした値です(既定はオフ)。

  • 512 トークンの回答を書き終えるまでの実効速度は、128〜32K のどの長さでも onwx が上です(MTP なしでも)。
  • プロンプトの読み込みは 2K〜8K で onwx が速く(1K はほぼ同じ)、CPU も使う設定では 16K まで速く、32K でほぼ同じです。
  • 生成はどの長さでも onwx が 3〜4 割速いです。

使い方

  1. onwx(アプリ)を入れます。 Windows はスタートメニューで「PowerShell」を開き、次の 1 行を貼って Enter(Ubuntu は onwx の README の curl ... | bash)。

    irm https://huggingface.co/ryugyosoft/onwx/resolve/main/install.ps1 | iex
    
  2. タスクトレイの赤い onwx アイコンから開く onwx ウィンドウ の「モデル」タブで Qwen3.5 9B を選び、「ダウンロード」を押します(7.6 GB)。

  3. 「サーバー」タブで「ロード」を押します。

  4. 「チャット」ですぐ試せます(画像も貼れます)。他のアプリからは OpenAI 互換 API として使えます(base URL は http://127.0.0.1:8100/v1、画像は image_url の data URL で)。

from openai import OpenAI
c = OpenAI(base_url="http://127.0.0.1:8100/v1", api_key="none")
r = c.chat.completions.create(model="Qwen3.5-9B-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 以上

しくみ

  • 重み:線形層を int4(128 個ごとに bf16 のスケールと最小値)にしています。量子化の前に、入力側を 1024 個ずつアダマール行列とランダムな符号で回転した重み(W·D·H/32)にしてあり、NPU 上でも入力を同じように回転します。回転すると外れ値が散らばり、重みの int4 も、プロンプト処理の int8 の活性化も誤差が小さくなります。さらに GPTQ(較正データで int4 の丸めの誤差を後の列に振り分ける方法)で量子化しているので、形式は同じまま誤差が小さくなっています(NPU の出力と元の bf16 の分布の KL:単純な丸め 0.058 → GPTQ 0.013)。
  • 生成(1 トークンずつ):16 個の AI エンジンが重みを読みながら行列×ベクトルを計算し(int4 を bf16 に直して積和)、8 個が DeltaNet、4 個がアテンションを受け持ちます。
  • プロンプトの読み込み:256 トークン以上は 1,024 / 2,048 トークンずつまとめ、NPU の 32 個の AI エンジン全部で 1 層ずつ処理します。行列計算は行列ユニットのブロック浮動小数点(bfp16)で、int4 の重みはその層を計算する直前に NPU 上で bfp16 に展開します(展開した重みは持ち続けないので、使用メモリの増加は約 0.5 GB)。DeltaNet はチャンク単位の並列形式、アテンションは int8 のキャッシュを読むフラッシュアテンションで、途中の値は層の間も NPU のメモリに置いたままです。短いプロンプトと端数は従来どおり 128 / 32 トークンずつの経路で読みます。1 トークンずつ読んだ場合との差は、出力の分布の KL で 0.002 程度です。
  • MTP(先読み):Qwen3.5 が持つ MTP 層で次のトークンを予想し、本体が 2 トークン分をまとめて確かめます(当たれば 1 回で 2 トークン進みます)。結果は 1 トークンずつ生成したときとまったく同じです。温度 0(API の既定)のときだけ使い、チャット画面の既定のサンプリング(温度 0.7)では通常どおり 1 トークンずつ生成します。環境変数 ONWX_MTP=0 で止められます。
  • 画像:Qwen3.5 の ViT(27 層)を numpy で CPU 上で動かし、2×2 パッチごとに 1 トークンとして言語モデルに入れます(位置は MRoPE)。縦横比は保ったまま、最大で 512×512 ピクセル相当(256 トークン)に縮めます。
  • キャッシュ:アテンションのキーと値は、ヘッドごとにアダマール行列で回転してから int8 で持ちます(0.3.0 の bf16 の半分のメモリ。出力の分布への影響は KL 0.0003 程度)。
  • 文脈:最大 262144 トークン(モデルの上限)。
  • 思考モードとツール呼び出しに対応しています。動画は読めません。

ファイル

ファイル 中身
blobs/L*.wgt 各層の重み(int4、NPU が読む並び)
blobs/L*.st / L*.pf DeltaNet 層の状態の初期値・畳み込みの重み/プロンプト用の密行列
blobs/head.wgt LM ヘッド(int4)
embed.bf16 単語の埋め込み(bf16、元のまま)
vision.npz 画像エンコーダーの重み(bf16、元のまま)
plans/ NPU プログラム(xclbin と命令列:生成用・プロンプト用(pfx/ が 1,024 / 2,048 トークンの新方式、128 / 32 トークン)・MTP の確認用)
mtp_norms.npz、mtp_vocab.npy MTP 層の正規化の重みと、予想に使う語彙
xdna.json、engine.json プログラムとモデルの設定
tokenizer.json ほか 元のモデルのトークナイザーとチャットテンプレート

ライセンス

元のモデルと同じ Apache-2.0 です(LICENSE)。モデルの重みは Qwen/Qwen3.5-9B に由来します。