コンテンツへスキップ

TensorRT YOLOv8 モデルのエクスポート

高性能環境でコンピュータビジョンモデルを展開するには、スピードと効率を最大化するフォーマットが必要になることがあります。これは、NVIDIA GPU上でモデルを展開する場合に特に当てはまります。

TensorRT エクスポート・フォーマットを使用することで Ultralytics YOLOv8モデルを強化することができます。このガイドでは、変換プロセスの手順をわかりやすく説明し、ディープラーニング・プロジェクトでNVIDIAの先進技術を最大限に活用できるようにします。

TensorRT

TensorRT 概要

TensorRTNVIDIAによって開発されたこのSDKは、高速ディープラーニング推論用に設計された先進的なソフトウェア開発キット(SDK)である。物体検出のようなリアルタイムアプリケーションに適している。

このツールキットは、NVIDIA GPU 向けにディープラーニングモデルを最適化し、より高速で効率的なオペレーションを実現します。TensorRT モデルは、レイヤー融合、精度キャリブレーション(INT8 および FP16)、動的tensor メモリ管理、およびカーネル自動チューニングなどの技術を含むTensorRT 最適化を受けます。ディープラーニングモデルをTensorRT 形式に変換することで、開発者は NVIDIA GPU の潜在能力を十分に発揮することができます。

TensorRT は、TensorFlow 、PyTorch 、ONNX を含む様々なモデルフォーマットとの互換性で知られており、開発者に異なるフレームワークのモデルを統合し最適化するための柔軟なソリューションを提供します。この汎用性により、多様なハードウェアおよびソフトウェア環境での効率的なモデル展開が可能になります。

TensorRT モデルの主な特徴

TensorRT モデルは、高速ディープラーニング推論における効率性と有効性に貢献する、さまざまな主要機能を提供する:

  • 精密キャリブレーション:TensorRT は精密キャリブレーションをサポートしており、特定の精度要件に合わせてモデルを微調整することができます。これにはINT8やFP16のような低精度フォーマットのサポートも含まれ、許容可能な精度レベルを維持しながら推論速度をさらに向上させることができます。

  • レイヤー融合:TensorRT 最適化プロセスには、ニューラルネットワークの複数のレイヤーを1つの演算に統合するレイヤー融合が含まれます。これにより計算オーバーヘッドが削減され、メモリアクセスと計算が最小化されるため推論速度が向上します。

TensorRT レイヤー・フュージョン

  • DynamicTensor Memory Management:TensorRT は、推論中のtensor メモリ使用量を効率的に管理し、メモリ・オーバーヘッドを削減し、メモリ割り当てを最適化します。その結果、GPU メモリの利用効率が向上します。

  • 自動カーネル・チューニング:TensorRT 自動カーネル・チューニングを適用し、モデルの各レイヤーに最適化されたGPUカーネルを選択します。この適応的なアプローチにより、モデルがGPUの計算能力をフルに活用できるようになります。

配備オプションTensorRT

YOLOv8 モデルをTensorRT フォーマットにエクスポートするコードを見る前に、TensorRT モデルが通常どこで使われるのかを理解しよう。

TensorRT にはいくつかの導入オプションがあり、各オプションで統合のしやすさ、パフォーマンスの最適化、柔軟性のバランスが異なっている:

  • TensorFlow 内に配置する: この方法はTensorRT をTensorFlow に統合し、最適化されたモデルを使い慣れたTensorFlow 環境で実行できるようにします。TF-TRTはこれらを効率的に処理できるため、サポートされているレイヤーとサポートされていないレイヤーが混在するモデルに便利です。

TensorRT 概要

  • スタンドアロンTensorRT ランタイムAPI:きめ細かい制御が可能で、パフォーマンスを重視するアプリケーションに最適。より複雑ですが、サポートされていない演算子のカスタム実装が可能です。

  • NVIDIATriton 推論サーバー:様々なフレームワークのモデルをサポートするオプション。特にクラウドやエッジ推論に適しており、モデルの同時実行やモデル分析などの機能を提供する。

YOLOv8 モデルのエクスポートTensorRT

YOLOv8 モデルをTensorRT フォーマットに変換することで、実行効率を向上させ、パフォーマンスを最適化することができます。

インストール

