HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Qwenputer: Qwen3.5内に動作する決定論的なRISC-V CPU

Qwenputer: A functioning, deterministic RISC-V CPU inside Qwen3.5 (divagr.com)

76 pointsby csmantle15 コメント

要約

研究者は、言語モデルの重み内にRISC-V CPUをコンパイルし、モデル自身のGated DeltaNet層をRAMとして使用する実験的なモデル「Qwenputer」を開発しました。このCPUは外部ランタイムなしで動作し、算術演算やC、MicroPythonコードを実行できます。これにより、モデルの推論能力とメモリ管理の新たな可能性が示唆されています。

全文翻訳

Qwenputer: Qwen3.5内に完全に機能する決定論的なRISC-V CPU

← 私の執筆

COMPILED WEIGHTS

A stock Qwen 3.5 4B with a RISC-V CPU compiled into its weights, running on its own Gated DeltaNet layers as RAM.

シリコンではないと信じがたい

Qwenputerは非常に面白い実験モデルです。これは、標準的なQwen 3.5 4Bに、モデル自身のGated DeltaNetアテンション層をRAMとして使用するRISC-V CPUを重み内に組み込んだものです。(GDNの仕組みについては、こちらの便利なガイドをご覧ください。)この「CPU」は、モデルのフォワードパス内で完全に動作し、外部ランタイムやツールを一切使用せずに算術演算、C、MicroPythonコードを実行できます。

誤解のないように言っておきますが、これはプラグイン、ツール、またはサンドボックスではありません。このブログでは、このモデルがどのように機能するか、モデルがGDN層をRAMとしてどのように利用するか、そして実験的なインモデルファイルストレージをどのように組み込んだかを正確に説明します。

また、Qwenputerを基盤とした2つのフォローアップ記事も執筆しました。それは、ハイブリッドモデルがどのように推論をRNN状態に隠してCoT監視を回避できるか、そしてこのようなコンパイル済み重みが、モデル自体が改ざんできない組み込み監視ツールとしてどのように機能するかです。

[画像: Qwenが自身の重み内のRISC-V CPUに掛け算を渡す様子。CPUのRAMはGated DeltaNetの状態]

Qwen hands a multiplication to the RISC-V CPU inside its own weights; the CPU's RAM is Gated DeltaNet state

Qwenputerは、Hugging FaceまたはModelScopeから入手でき、コードはGitHubで公開されています。

Qwen3.5内のRNNは正確なRAMになり得る

Qwen-NextとQwen 3.5(Qwenputerの基盤となっているモデル)は、非常に巧妙なトリックを使用しています。モデルのアテンション層のうち3つ(4つのうち)は、アテンションメカニズムとしてGated DeltaNet(線形RNN)を使用しています(詳細はこちら)。各ヘッドは状態行列を保持し、デルタルールがこれを更新します。

さて、ここからが面白い実験の始まりです。ゲートを1に設定し1、書き込み強度(ベータ)を1にすると2、そしてワンホットキーエンコーディングを使用すると3、実行する各書き込みは正確に1つの行を上書きし、各ワンホットクエリは正確な値を取得できます。これは、GDN層自体がRAMとして機能できることを意味します。通常の注意機構をRAMとして使用するよりもはるかに低コストです。なぜなら、GDNヘッドの状態は会話の長さに関係なく一定サイズを保つのに対し、アテンションのKVキャッシュはそうではないからです。

[画像: RAMとして使用されるGated DeltaNetの状態。ワンホットキーが1行を上書きし、ワンホットクエリがそれを読み戻し、CPUはその行にレジスタ、メモリ、プログラムカウンタを保持]

Gated DeltaNet state used as RAM: a one-hot key overwrites one row, a one-hot query reads it back, and the CPU keeps its registers, memory and program counter in those rows

デルタルールがメモリとして機能するという考えは新しいものではありません。Schlagらは(2021年)線形アテンションがデルタルールで連想メモリ、または「高速重み」として機能することを示しました4。新しい点は、これをプロダクションモデル内で、CPU全体を実行できるほど正確かつアドレス可能にすることです。

これが、このモデル全体が構築されている基盤です。現状では、デフォルトのQwen 3.5はGDNに正確な値を保持しません。この変更により、この実験の次の部分がアンロックされます。

レイヤーへのコンピュータのコンパイル

