TensorRT

TensorRTはグラフを1つのGPU向けに調整されたエンジンへコンパイルします。LibreYOLOは最初にONNX中間ファイルをエクスポートし、TensorRTのONNXパーサーで解析してエンジンを構築し、モデルのメタデータをJSONサイドカーとして隣に保存します。

フラグ
export(format="tensorrt")
出力
1つの.engineファイルと.engine.jsonメタデータサイドカー
追加パッケージ
pip install "libreyolo[onnx,tensorrt]"
再読み込み
LibreYOLO("weights/LibreYOLO9t.engine")
形状
デフォルトは静的。dynamic=Trueでバッチ軸の最適化プロファイルを追加します
精度
FP32、FP16(half=True)、INT8(int8=Trueとdata=を指定)
必要条件
ビルド時と実行時にNVIDIA GPUが必要です。GPUアーキテクチャが異なる環境へエンジンを移動することはできません。

インストール

ビルドと実行の両方で、正常に動作するCUDA環境を備えたNVIDIA GPUが必要です。この形式にはCPUフォールバックがありません。

インストール
# ONNX中間ファイルからエンジンを構築するため両方の追加パッケージが必要pip install "libreyolo[onnx,tensorrt]"
ビルド前にツールチェーンを確認
python -c "import tensorrt, torch; print(tensorrt.__version__, torch.cuda.is_available())"

tensorrt追加パッケージはtensorrt-cu12pycudaのバージョンを固定し、マーカーによってmacOSでは両方を除外します。Jetsonではこの追加パッケージを使用しないでください。CUDA 13プラットフォームに対してCUDA 12ビルドが固定されるためです。代わりに、NVIDIA Jetsonの説明に従ってJetPackがインストールするTensorRTを使用してください。

エクスポート

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # weights/LibreYOLO9t_fp16.engineとweights/LibreYOLO9t_fp16.engine.jsonを書き込むpath = model.export(format="tensorrt", half=True)print(path)
CLI
libreyolo export --model LibreYOLO9t.pt --format tensorrt --half
引数
model.export(    format="tensorrt",    imgsz=640,    batch=1,    half=False,    int8=False,    data=None,                      # int8=Trueの場合に必須    dynamic=False,    workspace=4.0,                  # ビルド時の作業領域 GiB    min_batch=1,                    # 動的プロファイルの境界    opt_batch=1,    max_batch=8,    hardware_compatibility="none",  # または"ampere_plus"    gpu_device=0,                   # マルチGPUホストでのビルドデバイス    verbose=False,)

エクスポートは2段階で実行されます。第1段階で一時パスにONNX中間ファイルを書き込み、第2段階でそれを解析してエンジンを構築し、その後に中間ファイルを削除します。workspaceはGiB単位のビルド時作業メモリです。値を大きくするとビルダーがより多くのカーネルを試せますが、推論時のメモリには影響しません。

メタデータサイドカーは<engine>.jsonとしてエンジンの隣に書き込まれ、ビルドで実際に実現した精度を記録します。GPUに高速なFP16やINT8がない場合、ビルダーは警告してフォールバックします。サイドカーには要求した精度ではなく、実際に生成された精度が記録されます。

FP16では、グラフ内のViTバックボーンを検出し、その浮動小数点レイヤーをFP32に固定します。DINOv2形式のバックボーンはFP16でオーバーフローしてNaNを生成するため、ビルドはOBEY_PRECISION_CONSTRAINTSを設定し、FP16 (FP32 ViT backbone)と報告します。CNNバックボーンではこの処理は何も変更しません。

動的バッチ

動的バッチエンジン
from libreyolo import LibreYOLO # プロファイルのバインド先を作るにはONNX中間ファイルに# 動的バッチ軸が必要LibreYOLO("LibreYOLO9t.pt").export(    format="tensorrt",    dynamic=True,    min_batch=1,    opt_batch=4,    max_batch=8,    half=True,)

dynamic=Truemin_batchからmax_batchまでを対象とし、opt_batchで最適化する1つの最適化プロファイルを追加します。これら3つの値はサイドカーにも記録されます。プロファイルが追加されるのは、ONNX中間ファイルに実際に動的バッチ次元がある場合だけです。それ以外では、静的最適化を使用することをログに記録して処理を続行します。

INT8

キャリブレーションデータを使うINT8
from libreyolo import LibreYOLO LibreYOLO("LibreYOLO9t.pt").export(    format="tensorrt",    int8=True,    data="coco128.yaml",   # 必須 この形式にはデフォルトがない    fraction=1.0,)

INT8はLibreYOLOのキャリブレーションローダーに対してTensorRTのエントロピーキャリブレーターを使用します。dataは必須で、この形式には8枚の画像を使うフォールバックがありません。キャリブレーションのデバイスバッファにはcuda-pythonまたはpycudaが必要です。キャリブレーションキャッシュのキーはONNXバイト列のハッシュなので、同じ出力パスに書き込む別モデルへスケールが再利用されることはありません。

half=Trueint8=Trueを同時に指定すると警告し、TensorRTで量子化できないレイヤー用にFP16フォールバックを保持したINT8をビルドします。

アーティファクトを実行

LibreYOLO経由
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t_fp16.engine")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
TensorRT単体
import json import tensorrt as trt path = "weights/LibreYOLO9t_fp16.engine"runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))with open(path, "rb") as handle:    engine = runtime.deserialize_cuda_engine(handle.read()) for i in range(engine.num_io_tensors):    name = engine.get_tensor_name(i)    print(engine.get_tensor_mode(name), name, engine.get_tensor_shape(name)) # クラス名 タスク 入力サイズはエンジンではなくサイドカーにある# ここではバッファ確保 前処理 後処理を自分で実装するprint(json.load(open(path + ".json"))["names"])

