
2026/10/07 1:23
OpenTPU – AI から開発されたオープンソース AI アクセラレータ
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
元のサマリーは強固ですが、キーポイントリストの粒度をより良く反映するために、特定のハードウェア制約、ツール名、およびビルドの区別を統合することで改善できます。以下が改訂版です:
改善されたサマリー: OpenTPU は、ユーザーが独自の推論ハードウェアを設計し、Intel Core i7 などのホストシステムに PCIe を介して接続された Xilinx Kintex-7 FPGA(具体的には xc7k480t)上にモデルを実行することを可能にするオープンソースの AI アクセラレーターです。包括的なモノリポに含まれており、SystemVerilog デザイン、命令セット、ビット正確なシミュレータ、カーネル言語、コンパイラ、ホストソフトウェアを含み、キャッシュレスアーキテクチャを構築するための重要な教育資源として機能します。该系统は Inspur YPCB-00338 カード上でハードウェアとシミュレータ間のビット正確なトークン一致を実現しており、これらのカードは 2 つの DDR3 チャンネル(ピーク 17.1 GB/s)を有し、キャッシュなしで 133.33 MHz で動作します。データの移動は明示的であり、
opentpu-lens などのツールを用いて正確な追跡を可能にします。プロダクションイメージでのベンチマークでは、LFM2.5-230M は 82–85% の DRAM 利用率で 85.8 tok/s を達成しました。ビルド B における戦略的な最適化により、FP4 量子化ウェイトと int8 ヘッドを利用することでトークンあたりのバイト数を大幅に削減し、DRAM 使用率を 91–94% に引き上げ、速度をさらに 8–9% 向上させ(総体的には最大で 40–45% の改善)、このアーキテクチャはオンボードメモリの制限に依存せず、PCIe レートで不活性なエクスパートをストレージからストリーミングすることで大規模なミクセル・オブ・エキスパートモデルをサポートします。主要なコマンドラインツールには、推論用の otpu-chat、モニタリング用の otpu-smi、検証用の otpu-selftest が含まれます。今後の作業では、現在の DRAM 利用率の制限を超え、安定性のためにタイミングマージンを最適化する予定です。本文
openTPU:オープンソース AI アクセラレータ
Google が開発したオープンソースの AI アクセルレーター「openTPU」は、ハードウェア設計における AI エージェントの可能性を探求しています。このプロジェクトは、以下の 2 つの核心的な問いを追求しています。
- ハードウェア設計において、AI エージェントがどこまで到達できるか?
- 彼らが自身の推論を実行するチップ自体を構築できるか?
学習の場としての openTPU
openTPU は、エンドツーエンドで読み込める単一の小さなモノリポジトリとして設計されており、学習プロジェクトとしても機能します。
構成要素
以下のすべてが含まれています。
- ハードウェア設計: SystemVerilog (SystemVerilog)
- 命令セットおよびコンパイラ: カーネル言語とコンパイル処理を含む
- シミュレーター: ビット単位で正確な動作を確認可能
- ホストソフトウェア: 実在する PCIe カードを制御
学習方法
AI アクセラレータの仕組み(Python の行列積計算から配線まで)を理解したい場合は、ここから始めるのが最適です。
ベンチマーク結果
Inspur YPCB-00338 カード(Xilinx Kintex-7 xc7k480t, DDR3 2 チャンネル)上で、10 の現代型モデルを実際の重み付きで動作させています。カードの生成するトークンは、シミュレーターの結果もビット単位で完全に一致します。
デコード・ベンチマーク表
| モデル | 重みの形式 | Decode (Device) [トークン/秒] | Decode (Wall) [トークン/秒] | Prefill (Device) [トークン/秒] | DRAM バンドウィスド [GB/s] |
|---|---|---|---|---|---|
| LFM2.5-230M | int8 | 59.0 | 52.3 | 295.6 | 14.5 (ピークの 85%) |
| LFM2.5-230M | 4 bit、int8 ヘッダー | 85.8 | 82.1 | 335.4 | 14.1 (ピークの 82%) |
| Qwen3-0.6B | int8 | 21.6 | 21.3 | 92.1 | 14.4 (ピークの 84%) |
| Qwen3-0.6B | 4 bit、int8 ヘッダー | 31.3 | 30.7 | 103.4 | 13.9 (ピークの 82%) |
| Qwen3.5-0.8B | int8 | 17.6 | 16.3 | 61.4 | 14.5 (ピークの 85%) |
| Qwen3.5-0.8B | 4 bit、int8 ヘッダー | 24.5 | 23.3 | 66.7 | 14.1 (ピークの 83%) |
| Gemma 4 E2B | 4 bit、int8 ヘッダー | 10.57 | 10.53 | 32.1 | 15.6 (ピークの 92%) |
| Gemma 4 E2B | 4 bit、4 bit ヘッダー | 12.14 | 12.09 | 29.9 | 15.5 (ピークの 91%) |
| LFM2-2.6B | int8 | 6.05 | 6.03 | 21.4 | 16.1 (ピークの 94%) |
| LFM2-2.6B | 4 bit、int8 ヘッダー | 10.96 | 10.93 | 20.6 | 15.8 (ピークの 93%) |
| SmolLM3-3B | int8 | 5.00 | 4.99 | 21.1 | 16.0 (ピークの 94%) |
| SmolLM3-3B | 4 bit、int8 ヘッダー | 8.74 | 8.72 | 22.8 | 15.7 (ピークの 92%) |
| Phi-4-mini (3.8B) | int8 | 3.99 | 3.98 | 13.8 | 16.0 (ピークの 94%) |
| Phi-4-mini (3.8B) | 4 bit、int8 ヘッダー | 6.56 | 6.55 | 15.0 | 15.8 (ピークの 92%) |
| Qwen3.5-2B | int8 | 8.02 | 8.00 | 38.2 | 16.0 (ピークの 94%) |
| Qwen3.5-2B | 4 bit、int8 ヘッダー | 12.09 | 12.03 | 41.7 | 15.8 (ピークの 92%) |
| Qwen3.5-4B | 4 bit、int8 ヘッダー | 5.88 | 5.87 | 12.9 | 15.7 (ピークの 92%) |
| Gemma 4 E4B | int8/4bit、第 0〜23 レイヤー | 3.78 | 3.75 | 14.8 | 16.0 (ピークの 94%) |
注: 測定条件は各ビルドの日付(2026 年 9 月 29 日〜10 月 1 日)とプロダクションイメージ(
など)に基づいています。 ビルドの改良点: ビルド B は、LFM2-2.6B および Phi-4-mini のデコードを8〜9% スピードアップし、DRAM ピーク性能も 82〜87% から**91〜94%**に改善しました。deploy_champ_e698dcd7
ハードウェア仕様
- イメージ: メインイメージ
は 133.33 MHz で動作。メモリコア内の CPU が LiteDRAM コントローラーを較正し、4 コラム式システミック行列ユニットおよびストリームエンジン(docs/stream.md)を備えています。DDR3-1066 を使用し、ピーク性能は 17.1 GB/s です。e698dcd - ホスト: カードは Intel Core i7-4790 搭載の opentpu 内に搭載されています。
手法と詳細
- 手法: デコードは、512 トークンのプロンプト後に 64 グリディ tokens を生成し、ホスト側で argmax ループを行います(Stream 化されていません)。
- DRAM トラフィック: カード自身のカウンターから取得。
- Gemma 4 E2B: レイヤーごとの埋め込みテーブルをカード上保持(3.5〜3.6 GiB)。Hugging Face のグリディ tokens を 3 プロンプトで一致させます。
- Gemma 4 E4B: テーブルはホスト上に留まり、1 トークンごとに 11 KB の行をカードにコピーします。イメージサイズは 3.96 GiB。
ストリーム化されたロジットの比較
カードが動作中にロジットをストリーミングして取得する場合(
tools/decode_profile.py)、4 bit デコードはデバイスおよびウォールタイムでより高速です。
| モデル | Device [トークン/秒] | Wall [トークン/秒] | 備考 |
|---|---|---|---|
| LFM2 | 89.5 | 84.5 | |
| Qwen3 | 33.7 | 33.3 | |
| Qwen3.5 | 24.6 | 24.2 | |
| LFM2-2.6B | 11.07 | 11.02 | ビルド B (79c5707a) |
| SmolLM3-3B | 8.92 | 8.89 | ビルド B (79c5707a) |
| Phi-4-mini | 6.69 | 6.67 | ビルド B (79c5707a) |
モデル・オブ・エキスパート(MoE)モデル
カードの 4 GiB を超えるモデルは、エキスパートをホストストレージからストリーミングします。
- LFM2.5-8B-A1B (パラメータ 85 億): 平均 10.6 トークン/秒。98.5% のエキスパートがスロットにヒットし、各トークンあたり 5.2 MB がストリーミングされました。
- Qwen3.5-35B-A3B (パラメータ 347 億): 平均 3.95 トークン/秒。62% のエキスパートがヒットし、PCIe を介して各トークンあたり 153 MB(1.41 GB/s)がストリーミングされました。
クアンタ化(4 bit 重み)
- 方式: FP4 値を使用し、1 重みあたり 4.25 bit で保持(LM ヘッダーは int8)。
- 効果: バイト数を約 3 分の 1 削減。デコード速度は Qwen3.5 で 40% 向上、Qwen3 および LFM2 で 45% 向上します。
ホストオーバーヘッド
ホストの干渉はほぼありません。
- LFM2/Qwen3: トークンあたり追加オーバーヘッドは、omarchy で 0.17〜0.30 ms、opentpu で 0.45〜1.3 ms です。
仕組み
アーキテクチャは意図的にシンプルに設計されています。
- サイクルごとの動作: シーケンサーが 1 つの指令を発行します(DMA: データ移動、行列ユニット: 乗算、ベクトルユニット: fp32 計算、クアンタイザー: int8 変換)。
- キャッシュなし: キャッシュや隠れたスケジューリングは存在せず、すべてのデータ移動が明示的な指令です。
アーキテクチャフロー
+---------------------------+ | カーネル (ol 内) | | MLP, Attention, Full | | モデルレイヤー | +------------+--------------+ | v @ol.jit +------------+--------------+ | 言語 + コンパイラ | | レイアウト、アフィニループ | | アドレス指定、フュージョン | +------------+--------------+ | v ISA(1 つの指令に 32 ビット語×8) +------------+--------------+ | ISA シミュレーター <======> RTL (SystemVerilog) | (Python) +------------------+ +------------+--------------+ | Vivado ビットストリーム | | v | +------------+--------------+ | | FPGA カード |-----------------> Kintex-7 xc7k480t | PCIe | | +------------+--------------+<------------------+ | | v | +------------+--------------+ | | ホスト otpu-chat | otpu-smi | | otpu-lens | otpu-selftest | +---------------------------+
カーネルの例
from opentpu import language as ol @ol.jit def mlp(h, gamma, w_gate, w_up, w_down, out, eps): # 簡略化版;詳細は 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、シミュレーター、またはカードから実行を記録し、ブラウザで表示します。
- 可視化: ルーフライン、タイムライン、および各指令ごとのテーブルを表示(docs/lens.md 参照)。
お試しください
カードを使用しない場合、すべての動作はノートパソコン上で可能です。
インストールと実行
# イネード pip install -e . pip install pytest torch transformers # テスト実行 (RTL テストには Verilator 5 も必要) python3 -m pytest -q # モデルダウンロード hf download LiquidAI/LFM2.5-230M --local-dir models/LFM2.5-230M # シミュレーターでのチャット otpu-chat --model lfm2 --backend isa
カードを使用する場合
- ビットストリームをビルド:
(boards/ypcb-00338)make bit - JTAG 経由でロード。
- セットアップと実行:
sudo otpu-setup otpu-chat --backend board
コマンド参照表
| コマンド | 機能 |
|---|---|
| Qwen3-0.6B、LFM2.5-230M、Qwen3.5-0.8B などとのチャット |
| 温度、電力、DRAM バンドウィスド、ユニット利用率を表示 |
| 実行を記録し、プロファイラーで開く |
、 | カードの正常動作確認 |
読み始める場所
- docs/isa.md: 命令セット。他のすべてはこれに基づいています。
- opentpu/kernels と docs/compiler.md: カーネルがどのように指令になるか。
- opentpu/isasim.py: シミュレーター(これが仕様)。
- rtl/: ハードウェア (
から開始)。rtl/top/otpu_top.sv - docs/lfm2.md, docs/qwen35.md, docs/benchmarks.md: 全体モデルとサイクルの行先。
- docs/board.md: 物理的なカード(クロックから PCIe まで)。
次に進むこと
- DRAM の最後の数%: デコードは DRAM エフェシエンスに制約されています。LiteDRAM パスの効率改善が続いています。
- タイミングマージンと面積: 設計は 128 バイトポートが追いつく 133.33 MHz で閉じていますが、僅かなマージン(WNS +0.032 ns)です。Vivado の実行トーナメントで改善が続いています。
- より高速なプリフィル: プリフィルはまだ行列ユニットの乗算速度に制限されています。
貢献とライセンス
- 貢献: バグ報告とプルリクエストを歓迎します。多くの作業には Python と Verilator のみで十分です。変更時は
を通す必要があります。python3 -m pytest -q - ライセンス: Apache License 2.0