FC2カウンター FPGAの部屋 ACRi ルームの Alveo U50 を使ってみた4(CNN を動作させてみた)
fc2ブログ

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

FPGAの部屋

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

ACRi ルームの Alveo U50 を使ってみた4(CNN を動作させてみた)

ACRi ルームの Alveo U50 を使ってみた3(ラプラシアンフィルタ)”の続き。

前回は、ACRi ルームの Alveo U50 を使用して、ラプラシアンフィルタを実装して動作させることができた。今回は、CNN を ACRi ルームの Alveo U50 で動作させてみよう。

今回実装する CNN は横 56 ピクセル x 10 行の画像から白線を検出して、右に行くか、直進するか左に行くの 3 出力を出力する CNN だ。これは、以前 Ultra96 ボードでカーネルを RTL カーネルとして使用したプロジェクトをそのまま使用している。つまり、Vivao HLS で作成した XO ファイルをVitis プロジェクトでカーネルとして使用しているわけだ。詳しくは、”テンプレートで書いた畳み込みニューラルネットワークをRTLカーネルとしてVitisで実装する5(Vitis 編)”辺りを参照して欲しい。

なお、余談になるが、今回のブログに書くに当たって、デバックしている途中で、ソースコードのバグも発見した。それは、任意精度固定データ型の量子化モードとオーバーフローモードが2番めの全結合層の重みとバイアスで関数の定義と違っていたことだ。Ultra96用のプロジェクトではこれでも通ってしまったようだが、今回の Alveo U50 ではエラーになった。

以前のUltra96 ボードでカーネルを RTL カーネルとして使用した Vivado HLS プロジェクトは”テンプレートで書いた畳み込みニューラルネットワークをRTLカーネルとしてVitisで実装する1(Vivado HLS 編 1)”を参照して欲しい。

さて、ACRi ルームの Alveo U50 が搭載されたマシンにログインして、進めていこう。この辺りの手順は”ACRi ルームの Alveo U50 を使ってみた1(Vector Addition の実行)”を参照して欲しい。

まずは、リモートデスクトップ接続した状態で、XRT の環境を設定する。
source /opt/xilinx/xrt/setup.sh

Vitis 2019.2 の環境を設定する。
source /tools/Xilinx/Vitis/2019.2/settings64.sh

ACRi ルームの Alveo U50 を使ってみた1(Vector Addition の実行)”のVivado HLS プロジェクトを ACRi ルームのファイルサーバーに SFTP でアップロードした。

Vivado HLS で新しいSolution を作成し、FPGA の型番を xcvu35p-fsvh2014-2-e に設定した。( IDA さん、教えていただいて、ありがとうございます)
C コードの合成をしたところ成功した。なお、動作周波数は 300 MHz とした。
ACRi_U50_66_200822.png
ACRi_U50_67_200822.png

すごい。。。ほとんどリソース消費していない。これだと、だいぶ大きな CNN でもいけるんじゃないだろうか?楽しみだ。マシンの性能も不安が無いし、とっても心強い。

Export RTL を行うと、all_layers_dnn.xo ファイルが生成された。
ACRi_U50_68_200822.png

all_layers_dnn.xo ファイルをカーネルに指定した Vitis 2019.2 のプロジェクトを作成した。やはり、vector addition のテンプレートを使用しないと実行時に失敗するので、使用した。もうビルドまで終了している。
ACRi_U50_69_200822.png

Vitis 2019.2 のプロジェクト all_layers_template2/src ディレクトリの中身を示す。
ACRi_U50_70_200822.png

Run Configuration を作成した。なお、[Run Configurations] ウィンドウで [Environment] タブに移動し、テーブルに設定されている LD_LIBRARY_PATH 変数を削除してある。
ACRi_U50_71_200822.png

実行したところ、成功した。
ACRi_U50_72_200822.png

ログを示す。

[Console output redirected to file:/home/u_marsee101/Vitis_Work/U50/2019.2/all_layers_template2/Hardware/all_layers_template2-Default.launch.log]
Using FPGA binary file specfied through the command line: ../binary_container_1.xclbin
Found Platform
Platform Name: Xilinx
Loading: '../binary_container_1.xclbin'
hw_error: i = 0 output = 0 t_test_num = 1
dot2[0] = 0.00000000 dot2_soft[0] = -6.89110470
dot2[1] = 0.00000000 dot2_soft[1] = 3.03815722
dot2[2] = 0.00000000 dot2_soft[2] = -3.19690108

hw_error: i = 25 output = 2 t_test_num = 1
sw_error: i = 25 output_soft = 2 t_test_num = 1
dot2[0] = 0.25000000 dot2_soft[0] = -3.77501726
dot2[1] = 0.12500000 dot2_soft[1] = -0.13269189
dot2[2] = 0.25000000 dot2_soft[2] = 1.61074853

hw_error: i = 30 output = 2 t_test_num = 1
sw_error: i = 30 output_soft = 2 t_test_num = 1
dot2[0] = 0.43750000 dot2_soft[0] = -4.67336369
dot2[1] = 0.40625000 dot2_soft[1] = 0.12951475
dot2[2] = 0.43750000 dot2_soft[2] = 1.71587336

sw_error: i = 31 output_soft = 2 t_test_num = 1
dot2[0] = -0.25000000 dot2_soft[0] = -5.31440449
dot2[1] = 0.90625000 dot2_soft[1] = 0.69655895
dot2[2] = -0.25000000 dot2_soft[2] = 1.00723171