LibreYOLO().engine接尾辞に基づいて振り分け、サイドカーからクラス名、タスク、姿勢スキーマを読み取り、チェックポイントと同じResultsオブジェクトを返します。CUDAデバイスが存在しない場合は直ちに例外を送出します。

2つ目のスニペットはランタイムだけを使う方法です。ホストとデバイスのバッファ確保、前処理、デコード、NMS、座標の再スケーリングをすべて自分で実装する必要があります。エンジン自体にはクラス名が含まれないため、サイドカーも一緒に移動する必要があります。

制約

シリアライズ済みエンジンは、ビルドに使用したGPUアーキテクチャ、ドライバースタック、TensorRTバージョンに依存します。ワークステーションで構築したエンジンは別のアーキテクチャでは読み込めません。そのため、ビルド手順はデプロイ先のマシンで実行します。hardware_compatibility="ampere_plus"は、一部の性能と引き換えにAmpere以降の間で移植性を高めます。"same_compute_capability"の値はNONEにマッピングされ、警告を出します。エンジンは現在のGPUだけに最適化され、エクスポートは適用していない移植性を主張せず、その事実を明示します。

プロファイルの対象はバッチ軸だけです。動的な空間次元を持つビルドはこの契約の対象外なので、FCOSはブロックされます。FCOSは800×1333のアスペクト変換を維持するため、動的にパディングされた高さと幅を必要とします。

トレース前にブロックされる組み合わせは、YOLO9のセグメンテーション、RTMDet-Insのセグメンテーション、SSD、Faster R-CNN、RetinaNetの検出、BiRefNetまたはFeyNobgのマッティングです。これらではTensorRT 10.16が共有ONNXのDeformConvノードに到達しますが、プラグインレジストリにModulatedDeformConv2dがないため解析できません。

検証済みにもブロック対象にも分類されていない組み合わせでは変換処理を利用できますが、プロジェクトはTensorRTランタイムでの一致を記録していません。これは根拠の有無に関する記述であり、ビルドが成功するかどうかを示すものではありません。

ファミリーとタスクの完全なグリッドについては、エクスポートマトリックスを参照してください。1つの組み合わせを確認するには、次のようにします。

ビルド前にファミリーとタスクの組み合わせを確認
libreyolo formats --family yolo9 --task detect

devブランチのlibreyolo/export/tensorrt.py、libreyolo/export/exporter.py、libreyolo/export/support.py、libreyolo/backends/tensorrt.py、pyproject.tomlを参照しました。