ONNXをDPUとVitis AI環境で動かしてみた。Python編

本サイトはアフィリエイト広告を利用しています。
AI

ONNXのYOLOXをDPUとPythonで動かしてみました。

KR260上でONNX専用の環境構築して、onnxruntimeを実行しています。

Vitis AI ONNXRuntime Engine (VOE) を使用した旨を紹介します。

 

スポンサーリンク

ONNXをDPUとVitis AI環境で動かしてみた。YOLOX編

ONNX環境のYOLOXをDPUとPythonで動かしてみました。

KR260上でONNX専用の環境構築して、onnxruntimeを実行しています。

Vitis AI ONNXRuntime Engine (VOE) を使用した旨を紹介します。

 

 

実際のテスト動画は下記となっています。

 

 

Vitis AIの3.5のONNX

Vitis AIの3.5のONNXではC++とPythonがサポートされています。

AMD Technical Information Portal

 

またC++のYOLOXに関しては、下記に公式からサンプルが用意されています。

Vitis-AI/examples/vai_library/samples_onnx/yolovx_nano at v3.5 · Xilinx/Vitis-AI
Vitis AI is Xilinx’s development stack for AI inference on Xilinx hardware platforms, including both edge devices and Al...

 

下記記事でPyTorchのYOLOXを、DPU-PYNQ環境で作成・実行していました。

PYNQでYOLOX-nano + PyTorchの物体検出してみた

PYNQでYOLOX-nano + PyTorchの物体検出してみた
KR260のDPUを使って、物体検出をしました。YOLOX-nano+Pytorchの軽量のモデルを使用してます。YOLOv3とYOLOXの実行速度の比較までした旨を紹介します。PYNQでYOLOX-nano + PyTorchの物体検出し...

 

今回はPythonのコードを書き直して、ONNXのYOLOXを動かしています。

 

bspからpetalinuxで環境構築

今回はPetalinuxを使って、KR260上のOS環境を作成しています。

bspファイルを下記からダウンロードして、Petalinuxでビルドします。

正しい手順は下記URLを参照ください。

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+SOMs+Starter+Kits#PetaLinux-Build-instructions

 

Petalinuxで作成したsdカードのイメージ(.wic)を書き込みます。下記のフォルダにあります。

~/xilinx-kr260-starterkit-2023.1/images/linux/

筆者はbalenaEtcherを使用して、SDカードに書き込んでいます。

 

onnxruntimeをインストールする

KR260で最初のログイン名は「petalinux」です。

下記公式ドキュメントに従って、KR260にVitis AIやONNXのruntimeなどをインストールします

https://docs.amd.com/r/en-US/ug1414-vitis-ai/Programming-with-VOE

 

*今回petalinuxを使っているのは、Ubuntu環境はonnxruntimeがインストールできないためです。

一度実行してみましたが、インストールできませんでした

 

xrt packagegroup-petalinux-opencvをインストールする

公式ドキュメント通りインストール実行しても、Pythonでimportするとエラーがでました。

 

おそらくxrt周辺が入っていないと思われるエラーでしたので、下記で対応しました。

 

上記実行後は問題なく、pythonでonnxruntimeをimportできるようになりました。

 

PetalinuxでDPU環境を作成する

UbuntuではPYNQ-DPUのライブラリ経由で、FPGAのDPU環境をオーバレイが出来ました。

Petalinuxではxmutilを使って、DPU環境を用意していきます。

xmutilに必要なファイル含めて用意していきます。下記GitHubにも置いています

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/tree/main/src/onnx-test

 

この章での作業はVivado, VitisをインストールしたLinux環境で実行しています。

pl.dtbo

下記記事で作成したVivadoでのFPGAのデザインファイル(.xsa)を使います。

DPUのIPを合成して、PYNQで動かしてみた

DPUのIPを合成して、PYNQで動かしてみた
VivadoとVitisを利用して、DPUのIPを合成したプロジェクトを作りました。KR260でPYNQ上で作成したDPUを使い、Vitis AIの物体検出(YOLOv3)をしています。その上でKR260にて、GPIO(PWM)も一緒に動か...

 

下記コマンドにより、CUIのVitis経由でデバイスツリーの「pl.dtbo」のファイルを作成します。

 

shell.json

XRT_FLAT情報を記載した「shell.json」ファイルも作成しておきます。

DPUをロードするときに必要なファイルとなります。

 

dpu.xclbin

またVitisでDPUを合成時に作成したDPUのビットストリームファイル(dpu.xclbin)も使います。

今回のDPUはB4096の300MHzで動作させています。

Vitisのプロジェクトの「***_hw_link」のフォルダにあります。

