📘

TensorRTを試してみる - 最適化試行 -

2020/11/03に公開

はじめに

前回投稿の続きです。おさらいになる部分は引用で済ませます。
TensorRTを試してみる - Python環境構築 -

個人的に様々な環境で取り扱いが容易なYOLOv4-tinyのONNXを作り上げ、
そこからTensorRTへのImportを実行して動かしてみることを狙います。

今回やりたいことを項目で上げていくと、

  • Yolov4-tiny ONNX Modelを用意
  • TensorRTでONNX Modelを取り込み
  • 下記のそれぞれについて単一画像でのmAPを確認
  • YOLOv4-tiny by darknet
  • YOLOv4-tiny by TensorRT
  • YOLOv4-tiny by TensorRT(FP16)
  • 下記のそれぞれについてカメラ入力でのFPSを確認
  • YOLOv4-tiny by darknet
  • YOLOv4-tiny by TensorRT
  • YOLOv4-tiny by TensorRT(FP16)

今回はONNX ModelをTensorRTでの実行形式エンジンに変換して、
予め用意されているTensorRTアプリを実行できるところまで進めていきます。

ONNXを読み込んでTensorRTの入力として利用

前回のdemo_darknet2onnx.pyを実行すると、「yolov4_1_3_416_416_static.onnx」が出来ているため、
このonnxファイルを基にTensorRTでYolov4-tinyを実行していきます。
TensorRTへの変換方法はいくつかあるのですが、今回はtrtexecという公式OSSを利用します。
JetPackには既にBinaryFileが入っているためPATHだけ通しておきます。

export PATH=/usr/src/tensorrt/bin/:$PATH

実行方法はPytorch-YOLOv4にも記載されているので実行していきます。

mkdir workspace
trtexec --onnx=yolov4_1_3_416_416_static.onnx --explicitBatch --saveEngine=yolov4_tiny.trt --fp16

Optionの意味はtrtexec --helpを叩けば分かるんですが、以下のようになっています。

  • onnx: onnxモデルを指定
  • explicitBatch: Batchサイズの明示指定を使用
  • saveEngine: Engineファイル保存名
  • fp16: FP16モードでビルド

実行すると、Engineのビルドが始まるので暫く待ちます。
大体5分ほど待つと「yolov4_tiny.trt」ファイルが生成されます。
後々のためにfp16オプションを抜いたyolov4_tiny_fp32.trtも作っておきます。

trtexec --onnx=yolov4_1_3_416_416_static.onnx --explicitBatch --saveEngine=yolov4_tiny_trt.trt

demoアプリで実行

既に用意されているdemo_trt.pyを使って実行していきます。出力結果は一部省略してます。
(実行したら2回Inferenceが実行されるのがよくわからなかった...出力結果が2つあるからかもと想定。)

python3 demo_trt.py yolov4_tiny.trt data/dog.jpg 416 416
TRT inference time: 0.046982s  
TRT inference time: 0.033999s
truck: 0.851074  
dog: 0.758789  

yolov4_tiny_fp16.jpg

python3 demo_trt.py yolov4_tiny_fp32.trt data/dog.jpg 416 416
TRT inference time: 0.064832s  
TRT inference time: 0.048227s  
truck: 0.852335  
dog: 0.754068  

yolov4_tiny_fp32.jpg

結果を見た限りはFP16にしてもそれほど精度には影響が出ておらず、
推論速度が大体2/3程になっているので、推論パフォーマンス向上に寄与しそう…という感触。
INT8がすごく気になるのだけど、JetsonNanoでは試せないので諦め。

おわりに

ここまでで最低限の範囲でTensorRTを使ったDeepLearningの実行ができるようになりました。
次回はmAP測定環境やカメラのFPS測定環境を準備していこうかなと思います。

Discussion