TensorRTで実装していた物体検出アプリをTensorRT for RTXに置き換えた!
2025/5/20の発表からずっと注目していたTensorRT for RTX(以下TensorRT-RTX)ですが、やっと自作物体検出FF14向けWindowsアプリに適用することができました!
わーい!
この記事はこれまでのTensorRT-RTX記事の続きであり完結編になります。
TensorRT-RTXとは
- TensorRT-RTXは、NVIDIA RTX GPU 向けに最適化された推論ライブラリで、DirectML と比較して平均50%を超えるパフォーマンスを実現。
- TensorRTはデータセンター向けGPUに最適化されたものでパフォーマンスは高いもののライブラリサイズが1GB以上と大きく、WindowsやLinux向けに配信するアプリとしてはやや不向き。TensorRT-RTXは、NVIDIA RTX GPUをターゲットとしており、200MB未満のライブラリとなっている。
- TensorRTではユーザのGPUでエンジンの事前コンパイルが必要だったのに対し、TensorRT-RTXでは事前コンパイルとエンドユーザでの推論時のJITコンパイルに分割することでUXを改善。
- WindowsとLinux、C++とPythonをサポート。
- TensorRT-RTXはつい先月、正式リリースされたWindowsMLの実行プロバイダー(EP)のひとつ。WindowsMLのEPにはONNXRUNTIME実行ライブラリの動的ダウンロードサポートが必要なようで、TensorRT-RTXはそれに対応しているようです。
私のアプリの場合、TensorRTを使えないRADEONユーザーにも1つが1.7GBのDLLを含む大きなファイルをダウンロードしてもらっている申し訳なさと、GEFORCEユーザーにもTensorRTやONNXモデルの更新の度にTensorRTの約6分の長い事前コンパイルをしてもらうのはあまり良いユーザー体験ではないと考えていました(アプリアップデート後にすぐにTensorRTが使えず6分間のGPU負荷が高い虚無タイムを待つか、TensorRTを使わないか)。
フットプリントとコンパイルが改善されているらしいTensorRT-RTXに発表時からとても期待していました!
自作アプリをTensorRTからTensorRT-RTXに移行した結果
私のWindowsアプリは、動画からyolov8で物体検出し、OpenCVで画像処理、再度動画に書き出すアプリとなっています。
処理時のFPSは動画をアプリで処理した時の目安値です。
| TensorRT-RTX | TensorRT | DirectML | |
|---|---|---|---|
| アプリでの処理FPS | 69FPS | 70FPS | 45FPS |
| 事前コンパイル時間 | 2秒 | 360秒 | 無し |
| 推論前コンパイル時間 | 6秒程度 ※1 | 0秒 | 2秒程度 ※2 |
| アプリファイルサイズ(圧縮時) | 0.7GB | 3.7GB | ー |
- TensorRT-RTXではJITコンパイルしたキャッシュを保存し再利用することで、再びJITコンパイルをせず0秒にできます
- DirectMLの推論前の時間は正確にはコンパイルではなくセッションに手間取ってるだけかもしれません(ちょっとよくわかってない)
- 推論の前後処理がCPU処理となっており、これがボトルネックとなってTensorRT、TensorRT-RTXは100%の性能を発揮できていない可能性があります
- TensorRT-RTXはFP16に最適化されていますが、コードがFP32のままだったのでONNXの入出力だけFP32にしています。本来のパフォーマンスは十分には出ていないと思われます
環境
- CPU:INTEL 11400F
- GPU:GEFORCE 4070TiS 16GB
- OS:Windows11pro 64bit
- IDE:VisualStudio2022 C++
- TensorRT-RTX:1.1
- TensorRT:10.11
- CUDA:12.9
- ONNXRUNTIME-DirectML:1.22
- OPENCV:4.13dev
- MODEL:YOLOV8m.onnx 1280x768
(TensorRT-RTX,TensorRTはバッチあり、DirectMLはバッチなし)
TensorRT-RTXへの移行で出会ったいろいろ
1.TensorRTとTensorRT-RTXの名前空間が同じで移行が簡単!
TensorRT-RTXの名前空間やメソッド、メンバーはTensorRTを踏襲しており、基本的同じです。
そのためTensorRTで作成したアプリケーションをTensorRT-RTXに移行するのはかなり簡単です。
実際、私も移行でのコード修正はほぼなく、特に推論部分は全く変更なしで動作しました。
ONNXからTensorRT-RTX.engineへの変換部分は、次のFP16対応などで微修正しています。修正内容の詳細は第2回TensorRT-RTXをご覧ください。
2.ONNXをFP16精度でエクスポートすること!
TensorRT-RTXでは、FP16精度でパフォーマンスが出るように調整されています。
裏を返せばFP32では十分なパフォーマンスは出ません。
従来のTensorRTでは、FP32のONNXをFP16精度に落としながらTensorRT.engineに変換できましたが、TensorRT-RTXでは廃止となっています(TensorRTでも将来的には廃止予定)。
先に書いた通り、基本的にTensorRTと同じTensorRT-RTXではありながら、TensorRTにできてTensorRT-RTXにできないFP16精度への変換出力について、再実装の要望やなぜできないのか?という問い合わせのIssueが乱立していました。
実はわたしもONNXエクスポートをFP16精度で実施したつもりでしたが、実際にはできておらず、TensorRT-RTXではパフォーマンスがでない!と喚いていました。実際にはFP16精度で正しくエクスポートできておらず、FP32のONNXであったためパフォーマンスが出ていないだけでした。(パフォーマンスがでないとIssue投稿までしてしまいました。自分の不手際のせいだったのでとても恥ずかしい・・・)
FP32からFP16などに精度を落としながらのengine出力ができない、というのがTensorRTからの移行上の最大の違いで、TensorRT-RTXのパフォーマンスに直結するポイントでもあるため、単純なことですが注意を払って対応する必要があります。
お試しをするならわたしのように入出力のみFP32、内部はFP16に変換して利用してみるのもいいかもしれません。
3.圧倒的なコンパイルの短さ!
ONNXからTensorRT-RTXへの事前コンパイルが一瞬で終わります。当方の環境で2秒くらい。
これだったらと、アプリ起動時に必要なら自動的にコンパイルするようにしています。
推論前のJITコンパイルも8秒くらいです。処理を実行した後、一瞬動いていないのか?と思いますが、しばらくすると動き出すような感じになります。知らないと動きに少しびっくりしますが、私のように長い動画を処理するような使い方であれば、毎回コンパイルしてもあまり気にならないかもしれません。
また推論実施後のキャッシュを保存し再利用するようにすれば推論前コンパイルもスキップできます。
私のアプリでは、従来TensorRTへのコンパイルの長さから、DirectMLがメインで、TensorRTはわかってる人・知ってる人向けのスーパーサブのような扱いでしたが、TensorRT-RTXに移行してからはTensorRT-RTXがメイン、DirectMLがサブというような扱いに変わりました。
4.Microsoftストアに公開するためのパッケージ化や検証が速い!
ファイルサイズが1/5以下になったことが大きいと思いますが、パッケージ化の処理や、ストアにアップロードする前の検証がかなり短くなりました。
アプリ開発者にも優しいAPIですね!
5.ライセンスに記載されていたベンチマーク掲載不可!(今は消えてる)
TensorRT-RTX 1.0リリース時のライセンスには、NVIDIAの許可なくベンチマークを掲載してはならない、と記載されていました。
今はその条項自体が消えています。(確か2.13項)
私はTensorRT-RTX 1.0がリリースされた直後からすぐに移行するつもりで、アプリの紹介としても性能比較は必要なのでそれについてNVIDIAの法務部門を経由してメールやり取りをしてきました。結果的に私が移行に手間取っている間に先にライセンスの方が変わってしまいました。
TensorRT-RTXがWindowsMLを意識したものであるため、WindowsMLの正式リリースまではTensorRT-RTXもプレリリースという扱いだったのかもしれません。
感想まとめ
- 自作物体検出アプリをTensorRTからTensorRT-RTXに移行しました。
- TensorRTからTensorRT-RTXへの移行は名前空間がほぼ同じのため、大きな修正は必要ありませんでした。
- TensorRT-RTX化によってファイルサイズは3.7GBから0.7GBと3.0GB、従来の20%未満に削減。
- TensorRT-RTXの推論パフォーマンスは、当方の環境においてはTensorRTと遜色はありませんでした。但しこれはモデルやTensorRT、TensorRT-RTXの性能を100%引き出せているか?にもよるとは思います(なお私は引き出せていないです)。
- ONNXからTensorRT-RTXのengineへの変換は一瞬。従来6分だったものが10秒に。ファイルサイズと共にTensorRTでストレスだった部分が全て解消されました。
- FP16のONNXを準備し、TensorRT-RTX engineに変換するのが最大の注意ポイントだと思います
- 今回のTensorRT-RTXへの移行で、トータルでは、GEFORCE、RADEON問わず、どのユーザーも何がしかの恩恵を受ける改善につながったと考えています。
- TensorRT-RTXは前身となるTensorRTがあるとは言え、まだ生まれたばかりで流行るのはまだまだこれからと思いますが、NVIDIAの開発の方々には本当に感謝です!これからも応援しています!TensorRT-RTX 1.2にも期待しています!
- 個人的には、TensorRT-RTXのロゴかアイコンを作って欲しい。Qiitaのタグアイコンに設定したい←
↓のこれがTensorRT-RTXでよく使われていますが、これだとnvidiaともTensorRT-RTXともわからない気がしてて。(ただのパソコン好きのデスクトップのような・・・ある意味合ってるのか?)
もう少しNVIDIAの緑成分や、AIや推論、TensorRTをイメージするものがあってもいいんじゃないのかなー