FC2カウンター FPGAの部屋 2018年02月01日
FC2ブログ

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

FPGAの部屋

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

これから作る畳み込みニューラルネットワークについての目標

2018/02/02 : ”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討5(畳み込み演算2)”のExport RTL 時の結果を受けて、記事の数値を入れ替えました。

今まで、1クロックごとに1判定出力できる畳み込みニューラルネットワークを Vivado HLS で作ろうと思って、以下の記事でテストしていた。
Vivado HLS 2017.4 で片方が定数の場合の乗算の検討1(C シミュレーション)
Vivado HLS 2017.4 で片方が定数の場合の乗算の検討2(C コードの合成1)
”Vivado HLS 2017.4 で片方が定数の場合の乗算の検討3(C コードの合成2)
Vivado HLS 2017.4 で片方が定数の場合の乗算の検討4(畳み込み演算1)

Vivado HLS 2017.4 で片方が定数の場合の乗算の検討4(畳み込み演算1)”が”畳み込み演算1”と書いてあることから分かる通りにまだ後の記事がある。
しかし、劇的にロジックは減らない。
ここで計算してみると、5 x 5 の畳み込み演算に 853 LUT 使用するので、白線間走行用畳み込みニューラルネットワークで使用してる画像サイズの Row x Column = 10 x 56 ピクセルの画像は、ストライド 1 だと畳み込み演算器は 6 x 52 = 312 個必要だ。フィルタ数は 2 個なので、その倍、つまり、624 個必要となる。
つまり、624 x 853 LUT = 532,272 LUT 必要となる。ZYBO Z7-20 やPYNQ に実装しようとすると総LUT数は53,200 個なので全く足りない。よって 1 クロックで 1 出力の実装は無理だということが分かった。

目標を変更することにしようと思う。
1クロックで1判定出力でなく、画像がストリームで 1 クロックで 1 ピクセル送られてくるときに画像総ピクセル数のクロック+レイテンシのクロック数で変換するような畳み込みニューラルネットワークを Vivado HLS で作ろうと思う。これならば、畳み込み演算部は今までやってきたラプラシアンフィルタの回路を多少修正して適用すれば良い。つまり、白線間走行用畳み込みニューラルネットワークの場合は畳み込みのフィルタ数は 2 個なので、 853 x 2 = 1,706 LUT、程度演算部では使用すれば良いことになる。
後は、全結合層の演算がうまく画像総ピクセル数のクロックで行けるように C ソースコードを書いてみようと思う。

白線間走行用畳み込みニューラルネットワークだと 10 x 56 = 560 クロック+レイテンシで判定出力できるように作ってみよう。
  1. 2018年02月01日 21:28 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる15(udmabuf を使用する)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる14(led_on.py を C で書いてみる)”の続き。

前回は、デバイスツリーをロードして、LEDを点灯させるアプリケーションソフトは @ikwzm さんの作成された led_on.py の代わりにじぶんで書いた C 言語のアプリケーションソフトを使用した。今回は、Vivado HLS で作ったプロジェクトで udmabuf を使用してみよう。

今回、参照するのは@ikwzm さんの書かれた、”UltraZed 向け Debian GNU/Linux で Vivado-HLS を使って合成した回路を動かす”まずは、この通りにやってみよう。

fpga ユーザーの examples ディレクトリに移動して、git clone でGitHub の ikwzm/ZynqMP-FPGA-Linux-Example-2-UltraZed を negative という名前でダウンロードして、negative ディレクトリに入る。なお、Vivado HLS の回路は in を AXI4 Master で読んできて、マイナスにして、out へ書くという回路だ。
cd negative
git clone https://github.com/ikwzm/ZynqMP-FPGA-Linux-Example-2-UltraZed negative
cd negative

UltraZed-EG_StKit_Linux_202_180130.png

Python スクリプトでビットファイルをバイナリ・ファイルへ変換し、/lib/firmware へコピー。
python3 fpga-bit-to-bin.py -f negative.bit negative.bin
sudo cp negative.bin /lib/firmware

UltraZed-EG_StKit_Linux_203_180130.png

/lib/firmware ディレクトリを見ると、negative.bin があるのが分かる。
UltraZed-EG_StKit_Linux_204_180130.png

fpga-load.dts をコンパイルして、fpga-load.dtb を生成する。
dtc -I dts -O dtb -o fpga-load.dtb fpga-load.dts
UltraZed-EG_StKit_Linux_205_180130.png

fpga-load.dtb を fpga に登録
sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load.dtb /config/device-tree/overlays/fpga/dtbo

UltraZed-EG_StKit_Linux_206_180130.png

COMポートのTrea Term ウインドウにメッセージが表示された。
UltraZed-EG_StKit_Linux_207_180130.png

FPGA のクロックを設定するための fclk0-zynqmp.dts をコンパイル
dtc -I dts -O dtb -o fclk0-zynqmp.dtb fclk0-zynqmp.dts
UltraZed-EG_StKit_Linux_208_180130.png

fclk0-zynqmp.dts を fclk0 に登録
sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo

UltraZed-EG_StKit_Linux_209_180130.png

COMポートのTrea Term ウインドウにメッセージが表示された。
UltraZed-EG_StKit_Linux_210_180130.png

UIO と udmabuf のデバイスツリー negative.dts
UltraZed-EG_StKit_Linux_211_180130.png

negative.dts をコンパイル
dtc -I dts -O dtb -o negative.dtb negative.dts
UltraZed-EG_StKit_Linux_212_180130.png

negative.dtb を negative に登録
sudo mkdir /config/device-tree/overlays/negative
sudo cp negative.dtb /config/device-tree/overlays/negative/dtbo
ls -l /dev/uio*
ls -l /dev/udmabuf*

UltraZed-EG_StKit_Linux_213_180130.png

COMポートのTrea Term ウインドウにメッセージが表示された。
UltraZed-EG_StKit_Linux_214_180130.png

negative.py を動作させる
sudo python3 negative.py
UltraZed-EG_StKit_Linux_215_180130.png

今回はスループットが 292 MByte/sec 程度だったが、2回目やると次に示すようにスループットが減っていた。何か?奇数回の方が偶数会よりもスループットが高い気がする。
2 回目の結果を示す。
UltraZed-EG_StKit_Linux_216_180130.png

スループットは、148 MByte/sec 程度と 1 回目よりも少なくなっている。

後始末
デバイスツリーをディレクトリごと削除する。
sudo rmdir /config/device-tree/overlays/netagive
sudo rmdir /config/device-tree/overlays/fclk0
sudo rmdir /config/device-tree/overlays/fpga

UltraZed-EG_StKit_Linux_217_180130.png

COMポートのTrea Term ウインドウに表示されたメッセージを示す。
UltraZed-EG_StKit_Linux_218_180130.png
  1. 2018年02月01日 04:32 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0