xiangze's sparse blog

機械学習、ベイズ統計、コンピュータビジョンと関連する数学について

VTAの実装三者三様(Xilinx,Intel,Scala)

VTAのFPGAによる回路実装を比べてみます。
どれもあまり触ったことがないのでこれを機に細かいところを学んでいきます。

概観

VTAの回路モジュール図
  • instruction fetch module
  • load module
  • store module
  • input/output/weight buffer
  • load/compute store comand queue
  • compute module

- register file
- micro-op cache
- Tensor ALU
- GEMM core
といったブロックからなりCISC的なCPUとみなすことができます。TPUの構成に似た部分があります*1

このハードウェアを以下のIntel OpenCL, AMD(Xilinx) Vivado HLSではFPGA合成用の高位言語で記述していて、抽象度の高いRTL記述言語Chiselでも記述されて言います。

Intel OpenCL

tvm-vta/hardware/intelfocl at main · apache/tvm-vta · GitHub
tvm-vta/hardware/intelfocl/src/vta.cl at main · apache/tvm-vta · GitHub
の vta_core関数にすべての処理が書かれているようです(約300行)。vta.hにはサイズなどのパラメーターが書かれています。
演算精度はunsigned intです。全体が

for (int pc = 0; pc < insn_count; pc++) {

ループに囲まれたステートマシンで重み、データの読み込み、GEMM,ALUでの演算、結果の書き出しが条件ごとにあります。
演算部分で

#pragma unroll

が使われています。

AMD(Xilinx) Vivado HLS

tvm-vta/hardware/xilinx/src/vta.cc at main · apache/tvm-vta · GitHub
reset_ load_data
など各処理が関数として書かれています(約750行)。テンプレートでデータ幅を決定します。

#pragma HLS INLINE
#pragma HLS PIPELINE

が各ループに丁寧に付けられています。computeやstoreは処理が多くソフトウェア的な見た目で最後のvta関数が最上位のステートマシンになっているようです。

Chisel

ChiselはScalaベースのDSLで抽象度としてはRTLですがVerilogVHDLよりも簡潔でサイクルベースの高速なシミュレーションやJava,Scalaのソフトウェア環境が使えることで注目されています。
tvm-vta/hardware/chisel/src/main/scala/core at main · apache/tvm-vta · GitHub
モジュール、機能ごとにファイルがあります。Java,Scalaの環境はディレクトリが深いです。

行数 ファイル名
:---- :----
274 Compute.scala
49 Configs.scala
121 Core.scala
229 Decode.scala
67 EventCounters.scala
74 Fetch.scala
200 FetchVME64.scala
351 FetchWideVME.scala
149 ISA.scala
132 Load.scala
103 LoadUop.scala
250 LoadUopSimple.scala
44 Semaphore.scala
114 Store.scala
601 TensorAlu.scala
748 TensorGemm.scala
75 TensorLoad.scala
740 TensorLoadNarrowVME.scala
361 TensorLoadSimple.scala
765 TensorLoadWideVME.scala
62 TensorStore.scala
275 TensorStoreNarrowVME.scala
289 TensorStoreWideVME.scala
556 TensorUtil.scala
23 package.scala
6652 合計

Coreが回路の最上位でその下のComputeで計算の処理をしていてステートマシンがあります。ステートマシンは一番短くまとまっています。

val インスタンス名=Module(new モジュール名)

で下位のモジュールをインスタンス化しています。
Fetch,Load,Storeが複数あったりSemaphoreがあったりして高位合成よりも細かく書かないといけないようです。

testもあります
src/main/resources以下はverilog DPI-Cで書かれたメモリモデルのようです。

https://github.com/apache/tvm-vta/blob/main/hardware/chisel/src/main/scala/test/Test.scala

感想

まさに三者三様
自分でもこれをベースにSystem Verilog,System Cで書けそう。

ためになる本

ChiselでRiscVのCPUを作るという実践的入門書、GCCコンパイルしたコードが動く!拡張命令も動く!
gihyo.jp
GitHub - chadyuu/riscv-chisel-book
dockerでChisel開発環境を簡単に使えます。


深層学習コンパイラスタックと最適化

cparch-mclearn.blogspot.com

「水はどうして透明なの?」と生物学における4つのなぜ(水と光と目)

バズりに食いついてPVを稼ぎたい今日この頃です。

  • 「水はどうして透明なの?」
  • 水分子の吸収スペクトルと太陽光のスペクトルの関係
  • 生物学における4つの「なぜ」とは
    • 眼の機能と環境
    • 眼の系統発生と生息環境
    • 眼のメカニズムと光学
    • 眼の個体発生と行動
  • まとまらない
  • その他
  • 宣伝
続きを読む

東方プロジェクト人気投票の統計解析 ベイズ統計モデリング編と本

時間が空いてしまいましたが以前ブログに書いた 
東方プロジェクト人気投票の統計解析 記述統計編 - xiangze's sparse blog

東方人気投票の統計モデルの事後分布が計算できたので記します。

また同人誌を作りました。

  • キャラクターのモデルと事後分布
    • 和モデル
    • 和モデル(整数、非整数作品固有の寄与を入れた場合)
    • 積和モデル
  • 音楽のモデルと結果
    • 和モデル
    • 積和モデル
  • 事前分布
  • 発展的話題、展望
  • 他のデータの利用
  • 予測
  • 別の観点でのモデリング
  • ためになる本
  • 同人誌
  • その他
続きを読む

TVMのレファレンスハードウェアVTAについて(概観、インストール編)

  • 概要
  • TVM/VTAの階層構造
  • VTA(Versatile Tensor Accelerator)
  • 実行環境
    • Dockerの使用
  • 実行
  • 発展的内容
  • リンク

概要

TVMニューラルネットアクセラレーターのコンパイル環境、デプロイ環境としてデファクトのようなものであり、pytorch,tensorflow lite,ONNXなどのフォーマットで書かれたニューラルネットをCPU,GPU,その他アクセラレーターで実行でき、ネットワークを機械学習手法を使って最適化ができる点が注目されています。
TVMが実行可能なハードウェアはニューラルアクセラレーターを作っている半導体ベンダーが独自に実装していますが、公開されてる実装情報としてVTA(Versatile Tensor Accelerator)があります。

続きを読む

「拡散モデル データ生成技術の数理」を読みました(すごい)

www.iwanami.co.jp

  • 内容
    • 1章 生成モデルの一つとしての拡散モデル、拡散モデルとスコアマッチング法との関係について
    • 2章 SBMとDDPMについて、学習対象の導出、統一的理解
    • 3章 時間連続極限の場合と拡散モデルの高性能について
    • 4章 条件付き生成、高解像度化、群不変、同変性
    • 5章 アプリケーション
  • 感想
    • 他の本
続きを読む

チャーン類(特性類)と曲率の関係

長年気になっていたけどはっきりとは理解していなかったことを書きます。

  • あっさりした導入
  • 曲率を使った説明
    • 接続、接続形式
    • 曲率形式
    • 不変多項式
      • 不変多項式の具体例と一意性
      • 不変性の計算
  • 応用
  • 感想
  • 参考書
  • 広告
続きを読む