必要なパッケージをインストールするには、以下を実行する:

インストール

# Install the required package for YOLOv8
pip install ultralytics

インストールプロセスに関する詳細な説明とベストプラクティスについては、YOLOv8 インストールガイドをご覧ください。YOLOv8 に必要なパッケージをインストールする際に、何らかの問題が発生した場合は、解決策やヒントについて、よくある問題ガイドを参照してください。

使用方法

使い方の説明に入る前に、 Ultralytics が提供するYOLOv8 モデルのラインナップをご確認ください。これは、あなたのプロジェクトの要件に最も適したモデルを選択するのに役立ちます。

使用方法

from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO("yolov8n.pt")

# Export the model to TensorRT format
model.export(format="engine")  # creates 'yolov8n.engine'

# Load the exported TensorRT model
tensorrt_model = YOLO("yolov8n.engine")

# Run inference
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")
# Export a YOLOv8n PyTorch model to TensorRT format
yolo export model=yolov8n.pt format=engine  # creates 'yolov8n.engine''

# Run inference with the exported model
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'

エクスポートプロセスの詳細については、Ultralytics ドキュメントのエクスポートに関するページをご覧ください。

INT8 量子化によるTensorRT のエクスポート

INT8 精度のTensorRT を使用してUltralytics YOLO モデルをエクスポートすると、ポストトレーニング量子化(PTQ)が実行されます。TensorRT はPTQのためにキャリブレーションを使用します。これは、YOLO モデルが代表的な入力データに対して推論を処理する際に、各アクティベーションtensor 内のアクティベーションの分布を測定し、その分布を使用して各tensor のスケール値を推定します。量子化の候補となる各活性化tensor は、キャリブレーションプロセスによって推測される関連スケールを持つ。

暗黙的に量子化されたネットワークを処理するとき、TensorRT はレイヤーの実行時間を最適化するためにINT8を臨機応変に使用する。あるレイヤがINT8で高速に動作し、そのデータ入出力に量子化スケールが割り当てられている場合、INT8精度のカーネルがそのレイヤに割り当てられる。そうでない場合、TensorRT 、そのレイヤの実行時間が速くなる方に基づいて、カーネルにFP32またはFP16のいずれかの精度を選択する。

チップ

較正結果はデバイスによって異なる可能性があるため、TensorRT モデルウェイトを配備に使用するデバイスと同じものを INT8 精度でエクスポートするために使用することが重要です。

INT8エクスポートの設定

を使用する際に提供される引数です。 輸出 Ultralytics YOLO モデルの場合 大いに はエクスポートされたモデルのパフォーマンスに影響します。また、利用可能なデバイスリソースに基づいて選択する必要がありますが、デフォルトの引数 べきである ほとんどの場合 アンペア(または新しい)NVIDIAディスクリートGPU.使用される校正アルゴリズムは "ENTROPY_CALIBRATION_2" オプションの詳細については、こちらをご覧ください。 TensorRT 開発者ガイドUltralytics テストによると "ENTROPY_CALIBRATION_2" が最良の選択であり、輸出はこのアルゴリズムを使うことが確定している。

  • workspace :モデルの重みを変換する際のデバイスメモリの割り当てサイズ(GiB単位)を制御します。

    • を調整する。 workspace 校正のニーズとリソースの利用可能性に応じて、値を設定してください。より大きな workspace 較正時間が長くなる可能性がありますが、その分、TensorRT 、最適化の戦術を幅広く検討できるようになり、モデルの性能と精度が向上する可能性があります。逆に workspace は較正時間を短縮できるが、最適化戦略が制限され、量子化モデルの品質に影響を与える可能性がある。

    • デフォルトは workspace=4 (GiB)、キャリブレーションがクラッシュする(警告なしに終了する)場合は、この値を増やす必要があるかもしれません。

    • TensorRT 報告する UNSUPPORTED_STATE の値が workspace の値は、デバイスが利用可能なメモリよりも大きい。 workspace を下げるべきである。

    • もし workspace が最大値に設定され、較正が失敗/クラッシュする場合は、以下の値を下げることを検討してください。 imgsz そして batch を使用することで、必要なメモリを削減することができる。

    • INT8のキャリブレーションは各デバイスに固有であることを忘れないでください。キャリブレーションのために "ハイエンド "GPUを借りると、他のデバイスで推論を実行したときにパフォーマンスが低下する可能性があります。

  • batch :推論に使用される最大バッチサイズ。推論中、より小さいバッチを使用することもできるが、推論は指定されたバッチより大きいバッチは受け付けない。

    注

    キャリブレーション中、2回 batch 提供されたサイズが使用される。小バッチの使用は、較正時に不正確なスケーリングにつながる可能性があります。これは、プロセスが見たデータに基づいて調整するためです。小ロットの場合、値の全範囲を把握できない可能性があり、最終的な較正に問題が生じるため batch サイズは自動的に2倍になる。バッチサイズが指定されていない場合 batch=1校正は batch=1 * 2 較正のスケーリング誤差を減らす。

