”
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 を追加した。

これで
vivado_hls test_conv3.tclを実行した。


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

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

ここで使用されている
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 クロックだった。

C/RTL 協調シミュレーションの波形を示す。

出力は 36 個ある。つまり、6 x 6 ということだろう?
Export RTL をやってみた。結果を示す。

- 2020年05月22日 05:08 |
- finn-hlslib
-
| トラックバック:0
-
| コメント:0
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
gen_weights.py を起動して、 config.h と memdata.h を生成した。
python3 gen_weights.py
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

C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーションを行った。
hls-syn-add ディレクトリが生成されて、Vivado HLS のプロジェクトが生成されていた。
vivado_hls &で Vivado HLS 2019.2 を起動して、hls-syn-add ディレクトリのプロジェクトを読み込んだ。

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

Latency は 10 クロックだった。
波形を見てみよう。

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

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

typename で型を定義しているようだ。このように型を定義できるの良いな。。。知らなかった。使おう。。。
AddStreams_Batch() 関数からは、 Add_Streams() 関数が呼ばれている。

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

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