FC2カウンター FPGAの部屋 finn-hlslib
fc2ブログ

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

FPGAの部屋

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

finn-hlslib をやってみる2(hls-syn-conv プロジェクト)

finn-hlslib をやってみる1(インストールと hls-syn-add プロジェクト)”の続き。

前回は、Xilinx の FINN を利用した量子化ニューラルネットワーク(QNN)のハードウェア・アクセラレーション用のHLSライブラリの finn-hlslib をやってみようということで、インストールというか git clone と Vivado HLS プロジェクトの hls-syn-add をやってみた。今回は、畳み込み層の hls-syn-conv プロジェクトをやってみた。

まずは、test_conv3.tcl を編集して C/RTL 協調シミュレーションのときに波形が観察できるように cosim_design に -trace_level all を追加した。
finn-hlslib_13_200521.png

これで
vivado_hls test_conv3.tcl
を実行した。
finn-hlslib_14_200521.png
finn-hlslib_15_200521.png

Vivado HLS の hls-syn-conv プロジェクトが作成された。
finn-hlslib_21_200522.png

ハードウェア化される conv_top.cpp を示す。
finn-hlslib_18_200522.png

ここで使用されている ConvLayer_Batch() のマニュアルはここにある。

ConvLayer_Batch() のテンプレート・パラメータを紹介する。
ConvKernelDim (畳み込みカーネルの次元数): 3 (3 x 3 のカーネル)
IFMChannels (入力特徴マップの数): 2
IFMDim (入力特徴マップの幅と高さ(正方形と仮定)): 8
OFMChannels (出力特徴マップの数) : 1
OFMDim (出力特徴マップの幅と高さ(正方形と仮定)): 6
SIMD (並列に計算される入力列の数): 2
PE (並列に計算される出力行の数): 1
TSrcI (入力アクティベーションのDataType(MACで使用される)): Slice > (INPUT_PRECISION = 8)
TDstI (出力アクティベーションのDataType(アクティベーションによって生成されたもの)): Slice >
TWeightI (重みのDataType(MACで使用される)): Identity

入力パラメータのアクティベーション・クラスは PassThroughActivation>()
重みは前回生成した memdata.h の static BinaryWeights<2,1,9> weights を使用している。 9 要素あるので 3 x 3 のカーネルのパラメータなのだと思う。

畳み込みは 8 x 8 の要素に 3 x 3 のカーネルを畳み込んで出力は 6 x 6 になったということだろう。つまり、パッディングはなしということだ。

C/RTL 協調シミュレーションの結果を示す。
Latency は 354 クロックだった。
finn-hlslib_19_200522.png

C/RTL 協調シミュレーションの波形を示す。
finn-hlslib_20_200522.png

出力は 36 個ある。つまり、6 x 6 ということだろう?

Export RTL をやってみた。結果を示す。
finn-hlslib_22_200522.png
  1. 2020年05月22日 05:08 |
  2. finn-hlslib
  3. | トラックバック:0
  4. | コメント:0

finn-hlslib をやってみる1(インストールと hls-syn-add プロジェクト)

Xilinx の FINN を利用した量子化ニューラルネットワーク(QNN)のハードウェア・アクセラレーション用のHLSライブラリが finn-hlslib のようだ。 finn-hlslib をやってみようと思う。

最初に finn-hlslib を git clone をして、 finn-hls/tb ディレクトリに cd する。
git clone https://github.com/Xilinx/finn-hlslib.git
cd finn-hls
cd tb

finn-hlslib_1_200520.png

gen_weights.py を起動して、 config.h と memdata.h を生成した。
python3 gen_weights.py
finn-hlslib_2_200520.png

FINN_HLS_ROOT 環境変数に finn-hlslib のルートディレクトリを設定した。
export FINN_HLS_ROOT=/media/masaaki/Ubuntu_Disk/Xilinx_github/finn-hlslib

試しに test_add.tcl を起動した。
vivado_hls test_add.tcl
finn-hlslib_3_200520.png
finn-hlslib_4_200520.png

C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーションを行った。
hls-syn-add ディレクトリが生成されて、Vivado HLS のプロジェクトが生成されていた。
finn-hlslib_5_200520.png

vivado_hls &
で Vivado HLS 2019.2 を起動して、hls-syn-add ディレクトリのプロジェクトを読み込んだ。
finn-hlslib_6_200520.png

波形を見るために C/RTL 協調シミュレーション時に Dump Trace を all に変更して、実行した。
finn-hlslib_7_200520.png

Latency は 10 クロックだった。

波形を見てみよう。
finn-hlslib_8_200520.png

4 つの出力をしているようだ。

hls-syn-add プロジェクトは何をしているのか?だが、 add_top.cpp を見ると AddStreams_Batch() 関数が実行されている。
AddStreams_Batch() 関数は Resnet-50 でストリームを加算する関数のようだ。
これからソースコードのキャプチャ画面を引用します。
finn-hlslib_9_200521.png

AddStreams_Batch() 関数は streamtools.h に記述されている。
finn-hlslib_10_200521.png

typename で型を定義しているようだ。このように型を定義できるの良いな。。。知らなかった。使おう。。。

AddStreams_Batch() 関数からは、 Add_Streams() 関数が呼ばれている。
finn-hlslib_10_200521.png

AddStreams() 関数では、ビット・フィールド毎(チャネル毎)に offset を加えて加算しているようだ。offset は 2 になっている。
finn-hlslib_11_200521.png

最後に C コードの合成結果を貼っておく。
finn-hlslib_12_200521.png
  1. 2020年05月21日 04:25 |
  2. finn-hlslib
  3. | トラックバック:0
  4. | コメント:0