世界を動かす技術を、日本語で。

Tiny-tpu: GoogleのTPUに触発されたミニマルなテンソル処理ユニット(TPU)

概要

  • tiny-tpu はGoogleのTPU V1/V2を参考にした ミニマルなTPU設計 プロジェクト
  • 主な構成要素 (PE, Systolic Array, VPU, UB, 制御部)を詳細に解説
  • 独自ISA(94ビット幅) で制御、命令セットの具体例も掲載
  • 開発・テスト環境構築手順 (MacOS/Ubuntu対応)を記載
  • モジュール追加や波形解析方法 も初心者向けに説明

tiny-tpu 概要

  • tiny-tpu はGoogleのTPU V1/V2アーキテクチャを参考に ゼロから再設計 したオープンソースTPUプロジェクト
  • PE(Processing Element)Systolic ArrayVPU(Vector Processing Unit)Unified Buffer(UB) など、基本構成を 最小限かつ分かりやすく実装
  • 誰でも参加・学習できる ように設計され、ハードウェア初心者でも取り組みやすい構成
  • 命令セットアーキテクチャ(ISA) や制御部も 独自設計 し、柔軟な拡張性を確保
  • 公式サイト・リポジトリ で詳細ドキュメントとソースコードを公開

アーキテクチャ詳細

  • Processing Element(PE)

    • 毎クロックごとに積和演算(MAC)を実行 する演算ユニット
    • 入力データ は内部の重みと乗算後、部分和に加算し 出力和 を生成
    • データ伝搬 として、入力データは次のPEへも転送
  • Systolic Array

    • 2×2以上のPEグリッド で構成される行列演算器
    • 入力値 は水平方向、 部分和 は垂直方向に流れる構造
    • 重みデータ は各PEに固定配置
    • 入力行列の90度回転・重み行列の転置 をハードウェアで実装し、計算の整合性を確保
  • Vector Processing Unit(VPU)

    • Systolic Array後段で要素ごとの演算 を担当
    • モジュール選択 により、バイアス加算、Leaky ReLU、MSE損失、Leaky ReLU微分など パイプライン処理
  • Unified Buffer(UB)

    • 中間データ保存用のデュアルポートメモリ
    • 保存対象 :入力行列、重み行列、バイアスベクトル、活性化値、リークファクタ、逆バッチサイズ定数
    • 2つの読み書きポート を持ち、アドレス・カウント指定で連続アクセス可能
  • 制御部(Control Unit)

    • 命令幅94ビット の独自ISAで各サブシステムを直接制御
    • 詳細はsrc/control_unit.sv に実装

命令セット(Instruction Set)

  • 命令幅:94ビット([93:0])

  • 主なフィールドと役割

    • [0–4]:システムON/OFF、UBリード/ライト、転置モード等の制御信号
    • [6:5]:UBリードカラムサイズ(2ビット)
    • [14:7]:UBリード行数(8ビット)
    • [22:15]:UBリードアドレス(8ビット)
    • [25:23]:UBポインタ選択(3ビット)
    • [41:26]:ホストからのUBライトデータ1(16ビット固定小数点)
    • [57:42]:ホストからのUBライトデータ2(16ビット固定小数点)
    • [61:58]:VPUデータ経路指定(4ビット)
    • [77:62]:逆バッチサイズ×2(16ビット固定小数点)
    • [93:78]:VPUリークファクタ(16ビット固定小数点)
  • 命令例・利用方法

    • 命令はテストベンチファイルからチップの命令バッファに直接ロード
    • tests/tpu.v で順方向・逆方向パスの命令シーケンス例を確認可能

開発・セットアップ手順

  • MacOS環境

    • 仮想環境作成後、 pip install cocotb でPythonテスト環境構築
    • Homebrewでiverilog インストール:brew install iverilog
    • gtkwaveはソースからビルド (他の方法は非推奨)
  • Ubuntu/Linux環境

    • 仮想環境作成後、 pip install cocotb
    • gtkwave :sudo apt install gtkwave
    • iverilog :sudo apt install iverilog

モジュール追加・波形解析手順

  • 新規モジュール追加手順

    • src/ ディレクトリに<MODULE_NAME>.svを作成
    • test/ にdump_<MODULE_NAME>.svを作成し、$dumpfile/$dumpvarsで波形出力
    • test_<MODULE_NAME>.py でPythonテストを作成
    • Makefile のSOURCESに追加、テストターゲットを定義
    • make test_<MODULE_NAME> でテスト実行、 gtkwave waveforms/<MODULE_NAME>.vcd で波形閲覧
  • gtkwaveの固定小数点表示設定

    • 右クリック→Data Format→Fixed Point Shift→Specifyで8を入力
    • Data Format→Signed Decimalに設定
    • Fixed Point Shift→ONを有効化
  • .gtkwファイルとは

    • 信号表示設定を保存 するファイル
    • make show_<MODULE_NAME> 実行後、一度だけ保存すればOK

今後の展望

  • 独自ISA用のコンパイラ開発
  • TPUアレイの大規模化(256×256や512×512)

プロジェクトの動機

  • TPUアーキテクチャやチップ設計情報は非公開が多い現状
  • ハードウェア初心者でも取り組める教材・リソースを目指して設計
  • 実際に設計・開発を通じて得た知見をコミュニティに還元
  • “発明的思考”で課題解決する楽しさを伝えることが目的

Hackerたちの意見

https://news.ycombinator.com/item?id=44111452

ああ、それと https://news.ycombinator.com/item?id=44944592 の疑似重複なんだけど、正直に言うと、今のポイントスプレッドは正確だと思うよ。ランダムな.comドメインよりも、リポジトリのリンクの方がずっと好きだから。

複数ユニットのPCIeカードって、簡単なインターフェースで手に入るかな?例えば、TPUが4つとRAMスロットが8つとか。5,000ドルくらい?

これに詳しい人、例えばGemini Flash 2.5とPro 2.5モデルを1人で動かすのに、何個のTPUが必要か教えてもらえますか?

シリコンチップの3Dプリンター化がめっちゃ遅れてるよね。

息を止めない方がいいよ。チップの製造はめっちゃ高度なんだから。基本的にはナノテクノロジーだし、今すぐ家でできるようなことじゃないよ。

すごいアニメーションをSVGでどうやって作ったの?ドキュメントもクールだね!

これにも興味があったんだ。サイトはすごく美しいね。SVGがもうちょっと工夫されていて、(私の限られた経験からだけど)基本的に各ティックごとに新しいSVGを入れ替える感じだったらいいなと思った。すごくきれいだけど、もう少しインタラクションやコンポーザビリティがあればなぁ。

なんか、いろんなExcalidrawの出力が重なってる感じじゃない?