Skip to main content

TensorRTとDeepStream SDKサポートを使用してNVIDIA JetsonにYOLOv8をデプロイ

このガイドでは、訓練されたAIモデルをNVIDIA Jetsonプラットフォームにデプロイし、TensorRTとDeepStream SDKを使用して推論を実行する方法について説明します。ここでは、Jetsonプラットフォームでの推論性能を最大化するためにTensorRTを使用します。

前提条件

  • Ubuntu ホストPC(ネイティブまたはVMware Workstation Playerを使用したVM)
  • reComputer JetsonまたはJetPack 4.6以上を実行するその他のNVIDIA Jetsonデバイス

JetPackバージョンに対応するDeepStreamバージョン

YOLOv8をDeepStreamと連携させるために、このDeepStram-YOLOリポジトリを使用しており、これは異なるバージョンのDeepStreamをサポートしています。そのため、正しいバージョンのDeepStreamに応じて正しいバージョンのJetPackを使用するようにしてください。

DeepStreamバージョンJetPackバージョン
6.25.1.1
5.1
6.1.15.0.2
6.15.0.1 DP
6.0.14.6.3
4.6.2
4.6.1
6.04.6

このwikiを検証するために、reComputer J4012上で動作するJetPack 5.1.1システムにDeepStream SDK 6.2をインストールしました。

JetsonにJetPackをフラッシュする

Jetsonデバイスに、CUDA、TensorRT、cuDNNなどのSDKコンポーネントを含むJetPackシステムがフラッシュされていることを確認する必要があります。NVIDIA SDK Managerまたはコマンドラインを使用してJetPackをデバイスにフラッシュできます。

Seeed Jetson搭載デバイスのフラッシュガイドについては、以下のリンクを参照してください:

DeepStreamをインストールする

JetsonデバイスにDeepStreamをインストールする方法は複数あります。詳細についてはこのガイドを参照してください。ただし、成功かつ簡単なインストールを保証できるため、SDK Managerを使用してDeepStreamをインストールすることをお勧めします。

SDK managerを使用してDeepStreamをインストールする場合、システム起動後にDeepStreamの追加依存関係である以下のコマンドを実行する必要があります

sudo apt install \
libssl1.1 \
libgstreamer1.0-0 \
gstreamer1.0-tools \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly \
gstreamer1.0-libav \
libgstreamer-plugins-base1.0-dev \
libgstrtspserver-1.0-0 \
libjansson4 \
libyaml-cpp-dev

必要なパッケージのインストール

  • ステップ 1. Jetsonデバイスのターミナルにアクセスし、pipをインストールしてアップグレードします
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • ステップ2. 以下のリポジトリをクローンします
git clone https://github.com/ultralytics/ultralytics.git
  • ステップ3. requirements.txtを開く
cd ultralytics
vi requirements.txt
  • ステップ 4. 以下の行を編集します。ここでは、まず i を押して編集モードに入る必要があります。ESC を押してから :wq と入力して保存して終了します
# torch>=1.7.0
# torchvision>=0.8.1

注意: torch と torchvision は後でインストールされるため、現在は除外されています。

  • ステップ 5. 必要なパッケージをインストールする
pip3 install -r requirements.txt

インストーラーが古い python-dateutil パッケージについて警告する場合は、以下のコマンドでアップグレードしてください

pip3 install python-dateutil --upgrade

PyTorchとTorchvisionのインストール

JetsonプラットフォームはARM aarch64アーキテクチャをベースとしているため、pipからPyTorchとTorchvisionをインストールすることはできません。そのため、事前にビルドされたPyTorch pipホイールを手動でインストールし、Torchvisionをソースからコンパイル/インストールする必要があります。

すべてのPyTorchとTorchvisionのリンクにアクセスするには、このページをご覧ください。

以下はJetPack 5.0以降でサポートされているバージョンの一部です。

PyTorch v1.11.0

Python 3.8を使用したJetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0)でサポート

file_name: torch-1.11.0-cp38-cp38-linux_aarch64.whl URL: https://nvidia.box.com/shared/static/ssf2v7pf5i245fk4i0q926hy4imzs2ph.whl

PyTorch v1.12.0

Python 3.8を使用したJetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0)でサポート

file_name: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl URL: https://developer.download.nvidia.com/compute/redist/jp/v50/pytorch/torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl

  • ステップ 1. お使いのJetPackバージョンに応じて、以下の形式でtorchをインストールします
wget <URL> -O <file_name>
pip3 install <file_name>

例えば、ここではJP5.0.2を実行しているため、PyTorch v1.12.0を選択します

sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://developer.download.nvidia.com/compute/redist/jp/v50/pytorch/torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl -O torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
pip3 install torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
  • ステップ 2. インストールしたPyTorchのバージョンに応じてtorchvisionをインストールします。例えば、PyTorch v1.12.0を選択した場合、Torchvision v0.13.0を選択する必要があります
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.13.0 https://github.com/pytorch/vision torchvision
cd torchvision
python3 setup.py install --user

