Ultralytics yolov8を利用したWindows向け物体検出アプリを作成しています。
先日、ultralyticsのDiscordでアドバイスを頂き、コードの修正をしました。
その時、処理速度の改善案として、TensorRTへのエクスポートと利用もアドバイス頂きました。
以前はコードがおかしかったのでTensorRTを利用しても性能がでませんでしたが、今回はより正しいコードになっているため、TensorRTの効果が発揮できるかもしれない!と思い、実装してみました。
結論
pyinstaller実行時に特にエラーは出ていませんでしたが、\site-packages\tensorrt_libs
がexe側の_internal
配下にコピーされていませんでした。
フォルダ配下のDLL、
nvinfer_10.dll
nvinfer_builder_resource_10.dll
nvinfer_plugin_10.dll
nvonnxparser_10.dll
をpyinstallerのspecのbinaries
に記載することで、コピーされるようになり、exeからtensorrtエクスポートが実行できるようになりました。
(但し開発環境での話で、他のcuda tool kitが入っていない環境でエクスポートが動くかは未確認)
binaries=[('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_builder_resource_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvinfer_plugin_10.dll','.\\tensorrt_libs'),('C:\\Users\\ユーザ名\\.virtualenvs\\pyenv環境名\\Lib\\site-packages\\tensorrt_libs\\nvonnxparser_10.dll','.\\tensorrt_libs'),],
但し弊環境では
上記の設定でexeよりTensorRTにエクスポートできるようになりますが、exeでyolov8.engineを利用して物体検出をしても、当方の環境では思っていたほど性能がでませんでした。
原因は細かく検証はできていませんが恐らく、
- torch-tensorrtによって、torchでもtensorrt並みに性能が出るようになっている
- pyinstallerによるexeでのオーバーヘッドが大きい可能性
あたりではないかと想像しています。
EXEアプリでの、.pt、.engineでの同じ動画の処理した結果は次の通りでした。
TensorRTエクスポート機能を追加するには、
- tensorrt 10.6.0
- onnx 1.17.0
- onnxslim 0.1.39
- onnxruntime-gpu 1.20.0
のライブラリを新たにexeに追加する必要があり、配布するファイルサイズが増大すること、
またTensorRTエクスポート処理が、初回に5分程度時間を要するということから、pyinstallerでのexeファイルにおいては、メリットよりもデメリットの方が大きそうなので、TensorRTエクスポート機能は実装しない方向になりそうです
環境
intel 11400F
geforce 4700tiSUPER
windows11 23H2
python 3.11
pyinstaller 6.10.0
ultralytics 8.2.82
tensorrt 10.6.0
onnx 1.17.0
onnxslim 0.1.39
onnxruntime-gpu 1.20.0
TensorRTへエクスポートするコード。imgszは学習や検出と同じに設定。
model.export(format="engine",imgsz=1280, half=True, dynamic=True)
20241118追記
pyinstallerで作ったexeではなく、Pythonで実行した時には、TensorRTの方が速かったです。
だいたいですが、
yolov8.pt 25FPS
yolov8.engine 28FPS
なので、ultralyticsやTensorRTは悪くないよ!