sw_error: i = 35 output_soft = 2 t_test_num = 1
dot2[0] = 0.43750000 dot2_soft[0] = -5.15462875
dot2[1] = 0.50000000 dot2_soft[1] = 0.19586089
dot2[2] = 0.43750000 dot2_soft[2] = 1.79063916

sw_error: i = 36 output_soft = 2 t_test_num = 1
dot2[0] = -0.25000000 dot2_soft[0] = -5.64889669
dot2[1] = 1.03125000 dot2_soft[1] = 0.69646239
dot2[2] = -0.25000000 dot2_soft[2] = 1.09402716

sw_error: i = 40 output_soft = 2 t_test_num = 1
dot2[0] = 0.09375000 dot2_soft[0] = -5.31394196
dot2[1] = 0.59375000 dot2_soft[1] = 0.30034199
dot2[2] = 0.09375000 dot2_soft[2] = 1.52586949

sw_error: i = 41 output_soft = 2 t_test_num = 1
dot2[0] = 0.06250000 dot2_soft[0] = -5.94443941
dot2[1] = 0.87500000 dot2_soft[1] = 0.61903512
dot2[2] = 0.06250000 dot2_soft[2] = 1.28180122

sw_error: i = 42 output_soft = 2 t_test_num = 1
dot2[0] = 0.37500000 dot2_soft[0] = -7.44187164
dot2[1] = 1.31250000 dot2_soft[1] = 1.10615981
dot2[2] = 0.37500000 dot2_soft[2] = 1.35738707

sw_error: i = 45 output_soft = 2 t_test_num = 1
dot2[0] = 0.18750000 dot2_soft[0] = -5.92508411
dot2[1] = 0.68750000 dot2_soft[1] = 0.44851223
dot2[2] = 0.18750000 dot2_soft[2] = 1.43742454

sw_error: i = 46 output_soft = 2 t_test_num = 1
dot2[0] = 0.90625000 dot2_soft[0] = -7.76649952
dot2[1] = 1.06250000 dot2_soft[1] = 0.82863915
dot2[2] = 0.90625000 dot2_soft[2] = 1.88942850

sw_error: i = 47 output_soft = 2 t_test_num = 1
dot2[0] = 0.75000000 dot2_soft[0] = -9.50911713
dot2[1] = 1.75000000 dot2_soft[1] = 1.48399019
dot2[2] = 0.75000000 dot2_soft[2] = 1.85759318

hw_error: i = 75 output = 2 t_test_num = 1
sw_error: i = 75 output_soft = 2 t_test_num = 1
dot2[0] = 2.12500000 dot2_soft[0] = -4.04238653
dot2[1] = -1.03125000 dot2_soft[1] = -1.22402656
dot2[2] = 2.12500000 dot2_soft[2] = 3.36929369

hw_error: i = 76 output = 2 t_test_num = 1
sw_error: i = 76 output_soft = 2 t_test_num = 1
dot2[0] = 0.40625000 dot2_soft[0] = -4.09871578
dot2[1] = -0.21875000 dot2_soft[1] = -0.46985394
dot2[2] = 0.40625000 dot2_soft[2] = 1.61257589

hw_error: i = 80 output = 2 t_test_num = 1
sw_error: i = 80 output_soft = 2 t_test_num = 1
dot2[0] = 1.78125000 dot2_soft[0] = -4.33292818
dot2[1] = -0.75000000 dot2_soft[1] = -0.96692348
dot2[2] = 1.78125000 dot2_soft[2] = 2.98383069

hw_error: i = 81 output = 2 t_test_num = 1
sw_error: i = 81 output_soft = 2 t_test_num = 1
dot2[0] = 0.09375000 dot2_soft[0] = -4.40864801
dot2[1] = 0.06250000 dot2_soft[1] = -0.15780880
dot2[2] = 0.09375000 dot2_soft[2] = 1.26864278

hw_error: i = 85 output = 2 t_test_num = 1
sw_error: i = 85 output_soft = 2 t_test_num = 1
dot2[0] = 1.21875000 dot2_soft[0] = -4.16326904
dot2[1] = -0.59375000 dot2_soft[1] = -0.84592772
dot2[2] = 1.21875000 dot2_soft[2] = 2.42255425

sw_error: i = 86 output_soft = 2 t_test_num = 1
dot2[0] = -0.28125000 dot2_soft[0] = -4.36515617
dot2[1] = 0.09375000 dot2_soft[1] = -0.08813666
dot2[2] = -0.28125000 dot2_soft[2] = 0.97706115

hw_error: i = 90 output = 2 t_test_num = 1
sw_error: i = 90 output_soft = 2 t_test_num = 1
dot2[0] = 0.46875000 dot2_soft[0] = -4.02276182
dot2[1] = -0.53125000 dot2_soft[1] = -0.66237617
dot2[2] = 0.46875000 dot2_soft[2] = 1.72938108

sw_error: i = 91 output_soft = 2 t_test_num = 1
dot2[0] = -0.78125000 dot2_soft[0] = -3.85103607
dot2[1] = 0.15625000 dot2_soft[1] = -0.09844255
dot2[2] = -0.78125000 dot2_soft[2] = 0.42963967

sw_error: i = 95 output_soft = 2 t_test_num = 1
dot2[0] = -0.43750000 dot2_soft[0] = -4.07760668
dot2[1] = -0.03125000 dot2_soft[1] = -0.30057180
dot2[2] = -0.43750000 dot2_soft[2] = 0.90393031

hw_err_cnt = 9 sw_err_cnt = 20

  1. 2020年08月23日 08:31 |
  2. Alveo
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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