FC2カウンター FPGAの部屋 finn をやってみる7(tfc_end2end_example.ipynb その2)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

finn をやってみる7(tfc_end2end_example.ipynb その2)

finn をやってみる6(tfc_end2end_example.ipynb その1)”の続き。

前回は、end2end_example の tfc_end2end_example.ipynb をやってみようということで、Overview と 1. Brevitas export をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb の 2. Network preparation をやってみよう。

今回も end2end_example の tfc_end2end_example.ipynb の図や文章の翻訳、コードを引用して勉強していく。

2. Network preparation

・ FINN-style Dataflow Architectures
・ Tidy-up transformations
・ Streamlining
・ Conversion to HLS layers
・ Creating a Dataflow Partition
・ Folding and Datawidth Converter, FIFO and TLastMarker Insertion


FINN-style Dataflow Architectures
ネットワークを順々に変換していって、FINN のデータフロー形式にしていくようだ。

finn-hw-arch.png を引用する。
この図を見ると、on-chip にネットワークを展開して、並列化(というかパイプライン)するのだと思う。
finn_38_200601.png

やはり、以前 FPGA の部屋でもやってみた finn-hlslib ライブラリを使用して、Vivado HLS で IP にするようだ。( finn-hlslib ライブラリをやっていても使い方が資料不足でいまいち分からなかった)
ネットワークを変換して、 finn-hlslib ライブラリを使えるようにするようだ。楽しみだ。。。

Tidy-up transformations
ここでは、処理を用意にするためのモデルに適用される基本的な変換を説明してくれるらしい。

・ GiveUniqueNodeNames
・ GiveReadableTensorNames
・ InferShapes
・ InferDataTypes
・ FoldConstants


グーグル翻訳を一部変更して引用する。
GiveUniqueNodeNames、GiveReadableTensorNames では、グラフのノードに最初に(列挙によって)一意の名前が付けられ、次にテンソルに人間が読める名前(ノード名に基づく)が付けられる。
InferShapes、InferDataTypes は、モデルプロパティからテンソルの形状とデータ型を導出し、モデルの ValueInfo に設定する。
FoldConstants は、出力が定数のノードを削除して、定数にするようだ。
finn_39_200601.png

GiveUniqueNodeNames、GiveReadableTensorNames では、グラフのノードに分かりやすい名前が付いて、FoldConstants は、出力が定数のノードを削除しているようだ。
変更した新しいネットワークの tfc_w1_a1_tidy.onnx を Netron で示す。
finn_40_200601.png

tfc_w1_a1.onnx よりも簡単な図になった。
Reshape を見てみると、適当なノード名が付いている。
finn_41_200601.png

比較のために同じ Mul で比べてみると、 tfc_w1_a1_tidy.onnx ではノード名が付いている。
finn_42_200601.png

しかし、以前の tfc_w1_a1.onnx ではノード名が番号だった。
finn_43_200601.png

tfc_w1_a1_tidy.onnx 全体を示す。
finn_44_200601.png

Streamlining
streamlining (合理化)はいくつかのサブ変換がある。目的は、浮動小数点数を multi-thresholding nodes に変換することのようだ。論文は、”Streamlined Deployment for Quantized Neural Networks

finn_45_200601.png

streamlining 変換には複数の変換がある。Move と Collapse の変換を行って、MultiThreshold に変換される。変換はここにある。
その後、3つの tidy-up 変換(GiveUniqueNodeNames, GiveReadableTensorNames and InferDataTypes)がモデルに対して適用される。

tfc_w1_a1_streamlined.onnx のグラフを示す。
finn_46_200601.png

finn_47_200601.png

MatMul 層間で多くのノードが消え、Sign ノードのが MultiThreshold に変更された。
現在の streamlining の実装は非常にネットワークに依存するそうだ。ネットワークのトポロジがここに示すネットワークの例と大きく異なる場合は、動作しない可能性がある。今後のリリースで修正する予定だそうだ。

現在のネットワークは 1 ビット(-1, +1 の値)の量子化ネットワークで、FNN の論文に書いてあるように XNOR-popcount 操作として実装されている。2 値の行列の乗算は xnorpopcount 操作に変換される。この変換により、削除されて、しきい値演算が行われる。
finn_48_200601.png

finn_49_200601.png

XnorPopcountmatMulとMultiThresholdレイヤーのペアを観察する。これは、次のステップでそれらをHLSレイヤーに変換するための特定のパターンとなる。
  1. 2020年06月02日 03:33 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4901-16d0fabc
この記事にトラックバックする(FC2ブログユーザー)