完全に機能し、安価で高速なRAMができたので、動作するCPUをモデルの重みにコンパイルできます。幸いなことに、トレーニングは不要です。コンパイラがすべての重みを直接設定します。CPUを回路として記述します。「このレジスタを読み取る」、「これらの2つの数値を加算する」、「ゼロならジャンプする」といった一連の小さなステップのリストであり、コンパイラは各ステップをトランスフォーマーレイヤーの一部に変換します。アテンションヘッドがルックアップを行い、フィードフォワードユニットが算術演算を行い、DeltaNetヘッドがRAMを保持します。CPUはモデルがデコードする際に実行されます。

各命令は数個の生成されたトークンになります。1つ目は書き込むメモリ行(ADDR)の名前、次は値(VAL)、そしてSTEPトークンが命令を終了します。これらのトークンはCPUの実行トレースであり、Qwenがそれらを生成している間、CPUは実際に実行されています。

CPU

CPUは32ビットRISC-Vコア(RV32IM、Zba拡張および小規模なビッグナムユニット付き)で、Qwenの32レイヤーの前に11レイヤーを占めます。現状では、公式のriscv-testsに合格しており、プログラムはqemuと一致し、エラーなしで1800万命令を連続実行しています5。

このCPUは、フォワードパスでCおよびMicroPythonコードもかなりうまく(ただし、少し遅く)実行できます。まだLinuxクラスのチップではありませんが、RV32IM命令セット全体を実装しています。

Qwenはどのように使用するか

Qwen 3.5 4Bは、ポストトレーニングなしで、このCPUを非常にうまく使用できます。CPUは完全に内部で使用され、外部ツール呼び出しを通じて呼び出されることはありません。

モデルがこれを確実に使用できるようにするために、簡単な方法を選択しました。モデルがよくトレーニングされているツール呼び出し形式に便乗させることで、QwenはCPUに命令を送信し、結果を読み取ります。外部ツール呼び出しやランタイムは一切使用しません。 CPUが命令を受信すると、コンピューターレイヤーが実行され、ツールの応答が書き込まれます。RvChatという小さなドライバーを使用してファームウェアをGDN状態にロードし、これによりトレーストークンがQwenのレイヤーから除外されます。

Qwenの元の重みはそのままです。コンピューターの重みは、追加の次元とレイヤーとしてそれらの上に重ねられます。

機能するか?

私の延々と続く ranting を読んだ後、皆さんの心にある主な疑問は、「これは実際に機能するのか?」でしょう。

[画像: NUPAおよびDeepMind算術セットにおける、ベースQwen3.5-4B、Qwenputer、およびPythonツール付きベースQwenの精度]

Accuracy of base Qwen3.5-4B, Qwenputer and base Qwen with a Python tool on NUPA and DeepMind arithmetic sets

DeepMindセットでは:

  • div_big: Qwenputerは97.5%を記録し、Qwen 3.5 4BにPythonツールを与えた場合は95%、ベースQwenは72.5%でした。
  • mul_big: Qwenputerは97.5%を記録し、Pythonツール使用時は100%、ベースQwenは55%でした。
  • mul_div_multiple_longer: Qwenputerは100%を記録し、Pythonツール使用時は97.5%、ベースQwenは90%でした。
  • add_or_sub_big: Qwenputerは97.5%を記録し、Pythonツール使用時と同じで、ベースQwenは87.5%でした。

NUPAの長整数算術では、Qwenputerは48.6%から100%に向上し、Pythonツールを与えた場合と同じ結果です。

CPUが出力する数値も正確です。約230,000の出力位置をリファレンスマシンで再現したところ、不一致はゼロでした。また、CPUをQwenに組み込んでも、会話の仕方は変わりません。通常のテキストはベースQwenのノイズ範囲内(ノイズフロア5e-4に対してKL 6e-4)に収まっています。

ハードドライブ? この経済状況で?

言語モデル内にCPUがあるだけでは不十分だと考えたため、ファイルシステムも搭載するのが賢明だと判断しました。

すでに機能するRAMがあるので、これはほとんど些細なことでした。モデル側では、内部のput / append / get / list / delete操作を介して公開されます。ここでも、実際のツール呼び出しはありません。 Qwenがファイルを「保存」すると、コンパイルされたレイヤーは、その名前をディレクトリの1,024個のスロットの1つにハッシュ化してDeltaNet状態に格納し、テキスト自体を他のヘッドに、8トークンごとに1行として、チェーンでつなげて格納します。2つの名前が同じスロットに収まるシナリオでは、次のスロットをチェックするだけです。ファイルを再度見つけるには、スキャンではなく約2〜3ステップかかり、最大512ファイルを保持でき、これは約53,000トークンのテキストに相当します。

