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

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

FPGAの部屋

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

finn をやってみる9(tfc_end2end_example.ipynb その4)

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

前回は、end2end_example の tfc_end2end_example.ipynb の Conversion to HLS layers, Creating a Dataflow Partition, Folding and Datawidth Converter, FIFO and TLastMarker Insertion をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb の 3. Vivado HLS and IPI からやってみよう。

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

3. Vivado HLS and IPI
・ Generating HLS Code
・ Synthesizing HLS to IP Blocks
・ IP Stitching

これらのタスクではFPGA合成ツールを扱うので、ターゲットとするザイリンクスFPGAパーツ名とPYNQボード名を記述する2つのヘルパー変数を定義する。
finn_61_200602.png

クロック周期は 10 ns つまり 100 MHz のようだ。

Generating HLS Code
このセクションでは、さまざまなレイヤーからのIPブロックの生成について説明する。これらは、完全なモデルに対応するブロックデザインを作成できる。IPブロックへの単一の変換により、優れた透過性が得られ、各IPブロックの機能をチェックして、対応するONNXノードの動作と比較できる。

各層のHLS IPブロックを生成するには、2つの変換が必要となる。

・ PrepareIP ノードのHLS C ++コードと、HLS合成を開始してデザインをIPとしてエクスポートするtclスクリプトを生成する。
・ HLSSynthIP tclスクリプトをVivado HLSに渡し、実際のIP生成を実行する。

まず、基本的な変換 GiveUniqueNodeNames を使用して一意のノード名を指定し、次に PrepareIP を使用してHLS C ++コード生成を続行する。
finn_62_200602.png

Synthesizing HLS to IP Blocks
各レイヤーのHLSコードを生成したので、HLSSynthIP変換を呼び出して、生成されたHLSをVivado IPブロックに変換できる。これにはHLS合成の呼び出しが含まれるため、この変換はしばらく(うちでは10分ほど)実行される。
finn_63_200602.png

各 StreamingFCLayer_Batch ノードには、netronでより詳細に検査できる新しい属性がある。

finn_64_200602.png

最初の StreamingFCLayer_Batch ノードを見てみると、たくさんの属性が増えている。
finn_65_200602.png
finn_66_200602.png
finn_67_200602.png

tfc_w1_a1_ipgen.onnx のグラフ全体を示す。
finn_68_200603.png

属性が 2 つ追加されている。
・ code_gen_dir_ipgen ipgen変換によって生成されたすべてのファイルが格納されるディレクトリパス
・ ipgen_path 生成されたIPブロックが保存されているプロジェクトディレクトリへのパス

このディレクトリを確認することで、どのファイルが生成されるかをさらに調査できる。たとえば、最初の StreamingFCLayer_Batch ノードの場合を示す。
finn_69_200602.png

ディレクトリ project_StreamingFCLayer_Batch_0 には、IP ブロックがエクスポートされる Vivado HLS によって作成されたプロジェクトと、 Vivado HLS によって生成された他のファイルが含まれる。上記の netron によるネットワークの視覚化と比較すると、これは正確にノード属性 ipgen_path に格納されているフォルダーの名前ということだ。 Vivado HLS に渡される.cppコードは、 top_StreamingFCLayer_Batch_0.cpp ファイルにある。 thresh.h ファイルもそれに属し、しきい値の値が含まれている。重みは .npy ファイルおよび .dat ファイル(memblock_0.dat)として保存される。 vivado_hls.log は、Vivado HLS からのログファイルだ。これらのファイルに加えて、フォルダーには ipgen.sh および hls_syn_StreamingFCLayer_Batch_0.tcl が含まれる。また、StreamingFCLayer を「decoupled」モードで使用するため、verilog ラッパー(StreamingFCLayer_Batch_0_memstream.v)が生成される。「decoupled」および「const」モードの詳細については、 FINN readthedocs Web サイトの Internals に書いてある。

以下では、生成された2つのスクリプトを詳しく見ていく。 ipgen.sh から始める。
finn_69_200602.png

/tmp/finn_dev_masaaki/code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos に cd して、 Vivado HLS の TCL ファイルを StreamingFCLayer_Batch_0.tcl を起動する。終わったら、/workspace/finn に戻る(これは私の解説)。

hls_syn_StreamingFCLayer_Batch_0.tcl を表示する。
finn_70_200602.png

Vivado HLS のプロジェクトを作って、xc7z020clg400-1、クロック 10 ns 、-cflags "-std=c++0x -I$config_bnnlibdir" 、axi_addr64 で合成して、IP としてエクスポートしている(これは私の解説)。

すべてのIPブロックが配置されたので、それらを一緒にステッチして、ONNXモデルに一致するIPデザインを作成できる。 これについては、次のセクションで説明する。

ここで、Vviado HLS のプロジェクトができているということで、起動中の docker コンテナに入って、実際のファイルを見てみよう。
起動中の docker コンテナのシェルに入る”を参考にして、起動中の docker コンテナを見る。docker ps
docker ps
docker exec -i -t 7b069b1e1356 /bin/bash

finn_71_200603.png

/workspace/finn に入れた。
ls をした。
finn_72_200603.png

今まで Jupyter Notebook で生成した onnx モデルが入っている。

/tmp/finn_dev_masaaki に行ってみると、今作った tfc_w1_a1_ipgen.onnx の各ノードがあった。
ls -alt
finn_74_200603.png

ノードを示す。

drwx------  3 masaaki docker 4096 Jun  2 19:55 code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos
drwx------  3 masaaki docker 4096 Jun  2 19:54 code_gen_ipgen_StreamingDataWidthConverter_Batch_0_nzm_awqb
drwx------  3 masaaki docker 4096 Jun  2 19:53 code_gen_ipgen_StreamingFCLayer_Batch_1_ze13mbt0
drwx------  3 masaaki docker 4096 Jun  2 19:52 code_gen_ipgen_StreamingFCLayer_Batch_2_cc9g0rxo
drwx------  3 masaaki docker 4096 Jun  2 19:51 code_gen_ipgen_StreamingFCLayer_Batch_3_8fn3j9gt
drwx------  3 masaaki docker 4096 Jun  2 19:50 code_gen_ipgen_TLastMarker_0_dkbjhrkw
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_5_rpmfwai3
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_4_hkgtx9lw
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_3_iz1kpch8
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_2_7lkicamh
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_1_eimmu84e
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_0_qnzwb_sa
drwx------  2 masaaki docker 4096 Jun  1 19:27 dataflow_partition_evha3xbg


code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos に入ってみる。
cd code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos
finn_75_200604.png

ipgen.sh, hls_syn_StreamingFCLayer_Batch_0.tcl などが見える。
  1. 2020年06月04日 04:48 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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