Vitis AI 3.5とKV260でYOLOXを動かしてみました。
AMD(Xilinx)のサンプルで公開されているモデルを動かしたメモです。
SDカードの作り方からruntimeのインストール含めて紹介します。
Vitis AI 3.5とKV260でYOLOXを動かしたメモ
Vitis AI 3.5とKV260でYOLOXを動かしてみました。
(KV260…Xilinx(AMD)のFPGAが搭載された評価ボード)
物体検出のサンプルプログラムをテストした内容を紹介します。
ハード環境
KV260のFPGA評価ボードの環境でテストしています。使ったDPUの詳細は後述。
- 評価ボード…KV260
- DPU(Deep-Learning Processor Unit)…DPUCZDX8G_ISA1_B4096
このKV260は下記の第6回AIエッジコンテストで使用したFPGAボードです。
ソフト環境
ソフト環境は2023年版で揃えています。
- Vitis AI 3.5
FPGA向けにYOLOXのモデルをコンパイルするVitis AIは下記手順でインストールできます。
Vitis AI 3.0でPyTorchのCPUとGPUの環境を構築したメモ
KV260へのプラットフォームに関しては下記で対応できます。
- Vivado 2023.1
- Vitis 2023.1
- Petalinux 2023.1
インストール方法に関しては下記で紹介した2022年版と同様にできました。
最新版にはアップデートしていませんが、(去年の)下記記事が参考になるかと思います。
Vitis AIライブラリのパッケージ
Verが変わるとパッケージに関するファイルが変わってきます。
基本的には公式の最新版のパッケージ(runtimeやインストールファイル)を確認ください。
KV260のプラットフォーム
KV260のプラットフォーム作成・設定に関しては下記記事を参考にしています。
これ以降は、下記のプラットフォームが設定済の旨で記載しています。
2022年版の記事ですが、2023年版のソフト環境でも基本的に同じ方法で行けました。
最初にIPブロックでハードウェア作成の時にスクリプトを使う場合は変更が必要でした。
(zynq_ultra_ps_eのVerが3.4→3.5に変わっていましたので、変更しました)
Vitis AIのライブラリをダウンロードする際には、型番も変わりますのでご注意ください。
また解凍するコマンド(tar)のときも同様に変更しました
dpu_conf.vhのDPUのサイズも最大のものでテストしています。
プラットフォーム名は変えて「aiedge_4096」としています。
define B3136 →
define B4096
作成したプラットフォームのファイルは、後でYOLOXのモデルと一緒にKV260に送ります。
KV260用のSDカードを作る
下記記事を参考にKV260のSDカードを作ります
筆者が今回のテストした時期は、2023年の8月頭でした。
その時はXilinxの下記WikiページにKV260用にプレビルドしたイメージがありませんでした。
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM#PetaLinux
ビルド元のBSPファイルは下記にありますので、ダウンロードしてpetalinuxを動かします。
1 2 3 4 5 |
petalinux-create -t project -s xilinx-kv260-starterkit-v2023.1-05080224.bsp cd xilinx-kv260-starterkit-2023.1/ petalinux-build petalinux-package --boot --u-boot --force petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot,boot.scr,Image,system.dtb,system-zynqmp-sck-kv-g-revB.dtb" --disk-name "mmcblk1" |
作成したSDイメージ(petalinux-sdimage.wic)をbalenaetcherなどを使って書き込みます。
/xilinx-kv260-starterkit-2023.1/images/linux の箇所にあります
KV260上での最初の立ち上げは下記を参考にさせてもらいました。
同様にKV260にVitis AIのruntimeをインストールしました。
https://qiita.com/basaro_k/items/b164a56e978001b8161e
1 2 3 4 5 6 |
sudo resize-part /dev/mmcblk1p2 sudo dnf install xrt packagegroup-petalinux-opencv wget https://www.xilinx.com/bin/public/openDownload?filename=vitis-ai-runtime-3.5.0.tar.gz -O vitis-ai-runtime-3.5.0.tar.gz tar -xzvf vitis-ai-runtime-3.5.0.tar.gz cd vitis-ai-runtime-3.5.0/2023.1/aarch64/centos/ sudo bash ./setup.sh |
KV260用のYOLOXのモデルをコンパイル
Vitis AIを使って、YOLOXのモデルをFPGA用にコンパイルする必要があります。
下記記事の内容を同様に実施しました。
実際にFPGAで使用するDPU(B4096)にあった形で変換します。
Vitis AIでPytorchのcompileをしてみたメモ
学習済のコンパイル前のモデルは、Xilinx(AMD)からサンプルが提供されています。
今回使用するサンプルは下記にあります。
https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo/model-list/pt_yolox-nano_3.5
COCOのデータセットでYOLOX
サンプルの内容としてはCOCOという画像のデータセットを使って学習していした。
COCOのデータセットは誰でも簡単に入手可能です。
筆者もColabの環境でデータセットの入手、また学習~テストも実施しています。
(1年以上前のテストなので、現在は多少コマンドも変わっていると思います)
参考までに下記にURLを貼っておきます
COCOのデータセットの簡単な使い方!FiftyOneを試してみた
サンプルモデルをダウンロード
サンプルのモデルをダウンロードして解凍します。
1 2 |
wget https://www.xilinx.com/bin/public/openDownload?filename=pt_yolox-nano_3.5.zip unzip openDownload\?filename\=pt_yolox-nano_3.5.zip |
「pt_yolox-nano_3.5」の方がサンプルです。
この中のReadmeにはモデルの学習からFPGA向けに量子化する手順が記載されています。
実行後の完成ファイルもquantizedフォルダに用意されていますので、コンパイルに使います。
prototxtファイルを用意する
KV260でYOLOXを使うには、モデルのパラメータなど記載したファイル(prototxt)が必要です。
本来は自分で作る必要があるのですが、少し楽をします。
下記でKV260とは違ったFPGA向けですが、Xilinxからコンパイル済のモデルを入手します。
1 2 |
wget https://www.xilinx.com/bin/public/openDownload?filename=yolox_nano_pt-vek280-r3.5.0.tar.gz tar -xzvf openDownload\?filename\=yolox_nano_pt-vek280-r3.5.0.tar.gz |
この中にyolox_nano_pt.prototxtが入っていますので、そこだけ使わせてもらいます。
arch.jsonを作成
コンパイルする際には、実際にFPGAに使うDPUのモデル名(arch.json)を指定します。
今回使用するDPUCZDX8G_ISA1_B4096の型番に合わせています。
1 2 3 |
{ "fingerprint": "0x101000016010407" } |
テキストで作っても構いませんし、下記のようにechoコマンドで作っても大丈夫です。
1 2 3 |
echo '{' > arch.json echo ' "fingerprint": "0x101000016010407"' >> arch.json echo '}' >> arch.json |
fingerprintではなくtargetで指定できるが…
Xilinx(AMD)公式ではarch.jsonでモデル名を"target"で指定している場合があります。
Vitis AI内のcompilerの中身を見ても、下記で記載されていました。
1 2 3 4 |
vitis-ai-user@iotengineer-Inspiron-3650:/opt/vitis_ai/compiler/arch/DPUCZDX8G/KV260$ cat arch.json { "target": "DPUCZDX8G_ISA1_B4096" } |
コンパイルも可能なのですが、実際にKV260での動作させるとエラーが発生します。
DPUとモデルのfingerprintが一致していない旨のエラーです
1 2 3 4 5 6 |
xilinx-kv260-starterkit-20231:/usr/share/vitis_ai_library/samples/yolovx$ ./test_jpeg_yolovx yolox_nano_pt sample_yolox_nano.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR W20230728 21:59:52.270054 1012 dpu_runner_base_imp.cpp:733] CHECK fingerprint fail! model_fingerprint 0x101000056010407 is un-matched with actual dpu_fingerprint 0x101000016010407. Please re-compile xmodel with dpu_fingerprint 0x101000016010407 and try again. F20230728 21:59:52.270263 1012 dpu_runner_base_imp.cpp:695] fingerprint check failure. *** Check failure stack trace: *** Aborted |
基本的にはtargetではなく、fingerprintを直接入力した方が良さそうです。
Please re-compile xmodel with dpu_fingerprint 0x101000016010407 and try again.
おそらくVitis AIのバージョンにより型番(fingerprint)が変わる影響かとは思います。
Vitis AIでコンパイル
Vitis AIを使ってコンパイルします。今回はCPU版のVitis AIを立ち上げています。
(コンパイル自体はCPU版でもGPU版でも変わりありません。)
1 2 3 |
cd Vitis-AI/ ./docker_run.sh xilinx/vitis-ai-pytorch-cpu:latest cd pt_yolox-nano_3.5/ |
先ほど作ったarch,jsonも引数にして、コンパイルします。
必要に応じてファイルを移動させてください。コンパイルは下記のように実行できました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
vitis-ai-user@iotengineer-Inspiron-3650:/workspace/pt_yolox-nano_3.5$ vai_c_xir -x quantized/YOLOX_0_int.xmodel -a arch.json -n yolox_nano_pt -o ./yolox_nano_pt ************************************************** * VITIS_AI Compilation - Xilinx Inc. ************************************************** [UNILOG][INFO] Compile mode: dpu [UNILOG][INFO] Debug mode: null [UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096 [UNILOG][INFO] Graph name: YOLOX_0, with op num: 808 [UNILOG][INFO] Begin to compile... [UNILOG][INFO] Total device subgraph number 5, DPU subgraph number 1 [UNILOG][INFO] Compile done. [UNILOG][INFO] The meta json is saved to "/workspace/pt_yolox-nano_3.5/./yolox_nano_pt/meta.json" [UNILOG][INFO] The compiled xmodel is saved to "/workspace/pt_yolox-nano_3.5/./yolox_nano_pt/yolox_nano_pt.xmodel" [UNILOG][INFO] The compiled xmodel's md5sum is 0f2985c017da7da972d180071aa1cfa6, and has been saved to "/workspace/pt_yolox-nano_3.5/./yolox_nano_pt/md5sum.txt" |
コンパイル後に作成されるフォルダの中に.xmodelが作成されます。
またその中にダウンロードしたprototxtファイルも入れておきます。
後ほどKV260にまとめて送ります。
KV260でYOLOXを動かす
予め事前に作成したプラットフォームとYOLOXのモデルをKV260に送付します。
とりあえず、ホームディレクトリに入れておきました。
1 2 |
scp -r sd_aiedge_4096/ petalinux@192.168.11.5:~ scp -r yolox_nano_pt/ petalinux@192.168.11.5:~ |
Vitis AI Libraryが参照するフォルダにモデル・prototxtのファイルをコピーします。
/usr/share/vitis_ai_library/models/yolox_nano_pt/
もし指定の箇所にモデルなどを入れずにテストすると、下記のようにエラーとなります。
1 2 3 4 5 6 7 8 9 |
xilinx-kv260-starterkit-20231:/usr/share/vitis_ai_library/samples/yolovx$ ./test_jpeg_yolovx yolox_nano_pt sample_yolox_nano.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR F20230728 17:40:07.311750 1071 configurable_dpu_task_imp.cpp:108] [UNILOG][FATAL][VAILIB_DPU_TASK_NOT_FIND][Model files not find!] cannot find model <yolox_nano_pt> after checking following dir: . . /usr/share/vitis_ai_library/models /usr/share/vitis_ai_library/.models *** Check failure stack trace: *** Aborted |
実際テスト実行する箇所は下記です。ビルド済みのテストサンプルが置かれています。
/usr/share/vitis_ai_library/samples/yolovx/
筆者は画像認識したい写真(sample_yolox_nano.jpg)をコピーして、テストしました。
実際のコマンド履歴は下記です。無事KV260とYOLOXで画像認識できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
xilinx-kv260-starterkit-20231:~$ sudo cp -r sample_yolox_nano.jpg /usr/share/vitis_ai_library/samples/yolovx/ Password: xilinx-kv260-starterkit-20231:~$ sudo xmutil listapps Accelerator Accel_type Base Base_type #slots(PL+AIE) Active_slot aiedge_4096 XRT_FLAT aiedge_4096 XRT_FLAT (0+0) -1 k26-starter-kits XRT_FLAT k26-starter-kits XRT_FLAT (0+0) 0, xilinx-kv260-starterkit-20231:~$ sudo xmutil unloadapp remove from slot 0 returns: 0 (Ok) xilinx-kv260-starterkit-20231:~$ sudo xmutil loadapp aiedge_4096 aiedge_4096: loaded to slot 0 xilinx-kv260-starterkit-20231:~$ cd /usr/share/vitis_ai_library/samples/yolovx xilinx-kv260-starterkit-20231:/usr/share/vitis_ai_library/samples/yolovx$ sudo ./test_jpeg_yolovx yolox_nano_pt sample_yolox_nano.jpg WARNING: Logging before InitGoogleLogging() is written to STDERR I20230728 22:53:28.175791 1005 demo.hpp:1276] batch: 0 image: sample_yolox_nano.jpg I20230728 22:53:28.175977 1005 process_result.hpp:32] RESULT: 0 529.68 436.81 750.32 720.11 0.703185 I20230728 22:53:28.176121 1005 process_result.hpp:32] RESULT: 0 162.73 347.35 526.50 711.12 0.696535 I20230728 22:53:28.176221 1005 process_result.hpp:32] RESULT: 0 1077.70 436.81 1211.53 720.11 0.687132 I20230728 22:53:28.176309 1005 process_result.hpp:32] RESULT: 0 74.15 347.35 541.24 711.12 0.662223 I20230728 22:53:28.176419 1005 process_result.hpp:32] RESULT: 0 -12.53 369.71 554.07 713.37 0.662223 I20230728 22:53:28.176512 1005 process_result.hpp:32] RESULT: 0 819.24 424.50 953.07 707.81 0.661353 I20230728 22:53:28.176597 1005 process_result.hpp:32] RESULT: 0 -6.27 359.65 277.04 723.42 0.635500 I20230728 22:53:28.176688 1005 process_result.hpp:32] RESULT: 0 794.63 384.27 928.45 748.04 0.597695 I20230728 22:53:28.176782 1005 process_result.hpp:32] RESULT: 0 -2.88 338.35 101.34 621.65 0.568252 I20230728 22:53:28.176862 1005 process_result.hpp:32] RESULT: 0 932.50 424.50 1036.73 707.81 0.555279 I20230728 22:53:28.176956 1005 process_result.hpp:32] RESULT: 0 1190.19 359.65 1271.35 723.42 0.496519 I20230728 22:53:28.177047 1005 process_result.hpp:32] RESULT: 0 677.04 387.84 762.96 621.39 0.483838 I20230728 22:53:28.177136 1005 process_result.hpp:32] RESULT: 0 907.89 436.81 1012.11 720.11 0.381818 I20230728 22:53:28.177220 1005 process_result.hpp:32] RESULT: 0 649.43 418.91 753.65 639.55 0.365529 |
YOLOXで物体検出する前の写真は下記です。下記記事の際に撮影したものです。
ブライトンのチケットを公式から買って、イギリスで観戦してみた話
物体検出した後に出力された写真が下記となります。
人が緑枠でそこそこ検出されています。
まとめ
Vitis AI 3.5とKV260でYOLOXを動かしてみました。
(KV260…Xilinx(AMD)のFPGAが搭載された評価ボード)
もし興味がある方は同様にテストしてみてください。
コメント