面白いのは、これがかなり永続的であることです。会話の最後に状態を保存し、次の会話にロードしても、ファイルはそのまま残っています。このファイルシステムを使用すると、Qwenはチャット間で変更された事実を90%の確率で正しく取得できます。古いチャットを貼り付けた場合は30%ですが、Pythonで実行されるメモリツールをQwenに与えるのと同等です(83.3%対78.9%)。これはまだ実験的であり、コードはrv-storeブランチにあり、モデルはHugging FaceとModelScopeにあります。

限界と今後の展望

Qwenputerは非常に実験的なものであり、いくつかの限界があります。追加レイヤーとより広い隠しサイズにより、チェックポイントはベースQwenの約2倍の18.8 GBになりますが、そのほとんどはゼロパディングです。また、ファームウェアを起動し、トレーストークンをQwenのレイヤーから除外するために小さなドライバー(RvChat)が必要なため、プレーンなgenerate()呼び出しではまだ実行できません。また、CPU命令ごとに数個のデコードされたトークンが必要なため、大きな計算にはミリ秒ではなく数秒かかるため、少し遅いです。ベンチマークに使用したバッチ実行子は、L4で毎秒約3,200 CPUトークンを実行します。

次に、QwenがPythonを書き、calcと同じ方法で動作するpython()ツールを介して、自身の重み内のMicroPythonでそれを実行させたいと考えています。CPUを高速化することも大きな課題です。

算術を超えて

RNNレイヤーの正確な制御は、算術演算以外にも多くの用途があります。また、QwenputerはAI安全研究のための非常に優れたテストベッドとなり、2つのフォローアップ記事を執筆しました。それは、Qwen 3.5のようなハイブリッドモデルがどのように推論をRNN状態に隠してCoT監視を回避できるか、そしてコンパイル済み重みがどのように監視ツールとして機能するかです。これは、モデルがオフにできない重み内監視や、解釈可能性のための回答キーのようなものです。

試してみる

自分で試したい場合は、モデルは単一の24 GB GPUで実行できます。uvとHugging Face CLIが必要です。計算のためにツールサーバーやPythonサンドボックスは必要ありません。CPUはモデル内で計算を実行します。

git clone https://github.com/divagr18/qwenputer && cd qwenputer/experimental/riscv && uv sync --extra hf
hf download divagr1925/Qwen3.5-4B-Qwenputer --local-dir qwenputer-rv
uv run python -m chipformer.rv.chat qwenputer-rv --firmware tests/data/rv/calc-bridge.elf \
    --ask "Use calc: what is 123456789 * 987654321?"

すべてオープンです。コードはGitHubにあり、両方のモデルはHugging Face(Qwenputer、Filesystem)とModelScope(Qwenputer、Filesystem)で公開されています。

仕事でこれを使用する場合は、次のように引用できます。

@software{agrawal2026qwenputer,
  author  = {Agrawal, Divyansh},
  title   = {{Qwenputer}: a computer compiled into the weights of a pretrained language model},
  year    = {2026},
  url     = {https://github.com/divagr18/qwenputer}
}

注釈

  1. 各Gated DeltaNetヘッドは状態行列、つまりメモリを保持します。各トークンで、新しいものを書き込む前に、状態全体をゲート(0から1の間の数値)で乗算します。これがRNNが忘れる仕組みです。ゲートが0.9の場合、保存されているすべてが各トークンで少しずつフェードアウトし、ゲートが1の場合は何もフェードアウトしません。↩
  2. ゲートの後、ヘッドは状態の一方向を新しい値に向かって微調整し、書き込み強度ベータがその距離を設定します。ベータが1の場合、その方向の古い値はブレンドされるのではなく完全に置き換えられます。↩
  3. ワンホットキーは、単一の1を持つゼロのベクトルであり、状態の正確に1つの行を指します。これはメモリアドレスが1つのセルを指す方法と同様です。↩
  4. Imanol Schlag, Kazuki Irie and Jürgen Schmidhuber, "Linear Transformers Are Secretly Fast Weight Programmers", ICML 2021. ↩
  5. Free-runningとは、CPUがリファレンスマシンにステップごとに修正されることなく、自身の出力で継続して実行されることを意味します。↩