HN 日本語サマリー

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

AIは独自の推論ハードウェアを開発できるようになりました

AI is now capable of developing its own inference hardware (github.com)

143 pointsby fsbonetto135 コメント

要約

openTPUは、AI自身がハードウェア設計の限界を探求し、自身の推論を実行するチップを構築できるかという問いに答えるオープンソースのAIアクセラレータです。このプロジェクトは、ハードウェア設計からシミュレータ、コンパイラ、ホストソフトウェアまで、AIアクセラレータの全体像を理解するための学習リソースとしても機能します。FPGAカード上で複数の現代的なAIモデルを効率的に実行し、シミュレータと同等の精度をビット単位で実現しています。

全文翻訳

openTPU AI自身によって開発されたオープンソースのAIアクセラレータです。openTPUは、AIアクセラレータにおけるオートアーキテクチャトーナメントの教訓をもたらします。それは2つの問いを投げかけます:ハードウェア設計においてAIエージェントはどこまで進めるのか、そして自身の推論を実行するチップを構築できるのか? otpu-chatがFPGAカード上でLFM2.5-230Mを実行している様子(左)、otpu-smiがカードの使用率とDRAM帯域幅を表示している様子(右)。openTPUを学ぶ場所も学習プロジェクトです。アクセラレータ全体が1つの小さなモノレポに収まっており、エンドツーエンドで読むことができます:ハードウェア設計(SystemVerilog)、命令セット、ビットエキザクトシミュレータ、カーネル言語とそのコンパイラ、そして実際のPCIeカードを駆動するホストソフトウェアです。AIアクセラレータがどのように機能するか、Pythonでのmatmulからワイヤーレベルまで理解したい場合、これは良い出発点です。 結果 設計は、Inspur YPCB-00338カード(Xilinx Kintex-7 xc7k480t、2つのDDR3チャネル)上で10個の最新モデルを実際の重みで実行し、カードはシミュレータと同じトークンをビット単位で生成します。 測定されたカード上:最初の3つのモデルは2026年9月29日にプロダクションイメージdeploy_champ_e698dcd7で、LFM2-2.6B、SmolLM3-3B、Phi-4-miniは2026年9月30日に、Qwen3.5-2Bと4B、Gemma 4は2026年10月1日にビルドB、deploy_fused133c_79c5707aで、それ以降プロダクションとして稼働しています。ビルドBはe698dcd7よりもLFM2-2.6B、SmolLM3、Phi-4-miniを8-9%高速にデコードします(Gemma 4 E2Bは10%)、DRAMピークの91-94%で、82-87%ではありませんでした。Qwen3.5-4Bのint8イメージは4 GiBを超えます。 イメージ:メインe698dcdは133.33 MHz、すべてのモデルに1つのビットストリームです。メモリコア内の小さなCPUによってキャリブレーションされたLiteDRAMコントローラ、4列のシストリックマトリクスユニット、ストリームエンジン(docs/stream.md)を備えています。DDR3-1066、ピーク帯域幅17.1 GB/sです。 ホスト:カードはopentpu(Intel Core i7-4790)に挿入されています。 方法、ツール/qual/perf.py:デコードは、512トークンのプロンプトの後、64個のグリディートークンです。ホストのargmaxがループに含まれています(ストリーミングなし)。「Device」はアクセラレータが実行するサイクルのみをカウントし、「wall」はホスト時間を加算します。Prefillは512トークンのプロンプトで、デバイス上で行われます。DRAMトラフィックは、カード実行中のカード自身のカウンタからのものです。 Gemma 4 E2Bは、レイヤーごとの埋め込みテーブルをカード上に保持します(3.5-3.6 GiBイメージ;docs/gemma4.md);int8では収まりません。3つのプロンプトで、ヘッドの有無にかかわらずHugging Faceのグリディートークンと一致します。E4Bのテーブル(2.95 GB)はホストに残り、トークンごとに11 KBの行をカードにコピーします;そのイメージは3.96 GiBで、int8でヘッドと最初の24レイヤーのダウンプロジェクションが4ビットです(docs/gemma4_e4b.md)。カード自身のデコードループ(カードが各トークンを選択)では、Gemma 4はより高速にデコードします:E2B 11.01 / 12.73 tok/s(int8 / 4ビットヘッド)、E4B 3.83 tok/s、デバイス上です。すべての構成は、トークンごと、位置ごと、および常駐デコードプログラムでシミュレータとビット単位で一致します。詳細はdocs/board.mdにあります。 カードが実行中にロジットをストリームバックする場合(tools/decode_profile.py、96トークン)、4ビットデコードは高速です。デバイス/ウォール tok/sでは:LFM2: 89.5 / 84.5;Qwen3: 33.7 / 33.3;Qwen3.5: 24.6 / 24.2;LFM2-2.6B: 11.07 / 11.02(ビルドB);SmolLM3-3B: 8.92 / 8.89(ビルドB);Phi-4-mini: 6.69 / 6.67(ビルドB)。 以前のプロダクションイメージse-cand3は、Xilinx MIG、2列マトリクスユニット、120.755 MHzクロックでビルドされました。同じ方法で測定された新しいイメージ:デコード:すべての構成でse-cand3の2.3%以内の精度。デコードはDRAMによってバウンドされ、LiteDRAMはMIGが行ったようにDDR3ピークの82-85%で読み取ります。プリフィル:1.3倍(Qwen3.5)から2.0倍(LFM2 4ビット)高速です。 キャリブレーション:イメージが開始すると、コアのCPUが12秒で両方のDDR3チャネルをキャリブレーションし、ホストの関与はありません。以前のイメージとその数値はdocs/board.mdのセクション5にあります。 Mixture-of-expertsモデルでカードの4 GiBを超えるものは、エキスパートをホストストレージからストリームして実行します(docs/offload.md、セクション10)。カードは各トークンをルーティングし、すべてエキスパートを計算し、DRAMのエキスパートをレイヤごとのスロットに保持します。ホストは、リンクのレートでプールファイルからそれらのスロットに不足しているエキスパートをコピーするだけです(セクション10.1)。 2026年10月1日にビルドB(79c5707a)で測定され、カード自身のデコードループが各トークンを選択し、4ビットエキスパート、int8ヘッド:LFM2.5-8B-A1B(8.5Bパラメータ、1.7Bアクティブ):160トークンで10.6 tok/s。エキスパート使用率の98.5%がスロットにヒットし、トークンあたり5.2 MBがストリームされました。Qwen3.5-35B-A3B(34.7Bパラメータ、3.0Bアクティブ):3.95 tok/s、Hugging Faceの16グリディートークンを使用。エキスパート使用率の62%がヒットし、PCIe経由で1.41 GB/sでトークンあたり153 MBがストリームされました(セクション10.3)。両方ともシミュレータとビット単位で一致します。 4ビット重み(docs/quant.md)は、2レベルブロックスケールを持つFP4値を使用し、重みあたり4.25ビットで、精度のためLMヘッドをint8に保ちます。トークンあたりのバイト数を約3分の1に削減し、デコード速度を40%(Qwen3.5)から45%(Qwen3、LFM2)向上させます。これはdocs/quant.mdがモデルごとに報告するパープレキシティの測定可能なコストを伴います。 ホストはほとんど邪魔になりません。LFM2とQwen3では、カードは一度コンパイルされた1つのデコードプログラムを実行し、レジスタから位置を読み取り、自身の埋め込みとRoPE行をルックアップします。カードがまだ実行中にロジットがストリームバックされます:ホストはomarchyでトークンあたり0.17〜0.30 ms(opentpuで0.45〜1.3 ms)を追加します。Qwen3.5はデコードでも同様の方法で実行されます;そのプリフィルはまだホスト上で各チャンクのプログラムをコンパイルします、カードより先に。 仕組み カーネルはol mlp、attention、フルモデルレイヤーで | @ol.jit 言語 + コンパイラ レイアウト、アフィンループアドレス指定、フュージョン | ISA 1命令あたり8 x 32ビットワード | ISA シミュレータ <======> RTL 同じビット、テストでチェック済み (Python) (SystemVerilog) | Vivadoビットストリーム FPGAカード Kintex-7 xc7k480t | PCIe ホスト otpu-chat, otpu-smi, otpu-lens マシンは意図的にシンプルです。シーケンサは、DMAがデータを移動し、マトリクスユニットがDRAMからストリームされるint8重みを乗算し、ベクトルユニットがfp32演算を行い、クアンタイザが結果をint8に戻す、いくつかのユニットにサイクルごとに1つの命令を発行します。キャッシュや隠れたスケジューリングはありません:すべてのデータ移動が命令なので、トレースはサイクルがどこに行くかを正確に示します。docs/isa.mdは命令セット全体を説明しています。 カーネルは次のようになります: from opentpu import language as ol @ol.jit def mlp(h, gamma, w_gate, w_up, w_down, out, eps): # simplified; see kernels/mlp.py x = ol.load(h) xs = ol.quantize(rmsnorm(x, ol.load(gamma), eps)) g = ol.dot(xs, w_gate) u = ol.dot(xs, w_up) a = ol.all_gather(silu(g) * u) y = ol.all_gather(ol.dot(a, w_down)) if ol.program_id() == 0: ol.store(out, x + y) すべてのデータ移動が命令であるため、実行のトレースはその速度を説明します。Lens、プロファイラは、RTLからの実行を記録し、