~/***_hw_link/Hardware/

 

vart.conf

Vitis AI ランタイム (VART) の設定ファイルである、vart.confも作成しときます。

 

今回はdpu.xclbinを置くファイル場所を記載しているだけです。

「firmware: /home/petalinux/onnx-test/dpu.xclbin」

 

onnxruntimeなどをインストール時に下記フォルダに自動的に作成されていました。

/etc/vart.conf

デフォルトは「firmware: /run/media/mmcblk0p1/dpu.xclbin」となっていました。

今回は仮にテストする仮のフォルダを指定し直しています。

 

ONNXを動かすときにvart.confを参照して実行します。

正しい記載にしておかないとプログラム実行時に下記のようなエラーが出ました。

F20240706 09:27:39.314198 1134 xrt_bin_stream.cpp:53] [UNILOG][FATAL][VART_OPEN_DEVICE_FAIL][Cannot open device] open(/run/media/mmcblk0p1/dpu.xclbin) failed.

 

ONNXのYOLOXのモデル(.onnx)

今回はVitis AIから提供されているモデルを使用します。

学習済・量子化済のモデルは、Xilinx(AMD)からサンプルが提供されています。

PyTorchのモデルをONNXに変換したものです。

 https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo/model-list/pt_yolox-nano_3.5

 

YOLOXのサンプルのモデルをダウンロードして解凍します。

 

「quantized」のフォルダの中に「yolox_nano_onnx_pt.onnx」があります。

特にコンパイルなどせず、そのままKR260に送ります。

 

ONNXのYOLOXのPythonのプログラム(.py)

実際に動かしたプログラムは下記GitHubに置いています。

このプログラムをKR260上で実行しています。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/src/onnx-test/onnx-yolox.py

 

onnxruntimeをインポートして、onnxで推論できるようにセッションを作成しています。

プログラムの一部を下記に記載します。

公式の手順ではconfigファイルが下記記載でしたが、KR260上の配置に修正しました。

provider_options=[{"config_file":"/etc/vaip_config.json"}]

 

あとPyTorchをそのままONNXに変換しているため、特に高速化はできていません。

sigmoid,softmaxの処理もPyTorch同様に入れています。

あとONNXのためにswapもしているので、PyTorchより後処理は遅くなっています。

 

KR260でONNXのテスト

KR260に作成したファイルを送付します。

最初にDPUをxmutilでロードできるように設定しています。

b4096_300mというアプリケーションを作成しました。

 

また作成したvart.confに差し替えました。

 

一度Rebootするのをおススメします。

ここからは冒頭でも紹介したデモ動画の流れと同じになります。

 

最初にDPUのアプリケーション(b4096_300m)をロードします。

 

 

用意したPythonのプログラムを実行します。

onnx-testというフォルダ内で実行しています。

 

 

プログラムを実行すると、DPUに合わせるようにコンパイルが開始されます。

※最初は数分かかります。2回目以降はコンパイルは省略されて速くなります。

ログを見ると、ロードされているDPUを読み取り、DPUモードでコンパイルしています。

Compile mode: dpu
Debug mode: performance
Target architecture: DPUCZDX8G_ISA1_B4096_0101000016010407
Graph name: torch_jit, with op num: 815
Begin to compile...

 

 

 

 

コンパイルが終わると、Pythonのプログラムが実行されます。

 

実際のログを貼り付けておきます。

 

今回は写真1枚をYOLOXで画像認識しています。

実際に画像認識させた結果を表示すると、問題なくオレンジ色のボールが認識されていました。

 

 

 

TensorFlow2のYOLOv3、PyTorchのYOLOXとの比較

正確な比較になりませんが、下記記事にてUbuntu環境でテストした内容と速度を比べてみます。

TensorFlow2のYOLOv3、PyTorchのYOLOXでも同様なテストをしました。

 

前処理・DPUでの推論・後処理の各比較をすると下記結果となりました。

今回のONNXのYOLOXでは、元のPyTorchから特に何も高速化していません。

YOLOXの2つはほぼ同じ結果となり、ある意味狙い通りの結果となりました。

 

ONNXでYOLOXのCPUとDPUを比較

ONNXを使えるようになると、KR260上のCPUとDPUの比較も簡単になります。

同じプログラムの1行を修正するだけで、DPUではなくCPUでの推論(inference)にできます。

providers=["CPUExecutionProvider"]

 

実際にテストしたデモ動画です。

 

ONNX+CPUでも問題なくYOLOXの物体検出が出来ています。

 

DPUの推論(inference)は、CPUと比べて約20倍以上の速度が出ていました。

 

今までのYOLOv3とYOLOXのPyTorchとも、まとめて比較すると下記グラフになります。

DPUを使うことで高速化できることが、よく分かります。

 

まとめ

ONNXのYOLOXをDPUとPythonで動かしてみました。

KR260上でONNX専用の環境構築して、onnxruntimeを実行しています。

Vitis AI ONNXRuntime Engine (VOE) を使用した旨を紹介しました。

 

今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。

AMD(Xilinx)のFPGAコンテストに参加した感想

AMD(Xilinx)のFPGAコンテストに参加した感想
AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。AMD Pervasive AI Developer Contest の「Robotics AI」部門です。KR260というFPGAボ...

コメント