ryugyosoft/Qwen3.6-35B-A3B-onwx

来源:🤗image-text-to-textapache-2.0激活 3B21 GBother✓ 169 个校验和4 天前更新
或提交种子

Qwen3.6 35B-A3B for onwx — 35B の MoE を AMD Ryzen AI の NPU で(画像も読めます)

日本語 | English

Alibaba Cloud の Qwen3.6-35B-A3B(256 個のエキスパートを持つ MoE。全体 35B、1 トークンの計算は 3B 分)を、onwx 用に変換したものです。onwx は LLM を AMD Ryzen AI の NPU(XDNA2)だけで 動かすアプリで、このリポジトリにはモデルと、このモデル専用の NPU プログラムが入っています(アプリは別にインストールします。onwx 0.8.0 以降)。

重みは int4 で、DeltaNet・アテンション・エキスパートを選ぶルーター・エキスパート・LM ヘッドまで、1 トークンの計算をすべて NPU の 32 個の AI エンジンで行います(CPU はルーターが絞った 16 候補から上位 8 個を正確に選び直すだけ)。NPU 向けのプログラムはビルド済みなので、PC の上でコンパイルを待つことはありません。

Ryzen AI Max+ 395(Windows)
プロンプトの読み込み 約 3.1 秒 / 約 9.3 秒(1,000 / 4,000 トークン。8,000 トークンで約 19 秒、32,000 トークンで約 93 秒)
文章の生成 約 20 tok/s(温度 0 なら MTP で約 23 tok/s)
画像 1 枚のエンコード 約 2.4〜4.9 秒(CPU、384×288 ピクセルの画像。初回は読み込みに約 2.5 秒)
ダウンロード 20.8 GB
使用メモリ 約 20.2 GB + 文脈 1k トークンあたり約 24 MB(画像を使うと+約 1.8 GB)。エキスパートを SSD から読むと約 7 GB〜(下の「メモリが少ない PC では」)
ロード 約 6 秒(2 回目以降。初回はディスクから約 20 GB を読みます。コンパイルなし)

(onwx 0.9.0、Ryzen AI Max+ 395(Windows、メモリ 128 GB)で NPU の電力モードを performance にして測定。電力モードは管理者の PowerShell で C:\Windows\System32\AMD\xrt-smi.exe configure --pmode performance。標準の電力モードでは NPU のクロックが下がって遅くなります。Ubuntu(Linux)でも同じプログラムが動くことを確認しています。Windows の Copilot+ の AI 機能が NPU を使っていると遅くなることがあります)

FastFlowLM との比較

同じ PC で、AMD Ryzen AI の NPU 向けの代表的なアプリ FastFlowLM(FLM)1.0.8 の同じモデル(qwen3.6-moe:35b-a3b)と比べました。プロンプトは flm bench と同じ文章で、プロンプトを読み終わるまでの時間(TTFT)です。

プロンプト 1K 2K 4K 8K 16K 32K
FLM 1.0.8 10.2 秒 13.5 秒 18.4 秒 27.7 秒 49.0 秒 97.9 秒
onwx 0.8.0 3.1 秒 4.6 秒 9.3 秒 19.2 秒 40.8 秒 92.7 秒

生成は短い文脈で FLM 15.6 tok/s、onwx 20.7 tok/s(MTP なし)です。