NVIDIA の実験によると、INT8 量子化キャリブレーションで、モデルのデータを代表するキャリブレーショ ン画像を少なくとも 500 枚使用することを推奨しています。これはガイドラインであり ハード と あなたのデータセットで何が必要かを試してみる必要がある。 TensorRT 、INT8の較正には較正データが必要ですので、必ず data 引数 int8=True TensorRT 、使用する。 data="my_dataset.yaml"の画像を使用する。 バリデーション で校正する。に値が渡されない場合 data INT8量子化でTensorRT 。 モデルタスクに基づく "小さな "サンプルデータセット エラーをスローしない。

例

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.export(
    format="engine",
    dynamic=True,  # (1)!
    batch=8,  # (2)!
    workspace=4,  # (3)!
    int8=True,
    data="coco.yaml",  # (4)!
)

# Load the exported TensorRT INT8 model
model = YOLO("yolov8n.engine", task="detect")

# Run inference
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. でエクスポートする場合、デフォルトで有効になります。 int8=True 明示的に設定されていない場合でも参照 輸出引数 をご覧ください。
  2. で較正するエクスポートモデルの最大バッチサイズを 8 に設定します。 batch = 2 * 8 校正時のスケーリングエラーを避けるため。
  3. 変換処理のためにデバイス全体を割り当てる代わりに、4GiBのメモリを割り当てる。
  4. COCOデータセットを校正に使用、特に検証に使用した画像(合計5,000枚)。
# Export a YOLOv8n PyTorch model to TensorRT format with INT8 quantization
yolo export model=yolov8n.pt format=engine batch=8 workspace=4 int8=True data=coco.yaml  # creates 'yolov8n.engine''

# Run inference with the exported TensorRT quantized model
yolo predict model=yolov8n.engine source='https://ultralytics.com/images/bus.jpg'
キャリブレーション・キャッシュ

TensorRT を生成します。 .cache これは、同じデータを使った将来のモデル重みのエクスポートを高速化するために再利用することができますが、データが大きく異なる場合や、次のような場合は、キャリブレーションがうまくいかない可能性があります。 batch 値が大幅に変更される。このような状況では、既存の .cache は名前を変えて別のディレクトリに移動するか、完全に削除する必要がある。

TensorRT INT8 でYOLO を使用する利点

  • モデルサイズの縮小:FP32からINT8への量子化により、(ディスク上またはメモリ上の)モデルサイズが4分の1になり、ダウンロード時間が短縮されます。

  • 消費電力の低減:INT8でエクスポートされたYOLO モデルの精度を下げた演算は、FP32モデルに比べて消費電力を抑えることができ、特にバッテリー駆動のデバイスに適しています。

  • 推論速度の向上: TensorRT は、ターゲットとなるハードウェアに合わせてモデルを最適化するため、GPU、組み込みデバイス、アクセラレータでの推論速度が向上する可能性があります。

推論速度に関するメモ

TensorRT INT8 にエクスポートされたモデルを使った最初の数回の推論呼び出しは、前処理、推論、後処理に通常より長い時間がかかることが予想されます。これは imgsz 推論中、特に imgsz は、エクスポート時に指定されたものと同じではありません(エクスポート imgsz はTensorRT 「最適」プロファイルとして設定されている)。

