Last updated on

WoLNamesBlackedOutにTensorRT for RTXを実装したいけど。


TensorRT for RTXに期待をしていた!

WoLNamesBlackedOutには、DirectMLの他にTensorRTでの名前検出を実装しています。
TensorRTはとても速いのですが、事前に6分ほどかけてONNXファイルからTensorRTのengineファイルに変換しないと利用できません。いつでもいいので6分我慢すればいいのですが、そこまで利用頻度が高いアプリではないので、本当は使いたい時に最初から最高速度で使いたい!ところです。
TensorRTのengineファイルは一度変換したらずっと使えるのですが、元のONNXモデルが変更されたら再度変換しないと新しいモデルは利用できないので、モデル更新をしたならTensorRTのengineファイルも再作成が必要です。
物体検出モデルの更新はそんなにしないのですが、不具合や改善をしたいけどengineファイルの再作成も心理的ハードルになっています。

そんなわけで、すぐに使えるTensorRT for RTXには期待していました!

ファイルサイズが小さくなって、engineファイルの作成も15秒程度で終わるそうで。
Qiitaにも記事を投稿したのですが、実際engineファイルの作成は一瞬といっていいほどの時間で完了していました。

TensorRT for RTXの何が不満か

TensorRT for RTXでは、FP16にすることはできません。
NVIDIA開発者がいうには、ONNXをFP16にしたらいいでしょ?ということでした。
確かにごもっともなんですが・・・。

私はFF14の画面から名前を検出するのにUltralyticsのYOLOv8を利用しています。
UltralyticsのONNXへのエクスポートでは、複数バッチ処理対応可能とするdynamicというオプションと、FP16精度のオプションが排他的選択となっていて、どちらかしか選択できません。

dynamicによる複数バッチ処理も、FP16精度での処理も、どちらも処理速度を改善するための手法です。
現在のWoLNamesBlackedOutでは、ONNXはdynamicでエクスポートし、TensorRTのengineファイルにする時にFP16精度にしていました。
TensorRT for RTX(1.0)ではこのdynamicかFP16精度のどちらかを諦めないといけない、ということになり処理速度で大きく不利になりそうです。

DirectMLでは、dynamicを利用せず、FP16精度のONNXを利用しているので、ここをTensorRT for RTXに置き換える、という案も考えましたが、TensorRT for RTXの他に現状のTensorRTも残す必要があります。移行しやすさを考慮してTensorRTとTensorRT for RTXは名前空間や関数名がほぼ同じであり、共存させるには別のプロジェクトとして別のDLLにする必要もあり、これも微妙にめんどくさいと思っています。

そもそも、TensorRT for RTXは、TensorRTの性能をWindowsで気軽に利用できるようにという目的で開発され、既存のTensorRTからの移行も容易にしていたものでしたが、最終的にTensorRTを残すのであれば本来の目的を達成できていないような印象も持ってしまいます。

TensorRT for RTXに望むこと

Ultralytics YOLOv8では、FP16精度とdynamicが排他利用なので、TensorRT for RTXではFP16精度でengineファイルの作成をできるようにして欲しいです。

ファイルサイズ、変換速度、既存TensorRTコードからTensorRT-RTXへの移行のしやすさあたりはとても満足しています。

FP16精度が実現できたらTensorRT-RTXへ全面的に移行したいなー。
NVIDIAさん、よろしくおねがいしますー

※2025/07/01 追記
TensorRTでもFP16出力は廃止予定で、microsoft/onnxconverter-commonNVIDIA/TensorRT-Model-Optimizerで変換するのが正道のようです。