オープンソースのPyTorchモデルをVitis™ AI (1.4)を用いて、So-One KITで動かしてみた

-
皆さまこんにちは!TEPPE-AIです!
早くも、So-Oneの記事第3弾です!
急激に寒くなったため、体調を崩さないよう気を付けて過ごしていきます!
皆さまも、どうか体調にはお気を付けて、寒い季節を楽しみましょう!!さて、今回もビッグタイトルですよー!
「オープンソースのPyTorchモデルをVitis™ AI (1.4)を用いて、So-One KITで動かしてみた」
今回は、オープンソースで公開されているPyTorchの画像分類AIモデルをVitis™ AI(1.4)を用いてSo-One KIT上で動作させました!
※今回試したOSSはこちらです↓ cifar-10で学習させたVGG19です。
https://github.com/kuangliu/pytorch-cifar
今までは、既に学習し量子化されているAIモデルを動かしていましたが、実運用を想定すると
「学習→量子化→コンパイル→実装」一連の流れを把握していないと、なかなか難しいですよね。
今回の記事を見ていただくことで、「学習→量子化→コンパイル→実装」一連の流れを把握でき、 皆さまでお持ちのPyTorchのAIモデルを、SO-One KIT上で評価を行うことができます!
是非最後まで見てくださいね!
それでは参りましょう!
目次
今回の作業について
PCおよび評価ボードの環境構築は、一部を除き省略させていただきます。
前回の記事にて、環境構築を行っておりますので、あわせてそちらをご参照いただければと思います!
※前回の記事はこちら !
「一部」 についてですが、今回GPUを用いた作業を行います。
前回はGPU未使用でしたので、この差異で生じる環境構築については、記載していきます。
また、今回はGitHubにて公開されているVitis™-AI-Tutorialに沿って進めていきます。
Vitis™-AI-Tutorialは以前の記事でも紹介していますので、そちらも見てみてください!
※紹介記事はこちら!
PyTorchモデルの実装以外にも、YOLOv4の実装など様々なチュートリアルが公開されていますので学習から実装までを把握されたい場合は、是非お試しください!
https://github.com/Xilinx/Vitis-AI-Tutorials/tree/master/Design_Tutorials/09-mnist_pyt
こちらもあわせてご参照ください!!
Vitis™ AIを用いた、PyTorchモデルの実装概要
Vitis™ AIは、Caffe, Tensorflow(1.x, 2.x), PyTorch(1.1~1.7.1)に対応しています。
その中でもPyTorchについては、変換フローが他のフレームワークと多少異なります。
https://github.com/Xilinx/Vitis-AI-Tutorials/tree/master/Design_Tutorials/09-mnist_pyt#introduction
上記が、Vitis™ AI Tutorialに記載されているPyTorchモデル実装フローの概要図です。
ざっくり説明しますと、
- ①【Step 0 - training】
-PyTorch環境で、MNISTを学習させたモデル(FP)を作成 - ②【Step 1 - quantization】 (f_model.pth → CNN_int.xmodel)
-vai_q_pytorchでPyTorchモデル(f_model.pth)を量子化 - ③【Step 2 - compile】 (CNN_int.xmodel → CNN_ZCU102.xmodel)
-vai_c_xirで実装先デバイスに合わせてコンパイル
量子化を行うvai_q_pytorchについては、pythonスクリプトにプラグインした形で実行可能です。
※以下が、Tutorialで公開されている量子化コードの一部です。(quantize.py)
黄色でハイライトしている箇所で、vai_q_pytorchをimportしています。
量子化を実行すると、CNN_int.xmodelが生成されますが、このxmodelでは、まだ実装に用いることはできません。
更にvai_c_xirでコンパイルすることで、実装先デバイスの情報が付与されたxmodel(CNN_ZCU102.xmodel)が生成されます。
vai_c_xirで生成されたxmodel(CNN_ZCU102.xmodel)を用いることで、デバイス上に実装することが可能となります。
上記のツールは、すべてVitis™ AIのdockerコンテナに実装されているので、本記事の手順に沿って環境構築いただければ問題なく使用できますので、ご安心ください!
使用機材
hostPC | OS : Ubuntu18.04 | 今回は、Linux環境が必須となりますので、ご準備をよろしくお願いいたします! このPCで「学習」「量子化」「コンパイル」「実装準備」を実行します。 |
---|---|---|
評価ボード操作用PC | OS:Windows10 | 評価ボードを操作するために用います。 今回は、TeraTermといったコンソール接続ソフトを用いて評価ボードを操作しました。 |
評価ボード | So-One KIT | ※So-One KITにご興味があるお客様はこちら! |
microSDカード | Micron製 industrial micro SD card 32GB | SDブートモードを用いて起動するので、microSDカードを用意しました。 ※So-One KITはeMMCブートでの起動も可能です。 |
※接続イメージ
事前準備
hostPC
・PyTorch (1.4)インストール
バージョン1.4のPyTorchをインストールします。
Vitis™ AIの仕様では、1.1~1.7.1まで対応しておりますが、今回参考にしたTutorialでは1.4であったので、同じ1.4で確認を行います。
PyTorchの最新版は執筆段階で1.9となっておりますので、インストールの際はご注意ください!
また、GPUを用いて学習を行うので、CUDAとのバージョン整合にも注意が必要です。
PyTorch公式サイトに、パターンに応じたダウンロード方法が記載されているので、是非ご参照ください。
以下が、該当のページです。皆さまの環境に合わせた形で構築を行ってください!
https://pytorch.org/get-started/previous-versions/
・OSSのPyTorch モデルダウンロード
学習コードが掲載されているPyTorchのモデルをGitHubからcloneします。
$ mkdir -p ~/Vitis/vitis_r1.4
$ cd ~/Vitis/vitis_r1.4
$ git clone https://github.com/kuangliu/pytorch-cifar
以下のように、「pytorch-cifar」ディレクトリが生成されていたらclose成功です!
・Vitis™ AIダウンロード
以下コマンドでダウンロードします。
$ cd ~/Vitis/vitis_r1.4
$ git clone https://github.com/Xilinx/Vitis-AI
・Vitis™ AI dockerイメージ(GPU版)インストール
GPUを用いて変換を行える、Vitis™ AI環境が構築されたdockerコンテナをインストールします。
インストール方法は、Vitis™ AI GitHubに記載されています。
以下が、インストール方法です。
作業としてはとても簡単です。
Vitis™ AI GitHubリポジトリにある「setup/docker」にあるシェルスクリプトを実行するだけでOKです。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/setup/docker
$ ./docker_build_gpu.sh
https://github.com/Xilinx/Vitis-AI#building-docker-from-recipe
インストール完了まで、約2時間かかります。
完了すると、以下のようにdocker imageのリストにlatestタグがついた状態でインストールされます。
v1.4というタグがありますが、こちらはバージョン管理するためにタグをつけて複製しました。
latestのままになると、用いた段階でのバージョンが不明瞭になるので、別途タグ付けすることをオススメします。
・Vitis™-AI-Tutorialsのダウンロード
以下コマンドでダウンロードします。
必ず、Vitis™ AIのフォルダ以下にダウンロードしてください。
※dockerを起動した際に、参照出来ないことを防ぐためです。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI
$ git clone https://github.com/Xilinx/Vitis-AI-Tutorials
・So-One KITのarch.jsonをダウンロード
このarch.jsonについては、コンパイルを行う際に用います。
こちらは、弊社が提供するリファレンスデザイン内にありますので、入手方法は前回の記事をご参照ください!
※前回の記事はこちら !
arch.jsonは以下のディレクトリにあります。
「Rev1.0/v1.0.1/040_dpu_archtecture/so-one_dpu_arch」
※so-one_dpu_arch_v1.0.1.tar.gzを解凍すると生成されます。
上記をVitis™-AI-Tutorialsのディレクトリにコピーします。
$ mkdir -p ~/Vitis/vitis_r1.4/Vitis-AI/Vitis-AI-Tutorials/So-One_arch
$ cd [任意のディレクトリ]/Rev1.0/v1.0.1/040_dpu_archtecture/so-one_dpu_arch
$ cp arch.json ~/Vitis/vitis_r1.4/Vitis-AI/Vitis-AI-Tutorials/So-One_arch
これにて事前準備完了です。
それでは、作業に移っていきましょう!!
作業(hostPC)
学習
cifar-10で学習させたVGG19モデルを構築します!
その前に・・・
学習行程が記載されているコード(main.py)の修正を行った後、学習を行います。
※変更箇所は添付図上で□で強調しています。
・用いるモデルの変更
-VGG19を用いるので、net=VGG(‘VGG19’)をコメントアウトします。
・学習済みモデルの保存名の変更
-名前は任意で大丈夫ですが、私は「ckpt_vgg19_1.4.pth」としました。
・epoch数の変更
-今回、精度は求めず、実装までスピーディーに行うために学習epoch数は「2」にします
少々分かりづらい箇所に記載があるので、ご注意願います。
※for epoch in range(start_epoch, start_epoch+2)を変更します!
これにて修正完了です!
以下コマンドで学習が開始されます
$ cd ~/Vitis/vitis_r1.4/pytorch-cifar
$ python main.py
学習中は以下のような画面が出力されます。
cifar-10の学習データ(バイナリ)もこの行程でダウンロードされます。
※jpegやbmpといった、画像ファイルではないのでご注意を!
私は既に所有していたため、「File already downloaded and verified」と出ています。
※画像クリックで大きな画像が表示されます。
学習が完了すると、checkpointディレクトリに学習済みモデルが保存されます。
最後に学習済みモデルをVitis™-AI-Tutorialのディレクトリにコピーします。
$ cd ~/Vitis/vitis_r1.4/pytorch-cifar/checkpoint
$ cp ckpt_vgg19_1.4.pth ~/Vitis/vitis_r1.4/Vitis-AI/Vitis-AI-Tutorial/Design_Tutorials/09-mnist_pyt-master_original_So-One/files/float_model
これにて学習は完了です。
次はこの学習済みモデルをVitis™ AIで量子化していきます。
量子化
Vitis™ AIのPyTorchモデルの量子化ツール(vai_q_pytorch)を用いて、量子化を行います。
概要でも記載した通り、PyTorchの場合、Pythonスクリプトを用いて量子化を実行します。
参照しているVitis™-AI-Tutorialに、量子化を実行できるPythonスクリプト(quantize.py)があるので、そちらを用います!
その前に、先ほどの「◆学習」同様、用いるPythonスクリプト(quantize.py)の修正を行います。
※変更箇所は添付図上で□(赤の四角枠)で強調しています。
・importするモジュールの追加
-VGG19を量子化するにあたり、不足しているモジュールを追加でimportします。
※「from model import *」について
VGG19のアーキテクチャをimportしていますが、こちらを用いる際には以下コマンドで Vitis™ AI Tutorialのディレクトリに、アーキテクチャが定義されているスクリプトをコピーします。
$ cd ~/Vitis/vitis_r1.4/pytorch-cifar
$ cp -r models ~/Vitis/vitis_r1.4/Vitis-AI-Tutorials/Design_Tutorials/ 09-mnist_pyt-master_original_So-One 09-mnist_pyt-master_original_So-One/files
これで完了です!
・学習済みモデル読み込み
-学習時に設定したファイル名に変更します。
・cifar-10への設定変更
-チュートリアルではMNISTを用いていたので、cifar-10用に以下を変更します。
-量子化モデルの性能評価するために読み込む画像設定もcifar-10へ変更します。
これにて修正完了です。
早速量子化を行っていきましょう!
以下コマンドで、GPU版のVitis™ AI dockerコンテナを起動して、量子化を行います。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI
$ ./docker_run.sh xilinx/vitis-ai-gpu:v1.4
以下のような画面が出力されれば、正常に起動しています。
以下のコマンドで量子化を実行します。
$ conda activate vitis-ai-pytorch
$ cd Vitis-AI-Tutorials/Design_Tutorials/09-mnist_pyt-master_original_So-One/files
$ python -u quantize.py --quant_mode calib 2>&1 | tee quant_test.log
実行中、以下のような画面が出力されます。
およそ5分かかりました。
※画像クリックで大きな画像が表示されます。
量子化が完了すると、quant_modelディレクトリに「VGG_int.xmodel」が生成されます!
最後に、以下コマンドで量子化モデルを評価します。※量子化時に行っているのですが、念のため…
$ python -u quantize.py --quant_mode test 2>&1 | tee quant_test.log
これにて、量子化完了です!お疲れ様でした!
最後に、docker環境からログアウトするためにexitを入力します。
次は、コンパイルを実施していきます!
コンパイル
最後にSo-One KIT上で動作できるよう、コンパイルを実行します。
コンパイルの前に、恒例のスクリプト(compile.sh)の修正です…
最後なので、もうひと踏ん張りです!
※変更箇所は添付図上で□(赤の四角枠)で強調しています。
・So-One設定の追加
-チュートリアルでは、ZCU102, AlveoU50を実装先として定義しているためSo-Oneを追加します。
※以下、環境変数ARCHの設定内容をご確認ください!
・VGG19へ設定更新
-コンパイルを実行する量子化済みモデルの名前(VGG_int.xmodel)を変更します。
修正完了後、量子化の際と同様GPU版Vitis™ AI dockerコンテナを起動します。
早速コンパイル!といきたいところですが、その前に1つ必須作業を行います!
これで準備完了です。
以下コマンドでコンパイルを実行していきましょう。
$ source compile.sh SoOne
実行後、以下のような画面が出力されます。
※画像クリックで大きな画像が表示されます。
正常に完了すると、compiled_modelディレクトリにコンパイルされたモデルが格納されます!
これにてコンパイル完了です!
最後にexitを入力して、docker環境から抜けることを忘れずに!
実装準備
So-One KITへ動作させるために必要なファイルをimageファイル内へコピーします。
imageファイルへのファイルコピー方法については、前回の記事で詳細を記載しておりますので、コピー方法がご不明な方は、そちらをご参照ください。
※前回の記事はこちら
・コピーするファイルの整理
-コピーするファイルを1つのディレクトリ(target_SoOne)にまとめます。
$ cd ~/Vitis/vitis_r1.4/Vitis-AI/Vitis-AI-Tutorials/Design_Tutorials/09-mnist_pyt-master_original_So-One/files
$ mkdir target_SoOne
$ cp application/app_mt.py ../target_SoOne
$ cp compiled_model/CNN_SoOne.xmodel ../target_SoOne
評価用の画像についてですが、cifar-10の画像が必要になります。
画像の取得は、以前の記事にて行っており、同様の方法を行えば画像をダウンロードすることができます!
そちらをご参照いただき、任意の枚数をimagesディレクトリにまとめておきましょう。
※該当の記事はこちら
-imagesディレクトリもtarget_SoOneディレクトリにコピーさせて作業完了です!
自分は1000枚(各ラベル100枚ずつ)用意しました
※ご注意!!
ファイル名についてですが、「ラベル名_xx.png」でお願いいたします。
かつラベル名は、以下の10個で設定頂ければ大丈夫です
「airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck」
・推論実行用スクリプト(app_mt.py)の修正
-cifar-10用にスクリプトを修正します。
以下のようにopencvによる画像読み込みの部分を修正します。
最後にラベル名を変更します。
target_SoOneディレクトリをSo-One KITのhome/rootディレクトリにコピーします。
これにて作業完了です!
さぁ、いよいよSo-One KITで動作確認です
作業(評価ボード)
評価ボード起動 & 事前準備
評価ボードの起動および事前準備については、前回の記事に詳細を記載しています。あわせてご参照ください!!
※前回の記事はこちら
実行
いざ実行!!
といきたいところですが、そのまま実行してしまうと、搭載しているライブラリバージョン不整合によりエラーとなってしまいます・・・
そのエラーを回避すべく、該当のライブラリを以下コマンドで削除します。
削除を行うのは古いライブラリなので、動作に問題はないので、ご安心ください!
※多いので、ご注意ください・・
# rpm -e packagegroup-petalinux-vitisai-1.0-r0.noarch
# rpm -e packagegroup-petalinux-vitisai-dev-1.0-r0.noarch
# rpm -e vitis-ai-library-deploy-1.0-r0.zynqmp
# rpm -e vitis-ai-library-deploy-lic-1.0-r0.zynqmp
# rpm -e vitis-ai-library-deploy-dev-1.0-r0.zynqmp
# rpm -e xir-deploy-dev-1.0-r0.zynqmp
# rpm -e xir-deploy-lic-1.0-r0.zynqmp
# rpm -e xir-deploy-1.0-r0.zynqmp
# rpm -e vart-deploy-1.0-r0.zynqmp
# rpm -e vart-deploy-dev-1.0-r0.zynqmp
# rpm -e vart-deploy-lic-1.0-r0.zynqmp
# rpm -e libvitis_ai_library-1.3.2-r483.aarch64
# rpm -e libvart-1.3.2-r483.aarch64
# rpm -e libxir-1.3.2-r483.aarch64
# rpm -e libtarget-factory1-1.0-r0.zynqmp
# rpm -e libtarget-factory-lic-1.0-r0.zynqmp
# rpm -e libtarget-factory-dev-1.0-r0.zynqmp
# rpm -e libtarget-factory-1.3.2-r483.aarch64
# rpm -e libunilog1-1.0-r0.zynqmp
# rpm -e libunilog-lic-1.0-r0.zynqmp
# rpm -e libunilog-dev-1.0-r0.zynqmp
# rpm -e libunilog-1.3.2-r483.aarch64
以上で完了です!!
以下コマンドで推論を実行していきます!
# cd ~/target_SoOne
# python3 app_mt.py -m CNN_SoOne.xmodel
実行すると、以下のような画面が出力されます。
認識精度や処理速度もあわせて表示されます!
※添付図上に表示箇所を強調しました。
精度については、学習のepoch数が少ないので、・・・ですが
速度に関しては申し分ないかなと思います!
以上で動作確認完了です!
本当にお疲れ様でした!
最後に
最後までお読みいただきありがとうございました~
今回は独自で学習させたPyTorchのモデルをSo-One KIT上で動作させてみました。
このフローでいけば、その他のモデルも試せるかと思いますので、 是非チュートリアルと一緒に参照しながら、皆さまも実装を試してみてくださいね。
それではまた!TEPPE-AIでした~