目的
(ずいぶん前になるが)
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して、変更を加えている。
まず、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も使える。
初回の推論時間
2回目以降の100回の推論の平均時間
Image classification model
ベンチマークスクリプトで計測。
- mobilenet_v2 (depth_multiplier=0.5)とmobilenet_v3_smallがほぼ同等の推論時間。
- mobilenet_v2 (depth_multiplier=1.0)とmobilenet_v3_largeがほぼ同等の推論時間。
- FP32での精度を考えるとmobilenet_v3を使うのが良いかも?
初回の推論時間
2回目以降の100回の推論の平均時間
最後に
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も試してみたい。
0 件のコメント:
コメントを投稿