TensorRTを試してみる - 最適化試行 -
はじめに
前回投稿の続きです。おさらいになる部分は引用で済ませます。
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
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
結果を見た限りはFP16にしてもそれほど精度には影響が出ておらず、
推論速度が大体2/3程になっているので、推論パフォーマンス向上に寄与しそう…という感触。
INT8がすごく気になるのだけど、JetsonNanoでは試せないので諦め。
おわりに
ここまでで最低限の範囲でTensorRTを使ったDeepLearningの実行ができるようになりました。
次回はmAP測定環境やカメラのFPS測定環境を準備していこうかなと思います。
Discussion