2020年6月6日土曜日

Jetson NanoでTF-TRTを試す(JetPack 4.4 Developer Preview)

目的


(ずいぶん前になるが)
JetPack 4.4 Developer Previewがリリースされたので、TF-TRT(TensorFlow integration with TensorRT)を使ってFP16に最適化したモデルでの処理時間を計測する。
また、TensorFlow Object Detection APIにも新しいモデル(MnasFPN、MobileDets)が追加されたので試してみる。


まとめ


  • SSDLite MobileNet V3は前回(JetPack4.3 + TF1.15)より多少の改善がみられる。
  • MnasFPNは思った効果(推論時間)は確認できなかった。
  • MobileNet V3がMobileNet V2より有効(推論時間がはやい)ことが確認できた。
  • Object detection modelではMobileDetsが良さそう。


インストール


JetPack4.4、TensorFlow、TF-TRT modelsのインストールを行う。


JetPack


JetPack SDKからJetPack 4.4 Developer PreviewのSDイメージをダウンロードして、SDカードに書き込み。


TensorFlow


TensorFlow on Jetson Platform をもとにTensorFlowをインストールする。
注意することは、バージョンは1.xをインストールすること(TensorFlow Object Detection APIは1.x系のみ対応)。
インストール時は‘tensorflow<2’をつける。
※2020.6.6時点では1.15.2がインストールされる。


TF-TRT Models


TF-TRT Models(TensorFlow/TensorRT Models on Jetson)のリポジトリをcloneし、インストールする。
なお、オリジナルのリポジトリからforkして、変更を加えている。
  • submodule(TensorFlow Model Garden)を更新。
    (MobileDetsを変換したいため)
  • 変換スクリプト、ベンチマークスクリプトを追加



まず、TensorFlow Object Detection APIに必要なパッケージをインストールする。

$ sudo apt install pyton3-tk python3-matplotlib
$ pip3 install --user tf_slim

その後、TF-TRT Modelsのリポジトリをcloneし、インストールスクリプトを実行する。

$ git clone https://github.com/NobuoTsukamoto/tf_trt_models.git
$ cd tf_trt_models/
$ ./install.sh python3

※Python3での実行のみ確認している。


モデルの変換


変換スクリプトを使用して、TF-TRT FP16モデルに変換する。


Object detection model


pre-trained modelの場合は、prefixを指定すれば変換する。
ただ、mobiledetはフォルダの構成が他と違うため手動でダウンロード&変換が必要。
今回の対象モデルは以下。
  • ssdlite_mobilenet_v2 (※)
  • ssdlite_mobilenet_v3_small
  • ssdlite_mobilenet_v3_large
  • ssd_mobilenet_v2_mnasfpn
  • ssdlite_mobiledet_cpu
  • ssdlite_mobiledet_edgetpu
  • ssdlite_mobiledet_dsp
  • ssdlite_mobilenet_edgetpu

変換は以下のように実行

cd examples/detection/
$ python3 convert.py --model=ssdlite_mobilenet_v2_coco
$ python3 convert.py --model=ssdlite_mobilenet_v3_small_coco --force_nms_cpu
$ python3 convert.py --model=ssdlite_mobilenet_v3_large_coco --force_nms_cpu
$ python3 convert.py --model=ssd_mobilenet_v2_mnasfpn_coco --force_nms_cpu

# ssdlite_mobilenet_edgetpuはwgetできないのでリンクをクリックしてダウンロード
$ cd data/
$ tar xf checkpoints_ssdlite_mobilenet_edgetpu_coco_quant.tar.gz
$ cd ../
$ python3 convert.py --path=data/ssdlite_mobilenet_edgetpu_coco_quant/ --force_nms_cpu

$ cd data/
$ wget http://download.tensorflow.org/models/object_detection/ssdlite_mobiledet_cpu_320x320_coco_2020_05_19.tar.gz
$ tar xf ssdlite_mobiledet_cpu_320x320_coco_2020_05_19.tar.gz
$ cd ssdlite_mobiledet_cpu_320x320_coco_2020_05_19
$ mv model.ckpt-400000.data-00000-of-00001  model.ckpt.data-00000-of-00001
$ mv model.ckpt-400000.index model.ckpt.index
$ mv model.ckpt-400000.meta model.ckpt.meta
$ cd ../../
$ python3 convert.py --path=data/ssdlite_mobiledet_cpu_320x320_coco_2020_05_19 --force_nms_cpu

$ cd data/
$ wget http://download.tensorflow.org/models/object_detection/ssdlite_mobiledet_edgetpu_320x320_coco_2020_05_19.tar.gz
$ tar xf ssdlite_mobiledet_edgetpu_320x320_coco_2020_05_19.tar.gz
$ cd data/ssdlite_mobiledet_edgetpu_320x320_coco_2020_05_19/fp32/
$ mv model.ckpt-400000.data-00000-of-00001  model.ckpt.data-00000-of-00001
$ mv model.ckpt-400000.index model.ckpt.index
$ mv model.ckpt-400000.meta model.ckpt.meta
$ cd ../../
$ python3 convert.py --path=data/ssdlite_mobiledet_edgetpu_320x320_coco_2020_05_19/fp32 --force_nms_cpu