PyTorchのバージョンに応じてインストールする必要があるtorchvisionの対応バージョンのリストは以下の通りです:

  • PyTorch v1.11 - torchvision v0.12.0
  • PyTorch v1.12 - torchvision v0.13.0

より詳細なリストが必要な場合は、このリンクをご確認ください。

DeepStream YOLOv8の設定

  • ステップ 1. 以下のリポジトリをクローンします
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Step 2. Checkout the repo to the following commit
cd DeepStream-Yolo
git checkout 68f762d5bdeae7ac3458529bfe6fed72714336ca
  • ステップ 3. DeepStream-Yolo/utils から gen_wts_yoloV8.pyultralytics ディレクトリにコピーします
cp utils/gen_wts_yoloV8.py ~/ultralytics
  • ステップ 4. ultralytics リポジトリ内で、YOLOv8 releases から pt ファイル をダウンロードします(YOLOv8s の例)
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt

注意: カスタムモデルを使用することができますが、エンジンを正しく生成するために、cfg および weights/wts ファイル名に YOLO モデル参照 (yolov8_) を保持することが重要です。

  • ステップ 5. cfg、wts、および labels.txt(利用可能な場合)ファイルを生成します(YOLOv8s の例)
python3 gen_wts_yoloV8.py -w yolov8s.pt

注意: 推論サイズを変更するには(デフォルト: 640)

-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH

Example for 1280:

-s 1280
or
-s 1280 1280
  • ステップ 6. 生成された cfgwts、および labels.txt(生成された場合)ファイルを DeepStream-Yolo フォルダにコピーします
cp yolov8s.cfg ~/DeepStream-Yolo
cp yolov8s.wts ~/DeepStream-Yolo
cp labels.txt ~/DeepStream-Yolo
  • ステップ 7. DeepStream-Yolo フォルダを開き、ライブラリをコンパイルします
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.2/ 6.1.1 / 6.1
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
  • ステップ 8. あなたのモデルに応じて config_infer_primary_yoloV8.txt ファイルを編集します(80クラスのYOLOv8sの例)
[property]
...
custom-network-config=yolov8s.cfg
model-file=yolov8s.wts
...
num-detected-classes=80
...
  • Step 9. Edit the deepstream_app_config.txt file
...
[primary-gie]
...
config-file=config_infer_primary_yoloV8.txt
  • ステップ 10. deepstream_app_config.txt ファイル内のビデオソースを変更します。以下に示すように、デフォルトのビデオファイルが読み込まれています
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

推論の実行

deepstream-app -c deepstream_app_config.txt

上記の結果は、Jetson AGX Orin 32GB H01 KitでFP32とYOLOv8s 640x640を使用して実行されています。FPSは約60であることがわかりますが、これは真のFPSではありません。なぜなら、deepstream_app_config.txtファイルの**[sink0]の下でtype=2を設定すると、FPSはモニターのfpsに制限され、このテストで使用したモニターは60Hzモニターだからです。ただし、この値をtype=1**に変更すると、最大FPSを取得できますが、ライブ検出出力はありません。

上記で使用したのと同じビデオソースと同じモデルについて、[sink0]の下でtype=1に変更した後、以下の結果を得ることができます。

ご覧のように、実際のfps値に関連する約139のfpsを得ることができます。

INT8キャリブレーション

推論にINT8精度を使用したい場合は、以下の手順に従う必要があります

  • ステップ1. OpenCVをインストール
sudo apt-get install libopencv-dev
  • Step 2. Compile/recompile the nvdsinfer_custom_impl_Yolo library with OpenCV support
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.2/ 6.1.1 / 6.1
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
  • Step 3. COCOデータセットについて、val2017をダウンロードし、展開してDeepStream-Yoloフォルダに移動します

  • Step 4. キャリブレーション画像用の新しいディレクトリを作成します

mkdir calibration
  • ステップ 5. 以下を実行して、COCOデータセットから1000枚のランダムな画像を選択してキャリブレーションを実行します
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
cp ${jpg} calibration/; \
done

注意: NVIDIAは良好な精度を得るために少なくとも500枚の画像を推奨しています。この例では、より良い精度を得るために1000枚の画像が選択されています(画像数が多いほど精度が向上します)。INT8_CALIB_BATCH_SIZEの値を高くすると、より高い精度とより高速なキャリブレーション速度が得られます。GPUメモリに応じて設定してください。head -1000から設定できます。例えば、2000枚の画像の場合、head -2000とします。このプロセスには長時間かかる場合があります。

  • ステップ 6. 選択されたすべての画像でcalibration.txtファイルを作成する