使い方

  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.6 35B-A3B を選び、「ダウンロード」を押します(20.8 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.6-35B-A3B-onwx", messages=[{"role": "user", "content": "こんにちは"}])
print(r.choices[0].message.content)

動く PC

  • XDNA2 NPU の AMD Ryzen AI:Ryzen AI Max シリーズ(Strix Halo、例:Ryzen AI Max+ 395)、Ryzen AI 300 シリーズ(Strix Point、例:Ryzen AI 9 HX 370)
  • Windows 11 と AMD の NPU ドライバー(32.0.203 以降で確認)。Ubuntu は試験的(amdxdna ドライバーと XRT が必要)
  • メモリ:すべてメモリに置くと約 20 GB。足りない PC ではエキスパートを SSD から読みます(下記。16 GB の PC でも動く見込みですが未確認。Ryzen AI Max+ 395 / 128 GB で確認)
  • プロンプトの読み込みの合間の処理を CPU で行うので、AVX-512 が必要です(Ryzen AI 300 / Max は対応)

しくみ

  • 重み:int4(128 個の入力ごとに bf16 のスケールと最小値)。行列ごとに入力側を 1,024 個ずつアダマール行列とランダムな符号で回転してから量子化し(エキスパートの出力側の行列は 512 個ずつ)、NPU 上でも入力を同じように回転してから掛けます。1 層のエキスパートの重みは 257 個(256 +共有の 1 個)が並んだひとつの領域にあり、NPU が読む順に並べ替えてあります。
  • 生成(1 トークンずつ):層ごとに、DeltaNet(30 層)かアテンション(10 層)の計算と、ルーター(int4、NPU)をひとつの NPU プログラムで行います。ルーターの値から CPU が 16 候補を取り、その 16 個だけ正確(fp32)に計算し直して上位 8 個と重みを決め、次の NPU プログラム(MoE)の重みの読み出し先を、選ばれたエキスパートに書き換えます(命令列の該当する語だけを差し替えるので、コンパイルは不要)。MoE は 2 エキスパートずつ、16 個の AI エンジンが重みを読みながら計算します。元のモデルを CPU(fp32)で計算した参照との差は、出力の分布の KL で 0.004(最も確率の高いトークンは同じ)です。
  • プロンプトの読み込み:1,024 / 2,048 トークンずつ、NPU の 32 個の AI エンジン全部で 1 層ずつ計算します。DeltaNet・アテンション・行列計算は Qwen3.5 用のプログラムを隠れ層 2,048 に合わせたもので、ルーターは CPU で計算します。トークンを選ばれたエキスパートごとに 64 個ずつ集め、int4 の重みのまま(展開せずに)bfp16 の行列ユニットで掛けます。参照との差は KL で 0.004 です。
  • MTP(先読み):温度 0(API の既定)のとき、モデルの MTP 層で次のトークンを予想し、2 トークンをまとめて検証する別の NPU プログラムで確かめます(2 トークンが選んだエキスパートの和集合を 1 回で読みます)。連続する 2 トークンのエキスパートはほとんど重ならないので検証が重く、効果は平均で約 1 割(コードの生成で約 15%)です。予想が当たりにくい応答では、途中から自動で 1 トークンずつの生成に戻ります。文脈が 8K トークンを超えると使いません。出力は 1 トークンずつ生成したときとほぼ同じです(エキスパートを足す順序が違うので、ほぼ同点の候補のところで分かれることがあります)。
  • キャッシュ:アテンションのキーと値は、ヘッドごとにアダマール行列で回転してから int8 で持ちます。
  • 文脈:最大 262144 トークン(モデルの上限)。長いほど遅くなります。
  • 画像:Qwen3.6 の ViT(27 層、幅 1152。Qwen3.5 と同じ構造)を numpy で CPU 上で動かし、2×2 パッチごとに 1 トークンとして言語モデルに入れます(位置は MRoPE)。最大で 512×512 ピクセル相当に縮めます。画像を含むプロンプトは今のところ 1 トークンずつ読みます(135 トークンで約 6 秒)。
  • 思考モードとツール呼び出しに対応しています。動画は読めません。

メモリが少ない PC では(エキスパートを SSD から)

onwx の設定「MoE のエキスパートのメモリ」で、エキスパートの重みをメモリに置く量を選べます(既定の「自動」は、モデル全体がメモリの 7 割に収まればすべてメモリに置き、収まらなければ残りの分だけ)。足りない分は SSD のモデルファイルから、ルーターが選んだものだけを OS のファイルキャッシュを通さずに読み、最近使ったものをメモリに残します(次の層で使いそうなものは先読みします)。

エキスパートのメモリ 使用メモリ(全体) 生成 プロンプト 1,000 / 4,000 トークン
すべて(17 GB) 約 20 GB 約 20 tok/s 約 3.1 / 9.3 秒
4 GB 約 7 GB 約 15 tok/s 約 3.5 / 10.2 秒

(Ryzen AI Max+ 395 の内蔵 NVMe SSD で測定。SSD が遅いと生成も遅くなります。回答はすべてメモリの場合と同じです)

ファイル

ファイル 中身
blobs/L*.wgt 各層の重み(int4、NPU が読む並び。エキスパート 257 個・ルーター・DeltaNet / アテンション)
blobs/L*.st、blobs/L*.host.npz DeltaNet 層の状態の初期値・畳み込みの重み、CPU 側のルーター(fp32)
blobs/head.wgt、embed.bf16 LM ヘッド・単語の埋め込み
vision.npz 画像エンコーダーの重み(bf16、元のまま)
blobs/mtp.wgt、fc.wgt、dhead.wgt、mtp.host.npz、mtp_*.np* MTP 層(先読み用)
plans/ NPU プログラム(xclbin と命令列:生成用(final.xclbin)、2 トークン検証用(ver.xclbin)、プロンプト用(pfx/))
xdna.json、engine.json プログラムとモデルの設定
tokenizer.json ほか 元のモデルのトークナイザーとチャットテンプレート

ライセンス

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