目的
(ずいぶん前になるが)JetPack4.3がリリースされたので、TF-TRT(TensorFlow integration with TensorRT)を使ってFP16に最適化したモデルでの処理時間を計測する。
動機
前回のブログ「Jetson NanoでTF-TRTを試す(Object detection)」で、よくわからない事象として「SSDLite MobileNet v3 LargeのPre-trained Modelで検出ができない」をあげていた。これはtensorflow/modelsにIssueを報告していたのだけど、アップされたmodelに問題があったとのことで新しいmodelがPRされた(2020.2.29時点ではまだマージされていない)。
問題が解決したのと、JetPackがアップデートされたので、再度、処理時間を計測しようと思った。
まとめ
- SSDLite MobileNet v3 large / smallはJetpack 4.2 + TF1.14と比べ処理時間が遅くなっている。
- MobileNet v3以外のDetection model(v1, v2など)は、NonMaxSupperssionをCPU実行に書き換えるとTF-TRT FP16のモデル変換に失敗する。
- Classification model(MobileNet v1, v2)はJetPack 4.2 + TF1.14と比べ処理時間が若干だが早くなっている。
早くなっているね!で終わると思っていたのだが、つぶやいたとおりいろいろとあった。
いろいろつぶやいていたJetson Nano(Jetpack 4.3)でTF-TRTモデルの変換、— nb.o (@Nextremer_nb_o) February 24, 2020
・Detectionモデルは推論時間が遅くなってる
・NMSのCPU置き換えで失敗するモデルがある
・Classificationモデルは若干推論時間が早くなってる
TF1.15でDetectionモデルの変換になにかありそう?あとでまとめてみよう。 pic.twitter.com/vjktGNY6qd
環境
今回、3つのバージョンで計測した。
- JetPack 4.2.2 + TF1.14
JetPack: 4.2.2 (r32.2.1)
TensorRT: 5.1.6
TensorFlow: 1.14.0+nv19.10
Python: 3.6.9 - JetPack4.2.2 + TF1.15
JetPack: 4.2.2 (r32.2.1)
TensorRT: 5.1.6
TensorFlow: 1.15.0+nv19.11
Python: 3.6.9 - JetPack4.3 + TF1.15
JetPack: 4.3 (r32.3.1)
TensorRT: 6.0.1
TensorFlow: 1.15.0+nv20.1
Python: 3.6.9
モデルの生成
TF-TRT FP16 のモデル変換は前回と同様、本家よりForkしたリポジトリを使用する。
なお、SSDLite MobileNet v3 large/smallのpre-trained modelのリンクは変更済みである。モデルの変換および、ベンチマークの際は、CUIモード&jetson_clocksで実行している。
Detection modelのベンチマーク
今回は対象を以下のモデルに絞って行った。
- ssdlite_mobilenet_v2_coco
- ssdlite_mobilenet_v3_small_coco
- ssdlite_mobilenet_v3_large
TF-TRT FP16への変換、計測方法は前回のブログと同様である。
NonMaxSupperssion(NMS)をCPU実行に書き換えて、TF-TRT FP16に変換。変換後、ベンチマーク用のスクリプト(初回の推論を除く100回の平均)で計測した。
JetPack4.2.2+TF1.15、JetPack4.3+TF1.15の場合、ssdlite_mobilenet_v2_coco モデルがモデル変換時に「Aborted (core dumped) 」となり失敗する。
2020-02-19 18:42:53.932561: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1208 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3) 2020-02-19 18:43:21.378537: I tensorflow/compiler/tf2tensorrt/segment/segment.cc:460] There are 1379 ops of 31 different types in the graph that are not converted to TensorRT: Range, Sum, GreaterEqual, Where, Select, ConcatV2, Less, Fill, ExpandDims, Unpack, GatherV2, NoOp, TopKV2, Cast, Slice, Transpose, Pad, Placeholder, ResizeBilinear, Squeeze, Mul, Reshape, AddV2, Pack, Identity, NonMaxSuppressionV5, Shape, Greater, Sub, Minimum, StridedSlice, (For more information see https://docs.nvidia.com/deeplearning/frameworks/tf-trt-user-guide/index.html#supported-ops). 2020-02-19 18:43:22.630756: I tensorflow/compiler/tf2tensorrt/convert/convert_graph.cc:633] Number of TensorRT candidate segments: 2 2020-02-19 18:43:22.784932: F tensorflow/core/util/device_name_utils.cc:92] Check failed: IsJobName(job) Aborted (core dumped)
これは、この方のブログ「JetPack-4.3 for Jetson Nano」でも同様の事象が発生するとあり、NMSをCPU実行に書き換えることをやめると変換に成功するとあった(実際に成功する)。ssdlite_mobilenet_v3は変換に成功するため、単純にNMSのCPU実行の書き換えが問題でないと思われる。
このため、NMSを書き換えない場合も計測した。
NMSをCPU実行に書き換えた場合
-: モデル変換時にAborted (core dumped) が発生
NMSを書き換えない場合
ベンチマーク結果
JetPack4.3 + TF1.15は
- TF-TRT FP16 に変換できるモデルに限りがある。
今のところはSSDLite MobileNet v3 small / large(SSDLite MobileNet EdgeTPU)が確認できている。
(おそらく、モデルを学習した時のTensorFlowのバージョンが関係する?) - SSDLite MobileNet v3 small / largeは
JetPack4.2.2 + TF1.14と比べ、推論の処理時間が遅くなっている。
JetPack4.2.2 + TF1.15と比べ、推論の処理時間は早くなっている。 - NMSのCPU実行への書き換えを行わなければモデルの変換に成功するが、推論時間は長くなってしまう(ためおすすめではない)。
- (NMSになにかありそう???)
Classification modelのベンチマーク
こちらも、以下のモデルでベンチマークを行った。
- mobilenet_v1_1.0_224
- mobilenet_v2_1.0_224
(以前のブログ「Jetson NanoでTF-TRTを試す(Image Classification)その2」)と同様、TF-TRT FP16に変換。変換後、ベンチマーク用のスクリプト(初回の推論を除く100回の平均)で計測した。
こちらは、変換時に問題も発生することはなく、JetPack4.3 + TF1.15で処理時間が早くなっていることが確認できた。