TensorRT INT8でYOLO 。

  • 評価指標の低下: より低い精度を使用すると mAP, Precision, Recall または モデルの性能を評価するために使用されるその他の指標 は多少悪くなる可能性が高い。以下の記事を参照されたい。 パフォーマンス結果セクション の違いを比較する。 mAP50 そして mAP50-95 様々なデバイスの小さなサンプルでINT8でエクスポートした場合。

  • 開発時間の増加:データセットとデバイスに応じたINT8較正の「最適」設定を見つけるには、かなりの量のテストが必要です。

  • ハードウェア依存性:キャリブレーションと性能向上はハードウェアに大きく依存する可能性があり、モデルの重みはあまり移植できない。

Ultralytics YOLO TensorRT 輸出実績

エヌビディアA100

パフォーマンス

Ubuntu 22.04.3 LTSでテスト、 python 3.10.12, ultralytics==8.2.4, tensorrt==8.6.1.post1

80の訓練済みクラスを含むCOCO上で訓練されたこれらのモデルの使用例については、Detection Docsを参照してください。

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 0.52 0.51 | 0.56 8 640
FP32 COCOval 0.52 0.52 0.37 1 640
FP16 予測する 0.34 0.34 | 0.41 8 640
FP16 COCOval 0.33 0.52 0.37 1 640
INT8 予測する 0.28 0.27 | 0.31 8 640
INT8 COCOval 0.29 0.47 0.33 1 640

COCOで訓練されたこれらのモデルの使用例については、Segmentation Docsを参照してください。

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n-seg.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
mAPval
50(M
)
mAPval
50-95(M
)
batch サイズ
(ピクセル)
FP32 予測する 0.62 0.61 | 0.68 8 640
FP32 COCOval 0.63 0.52 0.36 0.49 0.31 1 640
FP16 予測する 0.40 0.39 | 0.44 8 640
FP16 COCOval 0.43 0.52 0.36 0.49 0.30 1 640
INT8 予測する 0.34 0.33 | 0.37 8 640
INT8 COCOval 0.36 0.46 0.32 0.43 0.27 1 640

ImageNetで訓練されたこれらのモデルの使用例については、Classification Docsを参照してください。

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n-cls.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
トップ トップ5 batch サイズ
(ピクセル)
FP32 予測する 0.26 0.25 | 0.28 8 640
FP32 イメージネットバル 0.26 0.35 0.61 1 640
FP16 予測する 0.18 0.17 | 0.19 8 640
FP16 イメージネットバル 0.18 0.35 0.61 1 640
INT8 予測する 0.16 0.15 | 0.57 8 640
INT8 イメージネットバル 0.15 0.32 0.59 1 640

COCOで訓練されたこれらのモデルの使用例については、Pose Estimation Docsを参照してください。

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n-pose.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
mAPval
50(P
)
mAPval
50-95(P
)
batch サイズ
(ピクセル)
FP32 予測する 0.54 0.53 | 0.58 8 640
FP32 COCOval 0.55 0.91 0.69 0.80 0.51 1 640
FP16 予測する 0.37 0.35 | 0.41 8 640
FP16 COCOval 0.36 0.91 0.69 0.80 0.51 1 640
INT8 予測する 0.29 0.28 | 0.33 8 640
INT8 COCOval 0.30 0.90 0.68 0.78 0.47 1 640

DOTAv1で訓練されたこれらのモデルの使用例については、Oriented Detection Docsを参照のこと。

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n-obb.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 0.52 0.51 | 0.59 8 640
FP32 DOTAv1val 0.76 0.50 0.36 1 640
FP16 予測する 0.34 0.33 | 0.42 8 640
FP16 DOTAv1val 0.59 0.50 0.36 1 640
INT8 予測する 0.29 0.28 | 0.33 8 640
INT8 DOTAv1val 0.32 0.45 0.32 1 640

コンシューマー向けGPU

検出性能(COCO)

Windows 10.0.19045でテスト、 python 3.10.9, ultralytics==8.2.4, tensorrt==10.0.0b6

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 1.06 0.75 | 1.88 8 640
FP32 COCOval 1.37 0.52 0.37 1 640
FP16 予測する 0.62 0.75 | 1.13 8 640
FP16 COCOval 0.85 0.52 0.37 1 640
INT8 予測する 0.52 0.38 | 1.00 8 640
INT8 COCOval 0.74 0.47 0.33 1 640

