AI高位合成ツール「AIRTIPS」で生成した独自AIアクセラレータ(4DTC)をKV260で動かす方法~AIRTIPS実践編①~
研究開発本部 中村 龍昇(なかむら たつのり)
はじめに
本稿では、前回の導入編の記事にてお話ししておりました通り、我々が独自に開発したAIアクセラレータである4DTCを、AMD社製FPGA評価基板であるKV260で動かす方法について説明し、手書き数字画像の大規模データベースMNISTを用いた手書き文字認識により、4DTCの動作を確認します。
AIRTIPSは、以下のリンクからダウンロードすることができます。
https://corporate.jp.sharp/8k5g/8klab/ai-edge_report_202505.html
AMD社製FPGA評価基板であるKV260は、研究開発用途として手ごろな価格帯で提供されています。Webカメラとの接続が可能なUSBポートや、映像出力のためのHDMI/DisplayPortポートを備えているため、物体認識や超解像に必要なデータの入出力が行えます。また、KV260に関する情報はネット上に豊富にあり、CEATEC2024の企業ブースでも使用されるなど、FPGAユーザーの間でポピュラーな評価基板です。KV260の詳細については、以下を参照ください。
https://www.amd.com/ja/products/system-on-modules/kria/k26/kv260-vision-starter-kit.html
では、早速参りましょう。
システム構成
KV260で4DTCを動かす際のシステム図を、以下に示します。
本稿の構成
以下の手順で動作確認を行います。
AI高位合成ツールによる4DTCのRTLを生成
Vivadoで4DTCプロジェクトを合成
KV260の4DTC用ROMファイル(.bit.bin、.dtbo)の作成
KV260での実行準備(ROMファイルをコピー、ROMのロード)
4DTC用Cプログラムでの動作確認(mnist)
AI高位合成ツールによる4DTCのRTLの生成
以下のHPからAI高位合成ツールの本体(AIRTIPS_v1.0.zip)をダウンロードし、ファイルを展開します。
https://corporate.jp.sharp/8k5g/8klab/ai-edge_report_202505.html
展開先のフォルダ名を「DEVREL_AIRTIPS」とします。以下のコマンドにより、4DTCのRTLを生成します。
今回、channel=8の回路生成します。channel=16の回路は規模が大きいため、KV260に実装することができません。
~/DEVREL_AIRTIPS/tool/4dtc_gen$ python3 4dtc_gen.py channel=8 axi=1 dmac=1 axi_bus=128
同じフォルダに、rtlフォルダが作成されていることを確認して下さい。
~/DEVREL_AIRTIPS/tool/4dtc_gen/rtl$ ls
ai ai_core.v ai_in_buf.v ai_out_buf.v axi128_dmac.v
4DTCのTOPモジュールはai_core.vです。しかし、本モジュールは、ZYNQと接続できません。そのため、rtlフォルダに、ai_core_wrap.vを新規に追加します。
また、Vivadoで合成するための乗算回路のサンプルも追加します。これらの回路は合成環境に応じて変更する必要があります。Vivadoの場合、DSP IPをそれぞれ作成することもできますが、今回は、Vivadoの推論機能を利用して、本サンプルの乗算回路にDSPを割り当てます。
Vivadoの推論機能を利用すると、addmult_s27s27s18.vの加算と乗算とに一つずつDSPが割り当てられます。VivadoのDSP IPにより、加算と乗算とを一つのDSPで実現することで、DSPの数を削減することも可能です。
Vivadoで4DTCプロジェクトを合成する方法
AMD社のHW開発プラットフォームであるVivadoで、回路を合成します。
合成に使用したPCの仕様、及びVivadoのバージョンは、以下の通りです。
PC
11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz
メモリ:64 GB
OS
Ubuntu 20.04.6 LTS
Vivado Version
2023.2(添付のファイルを修正することで、2022.2での合成も可能。ファイルの修正方法は、追記に記載。)
プロジェクトの作成/合成
Vivadoのスクリプトを使用し、プロジェクトの作成/合成を行います。
以下のコマンドにより、Vivadoのセッティングを行います。Vivadoのインストールフォルダが異なる場合、自身の環境にあわせてコマンドを修正して下さい。
source /tools/Xilinx/Vivado/2023.2/settings64.sh
Vivadoのスクリプト(make_project_1_batch.sh、make_project_1.tcl)を、ダウンロードし、DEVREL_AIRTIPSフォルダに置いてください。
以下のコマンドを実行して下さい。
~/DEVREL_AIRTIPS$ sh make_project_1_batch.sh
合成完了後、impl_1フォルダにsystem_wrapper.binができていることを確認して下さい。
~/DEVREL_AIRTIPS$ ls project_1/project_1.runs/impl_1/*.bin
project_1/project_1.runs/impl_1/system_wrapper.bin
私の環境で合成した場合、systemの合成時間は5分17秒、synthの合成時間は35秒、implの合成時間は15分9秒でした。
回路規模の一例を以下に示します。
ブロックの結線図を以下に示します。
Address Editorの内容を以下に示します。
追記:
Vivado Version 2022.2でも、合成できることを確認しています。この場合、make_project_1.tclについて、以下の修正が必要です。
#修正前
create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.5 zynq_ultra_ps_e_0
#修正後
create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.4 zynq_ultra_ps_e_0
KV260の4DTC用ROMファイル(.bit.bin、.dtbo)の作成
コンフィグROMの作成のための準備
DEVREL_AIRTIPSフォルダに、make_romフォルダを作成し、以下の4つのファイルを置いてください。
以下のようなフォルダ構成になります。
~/DEVREL_AIRTIPS$ tree make_rom/
make_rom/
├── createdts.tcl
├── export_hardware.sh
├── export_hardware.tcl
└── make.sh
export_hardware.tclファイルの1行目について、自身の環境に合わせてproject_directoryの値を変更してください。私の環境では、以下のようになります。
set project_directory /home/tatsuya/DEVREL_AIRTIPS/project_1
ファイルの作成
Vivadoのセッティング(source /tools/Xilinx/Vivado/2023.2/settings64.sh)の後、make_romフォルダで、make.shを実行して下さい。
~/DEVREL_AIRTIPS/make_rom$ sh make.sh
ROMファイルが作成されると、ログの最後に、INFO: Device tree generation successfulと表示されます。ROMファイルとして、project_1.bit.bin、project_1.dtboが作成されていることを確認して下さい。
~/DEVREL_AIRTIPS/make_rom$ ls
createdts.tcl make.sh vivado.jou
device-tree-xlnx mydevice vivado.log
export_hardware.sh project_1.bit.bin
export_hardware.tcl project_1.dtbo
追記:
Vivado Version 2022.2でも、ROMファイルを作成できることを確認しています。この場合、createdts.tclを以下の修正が必要です。
#修正前
createdts -hw ../project_1/project_1.sdk/system_wrapper.xsa -zocl -out . -platform-name mydevice -git-branch xlnx_rel_v2023.2 -compile -overlay
#修正後
createdts -hw ../project_1/project_1.sdk/system_wrapper.xsa -zocl -out . -platform-name mydevice -git-branch xlnx_rel_v2022.2 -compile -overlay
KV260での実行準備(ROMファイルをコピー、ROMのロード)
Ubuntu 22.04 LTSが動作するKV260で動作確認を行います。
以下は、KV260上で操作します。
ROMファイルのコピー
/lib/firmware/xilinxフォルダに、project_1フォルダを新規に作成します。project_1フォルダに、ROMファイルであるproject_1.bit.bin、project_1.dtboとshell.jsonをコピーします。ROMファイルはUSBメモリを介してコピーすることができます。また、scp等によりROMファイルをコピーすることもできます。
ubuntu@kria:/lib/firmware/xilinx/project_1$ ls
project_1.bit.bin project_1.dtbo shell.json
shell.jsonを以下に示します。
ubuntu@kria:/lib/firmware/xilinx/project_1$ cat shell.json
{
"shell_type" : "XRT_FLAT",
"num_slots": "1"
}
ROMのロード
sudo xmutil listappsで、ロードされているROMファイルを確認します。起動時はk26-starter-kitsがロードされています。
ubuntu@kria:~$ sudo xmutil listapps
Accelerator Accel_type Base Base_type #slots(PL+AIE) Active_slot
k26-starter-kits XRT_FLAT k26-starter-kits XRT_FLAT (0+0) 0,
project_1 XRT_FLAT project_1 XRT_FLAT (0+0) -1
sudo xmutil unloadappで、ROMファイルをアンロードします。
ubuntu@kria:~$ sudo xmutil unloadapp
Accelerator successfully removed.
project_1のROMファイルをロードします。
ubuntu@kria:~$ sudo xmutil loadapp project_1
Accelerator loaded to slot 0
4DTC用Cプログラムの動作確認(mnist)
mnistを動作させる方法について説明します。
4DTC用Cプログラムのコンパイルの準備
4DTCのCプログラムのコンパイルのために必要なライブラリを、KV260にインストールします。以下の通り、uuid-devをインストールして下さい。必要であれば、xrtをインストールしてください。
sudo apt install uuid-dev
sudo apt install xrt
AIRTIPSの実行
AI高位合成ツール(AIRTIPS_v1.0.zip)の sample/mnist/mnistフォルダにあるreadme.mdを参考に、4DTCのエミュレータの実行までの動作を確認して下さい。KV260でAIRTIPSの動作確認を行うと時間がかかるため、Vivado合成用PC等で行うことを推奨します。
~/DEVREL_AIRTIPS/sample/mnist/mnist/readme.md
動作を確認した結果、/sample/mnist/mnist/4dtcフォルダにmodels.cppがあることを確認して下さい。
4DTCを動かすためのファイルを、KV260へコピー
KV260上で、AI高位合成ツール(AIRTIPS_v1.0.zip)を展開して下さい。展開したフォルダをAIRTIPSとして説明します。
「AIRTIPSの実行」の節で確認した/sample/mnist/mnist/4dtcフォルダのmodels.cppを、KV260の同じフォルダへコピーします。KV260でのフォルダ内のファイルを以下に示します。
ubuntu@kria:~/AIRTIPS/sample/mnist/mnist/4dtc$ ls
4dtc.h 4dtc_emu.cpp main_models.cpp make_emu.sh pams.cpp
4dtc_dmac.cpp log make.sh models.cpp pams.h
4DTCの動作確認
make.shを実行します。warningは特に問題ありません。modelsという名前の実行ファイルができていることを確認して下さい。
ubuntu@kria:~/AIRTIPS/sample/mnist/mnist/4dtc$ sh make.sh
main_models.cpp: In function ‘int main()’:
main_models.cpp:135:34: warning: unknown conversion type character ‘)’ in format [-Wformat=]
135 | printf("4DTC : %d / %d (%03.2f%)\n", pams_pass, num_pass, (float)pams_pass*100./(float)num_pass);
| ^
./modelsを実行します。sudoコマンドをつけて実行して下さい。sudoコマンドをつけない場合、Segmentation fault (core dumped)になります。./modelsを実行した結果の一例を以下に示します。
ubuntu@kria:~/AIRTIPS/sample/mnist/mnist/4dtc$ sudo ./models
*** MNIST ***
load "../sample.txt"
bo0.size() :0xc000000
bo0.address():0x3b800000
bo0.map() :0xffff83390000
O.K.
AI FFFF8F435000
A1000000
AI RAM FFFF83390000
3B800000
4DTC : 4 / 4 (100.00%)
4 ms (1.000 ms)
参考として、エミュレータ(4DTCを使用せず、CPUのみで計算)を実行した結果を以下に示します。
ubuntu@kria:~/AIRTIPS/sample/mnist/mnist/4dtc$ ./models_emu
*** MNIST ***
load "../sample.txt"
4DTC : 4 / 4 (100.00%)
292 ms (73.000 ms)
入力画像と出力結果の説明
今回実行したプログラムの入力画像は/sample/mnist/mnist/sample.txtです。sample.txtには4つの数字(「0」、「1」、「2」、「7」)のlabelと画像データとが記載されています。sample.txtのデータの内、「0」の部分のデータを以下に示します。
1行目がlabel「0」です。2行目から29行目が画像データです。画像データは0から127までの数値です。画像Viewerで見た場合の画像を以下に示します。
実行プログラムの出力結果の数値を確認するために、sample/mnist/mnist/4dtc/main_models.cppの127行目以降に以下のコードを追加します。ai_y[]が4DTCの出力値です。
122 if (max_num==test_label[i]){
123 pams_pass++;
124 }else{
125 }
126
127 //追加コード
128 for(j=0;j<10;j++){
129 printf("%d ", ai_y[j]);
130 }
131 printf("\n");
132 }
make.shでコンパイルし、再度実行した場合の結果の一例を、以下に示します。
*** MNIST ***
load "../sample.txt"
...
12 -23 -14 -28 -32 -22 -13 -21 -8 -3
-14 6 -8 -12 -3 -12 -1 -14 -4 -14
-43 -17 12 -12 -11 -41 -51 -20 -13 -10
-35 -34 -9 -10 -27 -22 -34 9 -18 -11
4DTC : 4 / 4 (100.00%)
4DTCの出力結果について、1枚の画像から10個の数値が出力されます。これは、「0」から「9」までの確率に相当し、値が高いほど、その数値である確率が高くなります。
labelが「0」の場合の出力値は、12 -23 -14 -28 -32 -22 -13 -21 -8 -3で、「0」に相当する数値 12が一番高くなるため、「0」と判別されます。
同様に、label「1」の場合、「1」に相当する数値6が一番高くなります。
label「2」の場合、「2」に相当るする数値12が一番高くなります。
label「7」の場合、「7」に相当する数値9が一番高くなります。
上記によって、入力のlabelデータと、4DTCによる出力結果とが一致していることを確認することができました。
AI高位合成ツール「AIRTIPS」で独自AIアクセラレータ(4DTC)をKV260で動かす方法の説明は以上です。
前回、AI高位合成ツール「AIRTIPS」で、エッジAIの未来を拓く~AIRTIPS導入編~の記事で、AIRTIPSについてご紹介しましたが、大変多くの方に「スキ」を頂き、心よりお礼申し上げます!
次回の記事(AIRTIPS実践編②)では、4DTCでAI超解像を動かす方法について掲載します。
参考文献
最後まで読んでいただき、ありがとうございました。
コメント