realpath calibration/*jpg > calibration.txt
  • ステップ 7. 環境変数を設定する
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • ステップ 8. config_infer_primary_yoloV8.txt ファイルを更新する

変更前

...
model-engine-file=model_b1_gpu0_fp32.engine
#int8-calib-file=calib.table
...
network-mode=0
...

から

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • ステップ 9. 推論を実行する前に、前述のように deepstream_app_config.txt ファイルの [sink0] の下で type=2 を設定して、最大fps性能を得ます。

  • ステップ 10. 推論を実行します

deepstream-app -c deepstream_app_config.txt

ここで約350のFPS値を取得しました!

マルチストリーム設定

NVIDIA DeepStream では、単一の設定ファイルで複数のストリームを簡単にセットアップして、マルチストリーム映像解析アプリケーションを構築できます。このwikiの後半では、高いFPSパフォーマンスを持つモデルがマルチストリームアプリケーションにどのように役立つかを、いくつかのベンチマークとともに実演します。

ここでは9つのストリームを例に取り上げます。deepstream_app_config.txt ファイルを変更します。

  • ステップ 1. [tiled-display] セクション内で、行と列を3と3に変更して、9つのストリームで3x3グリッドを作成できるようにします
[tiled-display]
rows=3
columns=3
  • ステップ 2. [source0] セクション内で、num-sources=9 を設定し、さらに uri を追加します。ここでは、現在のサンプル動画ファイルを8回複製して、合計9つのストリームを作成します。ただし、アプリケーションに応じて異なる動画ストリームに変更することができます
[source0]
enable=1
type=3
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
num-sources=9

deepstream-app -c deepstream_app_config.txt コマンドでアプリケーションを再度実行すると、以下の出力が表示されます

trtexec ツール

samples ディレクトリには、trtexec と呼ばれるコマンドラインラッパーツールが含まれています。trtexec は、独自のアプリケーションを開発することなく TensorRT を使用するためのツールです。trtexec ツールには主に3つの目的があります:

  • ランダムまたはユーザー提供の入力データでネットワークをベンチマークする
  • モデルからシリアル化されたエンジンを生成する
  • ビルダーからシリアル化されたタイミングキャッシュを生成する

ここでは、trtexec ツールを使用して、異なるパラメータでモデルを迅速にベンチマークできます。しかし、まず最初に onnx モデルが必要で、この onnx モデルは ultralytics yolov8 を使用して生成できます。

  • Step 1. 以下を使用して ONNX をビルドします:
yolo mode=export model=yolov8s.pt format=onnx
  • ステップ1. 以下のようにtrtexecを使用してエンジンファイルをビルドします:
cd /usr/src/tensorrt/bin
./trtexec --onnx=<path_to_onnx_file> --saveEngine=<path_to_save_engine_file>

例えば:

./trtexec --onnx=/home/nvidia/yolov8s.onnx --saveEngine=/home/nvidia/yolov8s.engine

これにより、生成された**.engineファイルと共に以下のようなパフォーマンス結果が出力されます。デフォルトでは、ONNXをFP32**精度でTensorRT最適化ファイルに変換し、以下のような出力を確認できます

ここで平均レイテンシを7.2msとして取得でき、これは139FPSに相当します。これは前回のDeepStreamデモで得られたのと同じパフォーマンスです。

ただし、より良いパフォーマンスを提供するINT8精度が必要な場合は、上記のコマンドを以下のように実行できます

./trtexec --onnx=/home/nvidia/yolov8s.onnx --int8 --saveEngine=/home/nvidia/yolov8s.engine 

ここでは平均レイテンシを3.2msとして取ることができ、これは313FPSに相当します。

YOLOv8ベンチマーク結果

reComputer J4012AGX Orin 32GB H01 KitreComputer J2021で動作する異なるYOLOv8モデルのパフォーマンスベンチマークを実施しました。

YOLOv8モデルを使用して実施したより多くのパフォーマンスベンチマークについて詳しく知りたい場合は、私たちのブログをご確認ください。

マルチストリームモデルベンチマーク

reComputer Jetson Orinシリーズ製品でいくつかのdeepstreamアプリケーションを実行した後、YOLOv8sモデルでベンチマークを実施しました。

  • まず、単一のAIモデルを使用し、同じAIモデルで複数のストリームを実行しました
  • 次に、複数のAIモデルを使用し、複数のAIモデルで複数のストリームを実行しました

これらのベンチマークはすべて以下の条件下で実施されました:

  • YOLOv8s 640x640画像入力
  • UIを無効化
  • 最大電力と最大パフォーマンスモードをオン

これらのベンチマークから、最高性能のOrin NX 16GBデバイスでは、INT8の単一YOLOv8sモデルで約5fpsで約40台のカメラを使用でき、各ストリームにINT8の複数YOLOv8sモデルを使用する場合は約15fpsで約11台のカメラを使用できることがわかります。マルチモデルアプリケーションでは、デバイスのRAM制限により、また各モデルが相当量のRAMを消費するため、カメラの数は少なくなります。

要約すると、YOLOv8モデルのみでアプリケーションを実行せずにエッジデバイスを動作させる場合、Jetson Orin Nano 8GBは4-6ストリームをサポートでき、Jetson Orin NX 16GBは最大容量で16-18ストリームを管理できます。ただし、実際のアプリケーションでRAMリソースが使用されると、これらの数値は減少する可能性があります。したがって、これらの数値をガイドラインとして使用し、特定の条件下で独自のテストを実施することをお勧めします。

リソース

技術サポートと製品ディスカッション

私たちの製品をお選びいただき、ありがとうございます!私たちの製品での体験ができるだけスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。

Loading Comments...