Windows 10.0.22631でテスト、 python 3.11.9, ultralytics==8.2.4, tensorrt==10.0.1

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 1.76 1.69 | 1.87 8 640
FP32 COCOval 1.94 0.52 0.37 1 640
FP16 予測する 0.86 0.75 | 1.00 8 640
FP16 COCOval 1.43 0.52 0.37 1 640
INT8 予測する 0.80 0.75 | 1.00 8 640
INT8 COCOval 1.35 0.47 0.33 1 640

Pop!_OS 22.04 LTSでテスト、 python 3.10.12, ultralytics==8.2.4, tensorrt==8.6.1.post1

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 2.84 2.84 | 2.85 8 640
FP32 COCOval 2.94 0.52 0.37 1 640
FP16 予測する 1.09 1.09 | 1.10 8 640
FP16 COCOval 1.20 0.52 0.37 1 640
INT8 予測する 0.75 0.74 | 0.75 8 640
INT8 COCOval 0.76 0.47 0.33 1 640

組み込み機器

検出性能(COCO)

JetPack 6.0 (L4T 36.3) Ubuntu 22.04.4 LTSでテスト、 python 3.10.12, ultralytics==8.2.16, tensorrt==10.0.1

注

推論時間 mean, min (最速)、そして max (最も遅い) 事前学習された重みを使用した各テストについて yolov8n.engine

精密 評価試験 平均
(ms)
最小|最大
(ms)
mAPval
50(B
)
mAPval
50-95(B
)
batch サイズ
(ピクセル)
FP32 予測する 6.11 6.10 | 6.29 8 640
FP32 COCOval 6.17 0.52 0.37 1 640
FP16 予測する 3.18 3.18 | 3.20 8 640
FP16 COCOval 3.19 0.52 0.37 1 640
INT8 予測する 2.30 2.29 | 2.35 8 640
INT8 COCOval 2.32 0.46 0.32 1 640

インフォメーション

セットアップと設定の詳細については、NVIDIA Jetson withUltralytics YOLO のクイックスタートガイドをご覧ください。

評価方法

これらのモデルがどのようにエクスポートされ、テストされたかについては、以下のセクションを参照してください。

エクスポート設定

エクスポート設定引数の詳細については、エクスポート・モードを参照してください。

from ultralytics import YOLO

model = YOLO("yolov8n.pt")

# TensorRT FP32
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2)

# TensorRT FP16
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, half=True)

# TensorRT INT8 with calibration `data` (i.e. COCO, ImageNet, or DOTAv1 for appropriate model task)
out = model.export(
    format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, int8=True, data="coco8.yaml"
)
予測ループ

詳細は予測モードを参照。

import cv2
from ultralytics import YOLO

model = YOLO("yolov8n.engine")
img = cv2.imread("path/to/image.jpg")

for _ in range(100):
    result = model.predict(
        [img] * 8,  # batch=8 of the same image
        verbose=False,
        device="cuda",
    )
バリデーション設定

参照 val モード を参照してください。

from ultralytics import YOLO

model = YOLO("yolov8n.engine")
results = model.val(
    data="data.yaml",  # COCO, ImageNet, or DOTAv1 for appropriate model task
    batch=1,
    imgsz=640,
    verbose=False,
    device="cuda",
)

エクスポートされたYOLOv8 TensorRT モデルの展開

Ultralytics YOLOv8 モデルをTensorRT フォーマットにエクスポートすることに成功しました。様々な設定でのTensorRT モデルのデプロイに関する詳しい説明は、以下のリソースをご覧ください:

概要

このガイドでは、Ultralytics YOLOv8 モデルを NVIDIA のTensorRT モデルフォーマットに変換することに焦点を当てました。この変換ステップは、YOLOv8 モデルの効率と速度を向上させ、より効果的で多様な展開環境に適したものにするために非常に重要です。

使い方の詳細については、TensorRT 公式ドキュメントをご覧ください。

その他のUltralytics YOLOv8 の統合についてご興味がおありでしたら、統合ガイドのページで、有益なリソースや洞察を幅広くご紹介しています。



作成日:2024-01-28 更新日:2024-05-27
作成者:glenn-jocher(5),Burhan-Q(2),abirami-vina(1)

コメント