$ cd data/
$ wget http://download.tensorflow.org/models/object_detection/ssdlite_mobiledet_dsp_320x320_coco_2020_05_19.tar.gz
$ tar xf ssdlite_mobiledet_dsp_320x320_coco_2020_05_19.tar.gz
$ cd data/ssdlite_mobiledet_dsp_320x320_coco_2020_05_19/fp32/
$ mv model.ckpt-400000.data-00000-of-00001  model.ckpt.data-00000-of-00001
$ mv model.ckpt-400000.index model.ckpt.index
$ mv model.ckpt-400000.meta model.ckpt.meta
$ cd ../
$ python3 convert.py --path=data/ssdlite_mobiledet_dsp_320x320_coco_2020_05_19/fp32  --force_nms_cpu

前回のブログでもふれた「NMSをCPU実行に書き換えると変換できない」が発生するため、NMSはそのまま(GPUで実行)とする。変換スクリプトに"--force_nms_cpu"を指定する。


Image classification model


こちらも変換スクリプトを用意している。
pre-trained modelのprefixを指定すれば変換する。
今回の対象モデルは以下(Inputはすべて244x244)。
  • mobilenet_v2 (depth_multiplier=0.5)
  • mobilenet_v2 (depth_multiplier=1.0)
  • mobilenet_v2 (depth_multiplier=1.4)
  • mobilenet_v3_small
  • mobilenet_v3_small

$ cd examples/classification/
$ python3 convert.py --model=mobilenet_v2_0p5_224
$ python3 convert.py --model=mobilenet_v2_1p0_224
$ python3 convert.py --model=mobilenet_v2_1p4_224
$ python3 convert.py --model=mobilenet_v3_small
$ python3 convert.py --model=mobilenet_v3_small_224


ベンチマーク


ベンチマーク実施はMax power&CUIモードで実行する。

$ sudo systemctl set-default multi-user.target
$ sudo reboot
$ sudo jetson_clocks

Object detection model


  • ssdlite_mobilenet_v3_small / largeは前回(JetPack4.3+TF1.15)と比べると推論時間が改善している。
  • ssdlite_mobilenet_v2はNMSのCPU実行ができない分、推論時間が遅い。
  • ssdlite_mobilenet_v2_mnasfpnは想定よりかなり遅い。
    CPUに最適化しているからだろうか?
  • 精度(mAP)と推論時間のトータルを考慮するとssdlite_mobiledet_edgetpuが一番。
  • ssdlite_mobilenet_v3_small or largeも使える。

初回の推論時間

Model
Input size
Inference time [ms]
TF-TRT (FP16)
ssdlite_mobilenet_v2300x30013025
ssdlite_mobilenet_v3_small320x3208375
ssdlite_mobilenet_v3_large320x3207366
ssdlite_mobilenet_v2_mnasfpn320x32017502
ssdlite_mobiledet_cpu320x3208117
ssdlite_mobiledet_edgetpu320x3207332
ssdlite_mobiledet_dsp320x3208203
ssdlite_mobilenet_edgetpu320x32023643


2回目以降の100回の推論の平均時間

Model
Input size
Inference time [ms]
TF-TRT (FP16)
ssdlite_mobilenet_v2300x30088
ssdlite_mobilenet_v3_small320x32056
ssdlite_mobilenet_v3_large320x32068
ssdlite_mobilenet_v2_mnasfpn320x320223
ssdlite_mobiledet_cpu320x32073
ssdlite_mobiledet_edgetpu320x32070
ssdlite_mobiledet_dsp320x32080
ssdlite_mobilenet_edgetpu320x320186



Image classification model


  • mobilenet_v2 (depth_multiplier=0.5)とmobilenet_v3_smallがほぼ同等の推論時間。
  • mobilenet_v2 (depth_multiplier=1.0)とmobilenet_v3_largeがほぼ同等の推論時間。
  • FP32での精度を考えるとmobilenet_v3を使うのが良いかも?


初回の推論時間

Model
Input size
Inference time [ms]
TF-TRT (FP16)
mobilenet_v2_0.5_224224x2243477
mobilenet_v2_1.0_224224x22411354
mobilenet_v2_1.4_224224x2249356
mobilenet_v3_small_224224x2244187
mobilenet_v3_large_224224x2245387


2回目以降の100回の推論の平均時間

Model
Input size
Inference time [ms]
TF-TRT (FP16)
mobilenet_v2_0.5_224224x22410
mobilenet_v2_1.0_224224x22416
mobilenet_v2_1.4_224224x22423
mobilenet_v3_small_224224x22410
mobilenet_v3_large_224224x22417



最後に


Jetson Nano(JetPack 4.4 Developer Preview)でTF-TRT モデルの推論時間をベンチマークしてみた。

結果からMobileNet V3ベースまたは、SSDLite MobileDets Edge TPUが良い結果に思える。
FP16にした場合の制度の低下がどれぐらいかは気になるところではあるが、FP32とほぼ同等(の低下)と考えれば、MobileNet V3、MobileDetsは良い選択肢になると思う。
(あとはどのぐらい学習しやすさによるか?)

Object detection modelはモバイルCPU、Edge TPU、DSPに特化したモデルが登場した(MnasFpn、MobileDets)。
これらのモデルの中にはJetson NanoのGPUではそれほど良い結果は得られなかった。
これはモデルがHWに特化していることも要因の一つに思える。

あとは、Efficientnet、EfficientDetも試してみたい。