COLUMN
Yolov3とKV260を使ってDPUの性能を比較してみた③
第2部では、AIモデルのダウンロ―ドからコンパイルまでを行いました。
第3部ではdarknet版yolov3モデルとコンパイル済みのAIモデルを使ってKV260上のCPU・DPUで動かしていきます。
作業の流れ
以下の流れで作業をしていきます。
① KV260とノートPCの接続
② CPUでyolov3を動かす
③ Jupyter notebookの立ち上げ
④ DPUでコンパイル済モデルを動かす
KV260に接続する
まずはKV260とノートPCをLANケーブルで接続します。KV260の起動後、ノートPC側でTeraTerm経由で接続します。
※本手順ではKV260は以降ノートPC経由でネットワークに接続しました
CPUでyolov3を動かす
① Yolov3を動かすアプリを以下コマンドでgitからダウンロードします。
$ git clone https://github.com/ayooshkathuria/pytorch-yolo-v3.git
② 第2部で使用したモデルを以下コマンドでダウンロードします。
$ cd pytorch-yolo-v3
$ wget https://pjreddie.com/media/files/yolov3.weights
③ 以下のコマンドを順に実行してアプリを実行します。
-
1.
-
Pythonの仮想環境を立ち上げるためにはrootユーザに切り替える必要がある為、以下コマンドを実行します。
※以下のコマンドを実行しないと②のコマンドでエラーとなります。$ sudo -i
-
2.
-
Pythonの仮想環境を立ち上げます。
以下コマンドを実行し、コンソール行の頭に「(pynq-env)」と表示されれば、立ち上げ完了となります。$ source /etc/profile.d/pynq_venv.sh
※pynq_venv.shがない場合は後述の「PYNQ環境について」を参照してください
-
3.
-
ダウンロードしたpytorch-yolov3のアプリを実行します。
以下コマンドで実行します。
※仮想環境を立ち上げた際にカレントディレクトリが変わるので、ダウンロードしたフォルダのディレクトリに移動してください。$ python detect.py --images imgs --det det --reso 320
コマンド実行後、以下のようなログが出力されます。
pytorch-yolov3のディレクトリにはサンプルとしてjpg画像が一緒にダウンロードされてあります。(pytorch-yolo-v3/imgs)
11個のjpg画像に対して物体検出の推論を行い、約51秒かかったことが分かります。
PYNQ環境について
手順③-1でpythonの仮想環境を立ち上げますが、その環境は以下のコマンドでKria PYNQをインストールします。
① $ git clone https://github.com/Xilinx/Kria-PYNQ.git
② $ cd Kria-PYNQ
③ $ sudo bash install.sh -b KV260
※”Could not get lock /var/lib/dpkg/lock-frontend.”のようなエラーが発生してインストールできない場合は、以下のコマンドを実施してください。
$ sudo snap install xlnx-config –classic
手順③-3:detect.pyの実行中に発生したRuntimeErrorについて
手順③-3でPytorch-yolov3のdetect.pyを実行した際に、以下のようなRuntimeErrorが発生しました。
調べると、同じエラーで躓いた方がいて、「detect.pyと同じディレクトリにあるUtil.pyを以下のURLに記載されているコードに置き換えるとエラーは解消した」ということでした。
その対応方法でトライしたところ、エラーが発生せずに解決できました。
fix concat error when no object is detected for pytorch 1.0
手順③-3:detect.pyの実行中に発生したcv2Errorについて
手順③-3でPytorch-yolov3のdetect.pyを実行した際に、以下のようなcv2Errorが発生しました。
detect.pyの237、238行目に原因があることが分かりました。c1、c2がrectangle関数の引数の型に変換されておらずエラーとなっていました。
237、238行目を以下のように修正することで、エラーは解消しました。
def write(x, batches, results):
#c1 = tuple(x[1:3].int())
#c2 = tuple(x[3:5].int())
c1 = tuple(x[1:3].cpu().int().numpy())
c2 = tuple(x[3:5].cpu().int().numpy())
DPUでコンパイル済モデルを動かす
第2部でコンパイルしたモデルをDPUで動かします。
今回はJupyter notebook上でpythonコードを順に実行しながら行っていきます。
KV260に接続したノートPCからTeraTerm経由でJupyter notebookを立ち上げます。
-
①
-
まず以下コマンドでrootユーザに切り替えます。
※ユーザを切り替えないと後述のDPU関連のコードでPermissionErrorが発生します。$ sudo –i
-
②
-
rootユーザに切り替わるとカレントディレクトリが変わるのでJupyter notebookを立ち上げたいディレクトリに移動します。
-
③
-
以下コマンドでJupyter notebookを立ち上げます。
$ jupyter notebook --ip=0.0.0.0 --allow-root
-
④
-
コンソールログに出力されたURL「http://kria:8888・・・」にブラウザからアクセスします。
アクセスできると、以下のようなJupyter notebookの画面が表示されます。もし出力されたURLにアクセスできない場合は以下のコマンドで再度立ち上げ直してみてください。
$ jupyter notebook --ip=* --allow-root
Jupyter notebookからDPUでコンパイル済モデルを動かす
まずはJupyter notebook用のDPU上でyolov3を動かすサンプルプログラムを下記サイトからダウンロードします。
https://github.com/Xilinx/DPU-PYNQ/blob/master/pynq_dpu/notebooks/dpu_yolov3.ipynb
ここからはサンプルプログラムのセルを上から順に実行してきますが、コードを修正する必要のあるセルや重要なセルに絞って説明します。
※記載されていないセルについては気にせず実行してください
※セルはShift+Enterで実行できます。
-
①
-
以下の[1]セルを実行し、overlayをダウンロードします。
※Jupyter notebook起動手順①で、RootユーザでJupyter notebookを立ち上げないとここでPermissionErrorが発生し、セルが実行できませんでした。
-
②
-
以下のセルでモデルをロードしますが、今回コンパイルしたモデルをロードするように修正します。
-
③
-
[5]セル内のget_class関数内でテキスト形式(.txt)を読み込んでいますが、「pytorch-yolo-v3/data」にあるcoco.namesファイルを読み込むように修正します。
-
④
-
[20]セルではimgファイルを読み込んでいますが、CPU検証で使用したデータを使用するので、jpgファイルを読み込むように修正します。
-
⑤
-
[22]セルを実行して、推論を行います。
以下のようなログが出力され、無事推論ができました!
Number of detected objects: 4
Number of detected objects: 1
Number of detected objects: 3
Number of detected objects: 4
Number of detected objects: 2
Number of detected objects: 1
Number of detected objects: 12
Number of detected objects: 5
Number of detected objects: 5
Number of detected objects: 3
Number of detected objects: 0
Performance: 3.485263827904172 FPS
Detection (11 images) : 3.15611個のjpg画像に対して物体検出の推論を行い、約3秒かかったことが分かります。
結果のまとめ
CPU(「CPUでyolov3を動かす」手順③-3)とDPUでそれぞれ推論を行いましたが、DPUで処理した方が処理速度が圧倒的に速いことが分かりました!
[CPU上での推論結果]
SUMMARY
---------------------------------------------------------
Task : Time Taken (in seconds)
Reading addresses : 0.001
Loading batch : 5.778
Detection (11 images) : 52.030
Output Processing : 0.000
Drawing Boxes : 0.313
Average time_per_img : 5.284
---------------------------------------------------------
[DPU上での推論結果]
Number of detected objects: 4
Number of detected objects: 1
Number of detected objects: 3
Number of detected objects: 4
Number of detected objects: 2
Number of detected objects: 1
Number of detected objects: 12
Number of detected objects: 5
Number of detected objects: 5
Number of detected objects: 3
Number of detected objects: 0
Performance: 3.485263827904172 FPS
Detection (11 images) : 3.156
最後に
今回はKV260上のCPUとDPUで、AIモデルの推論処理速度の違いを比較することができました。今回のコラムに記載した実行エラーの解決策やDPU実行までの方法を参考に皆さんもチャレンジしてみてください!
(補足)
第2部でAIモデルをコンパイルするにあたり、量子化を行いましたが、量子化は本来モデルの軽量化を目的としていて、CPUの使用量を削減できることがメリットです。よってDPUとは関係なく、量子化のみで推論処理速度が向上する可能性があることが分かりました。本来のCPUとDPU間での性能の比較には至らなかったので、機会があればAIモデルの量子化前と後でAIモデルの推論処理速度にどのくらい差があるのかを調査していきたいと思います!
個別相談も承っております。下記よりお申し込みください。