NVIDIA DeepStream on Ubuntu — リアルタイム映像AIパイプラインの構築

GPU

この記事のポイント

  • DeepStream 7.1(CUDA 12.6)は nvcr.io/nvidia/deepstream:7.1-samples-multiarch でそのまま動く — RTX 4090 + Ubuntu 22.04 で動作確認済み
  • NVIDIA Container Toolkit を先に入れると --gpus all で GPU をコンテナに渡せる
  • パイプラインは deepstream-app -c <設定ファイル> 一行で起動できる
  • サンプル設定(/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/)がそのまま使えて、動作確認に最適

「カメラ映像から人や車をリアルタイムで検出したい」という用途を、PC 1台で実現するのが NVIDIA DeepStream です。GPU デコード → AI 推論 → オブジェクト追跡 → 描画出力をパイプラインとして繋げるフレームワークで、GStreamer プラグインとして実装されています。

本記事では、RTX 4090 + Ubuntu 22.04.5 LTS の環境でコンテナ版 DeepStream 7.1 を動かすまでの手順を、実際のコマンド出力付きで解説します。

注意

DeepStream を GPU で動かすには NVIDIA Container Toolkit のインストールが必須です。本記事のコマンドは Ubuntu 22.04 LTS で検証しています。Ubuntu 24.04 や WSL2 環境ではパッケージ名やパスが異なる場合があります。

DeepStream とは何か

DeepStream は NVIDIA が提供する映像解析 SDK です。GStreamer というオープンソースのマルチメディアフレームワーク上に、GPU アクセラレーションされた専用プラグインを重ねた構成になっています。

「なぜ普通の Python + PyTorch じゃだめなの?」という疑問を持つ方も多いと思います。Python で映像をフレームごとに読んで推論する場合、デコード・前処理・後処理のすべてを CPU が担います。DeepStream はデコードから描画まで GPU 側に載せるため、同じ GPU スペックで 4〜8 本のカメラ映像を並列処理できます。実際に公式が出しているベンチマークでは、RTX 4090 相当の GPU で 1080p × 30fps のストリームを 16 本以上同時処理しています。

DeepStream パイプライン構成(概念図)
DeepStream パイプライン構成(概念図)

パイプラインの流れは上図の通りです。映像ソース(RTSP / USB カメラ / ファイル)を受けて GPU デコード(nvv4l2decoder)、複数ストリームをバッチ化(nvstreammux)、TensorRT でリアルタイム推論(nvinfer)、オブジェクト追跡(nvtracker)、検出枠の描画(nvdsosd)、最後に出力(ファイル / RTSP / 画面表示)という流れです。

動作確認済み環境

nvidia-smi + DeepStream 7.1 バージョン確認(Playwright実撮影)
nvidia-smi + DeepStream 7.1 バージョン確認(Playwright実撮影)
RTX 4090 + DeepStream 7.1 実行環境(実測)
RTX 4090 + DeepStream 7.1 実行環境(実測)

上の数値は nvidia-smidocker run で実際に取得したものです。

項目 今回の環境 DeepStream 7.1 最低要件
OS Ubuntu 22.04.5 LTS Ubuntu 20.04 / 22.04
GPU NVIDIA RTX 4090 Maxwell 世代以降(compute 5.0+)
ドライバ 565.57.01 535 以上
CUDA(ドライバ対応) 12.7 12.x
DeepStream バージョン 7.1.0
GStreamer(Ubuntu 22.04) 1.20.3 1.16 以上

ドライバと GStreamer のバージョンはどちらも要件を満たしています。RTX 2070 以降の GPU であれば基本的に問題ありません。RTX 4090 は compute capability 8.9 で、TensorRT での INT8 量子化が使えるため推論速度の面でも有利です。

前提条件:NVIDIA ドライバを確認する

DeepStream コンテナを使う前に、ホスト側に NVIDIA ドライバが入っていることを確認します。




ubuntu@linuxlab: ~
$ nvidia-smi –query-gpu=name,driver_version,compute_cap –format=csv,noheader
NVIDIA GeForce RTX 4090, 565.57.01, 8.9

command not found と出た場合、まずドライバのインストールが必要です。Ubuntu 22.04 なら以下で入ります。




ubuntu@linuxlab: ~
$ sudo apt-get update
$ sudo apt-get install -y ubuntu-drivers-common
$ sudo ubuntu-drivers autoinstall
$ sudo reboot

再起動後に nvidia-smi が通ればドライバは OK です。

著者アイコン
著者アイコン

ドライババージョンは nvidia-smi の右上に表示されます。DeepStream 7.1 は 535 以降が必要なので、古いドライバ(470 系など)が入っている場合はアップデートしてください。

手順1:NVIDIA Container Toolkit をインストールする

DeepStream のコンテナを GPU で動かすには NVIDIA Container Toolkit が必須です。これは Docker に --gpus all を渡したときに GPU をコンテナに見せる仕組みを提供するパッケージです。

①GPGキーとリポジトリを追加する




ubuntu@linuxlab: ~
$ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg –dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
$ curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed ‘s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g’ \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

②パッケージをインストールして Docker を設定する




ubuntu@linuxlab: ~
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure –runtime=docker
$ sudo systemctl restart docker

インストール後、docker info | grep nvidianvidia ランタイムが表示されれば成功です。

③動作確認




ubuntu@linuxlab: ~
$ docker run –rm –gpus all ubuntu:22.04 nvidia-smi –query-gpu=name –format=csv,noheader
NVIDIA GeForce RTX 4090

GPU 名が表示されればコンテナ内から GPU を認識できています。

手順2:DeepStream コンテナをプルする

DeepStream の Docker イメージは NVIDIA GPU Cloud(NGC)から取得します。

DeepStream 7.1 コンテナ起動・バージョン確認(実測)
DeepStream 7.1 コンテナ起動・バージョン確認(実測)



ubuntu@linuxlab: ~
$ docker pull nvcr.io/nvidia/deepstream:7.1-samples-multiarch
7.1-samples-multiarch: Pulling from nvidia/deepstream
Status: Downloaded newer image for nvcr.io/nvidia/deepstream:7.1-samples-multiarch
nvcr.io/nvidia/deepstream:7.1-samples-multiarch

イメージサイズは数 GB あります。初回プルは通信速度次第で 10〜30 分かかることがあります。バージョンを確認するには以下を実行します。




ubuntu@linuxlab: ~
$ docker run –rm nvcr.io/nvidia/deepstream:7.1-samples-multiarch \
bash -c “cat /opt/nvidia/deepstream/deepstream/version”
Version: 7.1.0
DATE: Fri Oct 4 14:25:35 UTC 2024

コンテナ内の CUDA は 12.6.0 です(ホスト側のドライバが 12.7 対応でも動きます)。

NGC ログインは不要(2026年時点)

nvcr.io/nvidia/deepstream はパブリックイメージのため、NGC アカウントなしでプルできます。ただし Triton Inference Server との組み合わせイメージなど一部は要ログインです。

手順3:GStreamer の動作を確認する

DeepStream はパイプラインの基盤として GStreamer を使います。コンテナ外で GStreamer をテストしたい場合、Ubuntu 22.04 では以下でインストールできます。

GStreamer インストールログ(Ubuntu 22.04 実測)
GStreamer インストールログ(Ubuntu 22.04 実測)



ubuntu@linuxlab: ~ (ubuntu:22.04)
$ sudo apt-get install -y –no-install-recommends \
libgstreamer1.0-0 gstreamer1.0-tools \
gstreamer1.0-plugins-base gstreamer1.0-plugins-good
Setting up gstreamer1.0-tools (1.20.3-0ubuntu1.1) …
Setting up gstreamer1.0-plugins-base:amd64 (1.20.1-1ubuntu0.6) …
Setting up gstreamer1.0-plugins-good:amd64 (1.20.3-0ubuntu1.6) …
$ gst-launch-1.0 –version
gst-launch-1.0 version 1.20.3
GStreamer 1.20.3

Ubuntu 22.04 では GStreamer 1.20.3 が入ります。DeepStream 7.1 の要件(1.16 以上)を満たしています。

手順4:サンプルパイプラインを動かす

DeepStream コンテナには deepstream-app とサンプル設定ファイルが同梱されています。実際に動かしてみます。




ubuntu@linuxlab: ~
$ docker run –rm –gpus all \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
nvcr.io/nvidia/deepstream:7.1-samples-multiarch \
deepstream-app -c \
/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
Opening in BLOCKING MODE
NvMMLiteOpen : Block : BlockType = 261
Pipeline running

このサンプルは 4 本の 1080p 映像ファイルを同時デコードして、ResNet ベースの検出モデル(車・人・自転車・標識)を走らせます。画面付きの環境では Xorg へ映像が出力されます。

ヘッドレス環境(SSH)での実行

DISPLAY が設定されていないサーバーでは、設定ファイルの sink[sink0] / type=3(ファイル出力)か type=5(FakeSink)に変更してください。そうしないと表示エラーで起動できません。

サンプル設定の一覧を確認するには以下を実行します。




ubuntu@linuxlab: ~
$ docker run –rm nvcr.io/nvidia/deepstream:7.1-samples-multiarch \
ls /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/
config_infer_primary.txt
config_infer_primary.yml
config_infer_secondary_vehiclemake.txt
config_infer_secondary_vehicletypes.txt
config_mux_source30.txt
config_mux_source4.txt
config_preprocess.txt
source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
source30_1080p_dec_infer-resnet_tiled_display_int8.txt

source30_ で始まるものは 30 ストリームを同時処理するベンチマーク向けの設定です。source4_ の設定で試してから徐々に本数を増やすと GPU の限界を掴みやすいです。

GPU の Persistence Mode を確認する

DeepStream のように GPU を繰り返し呼び出すパイプラインでは、nvidia-persistenced が動いているかを確認します。このデーモンが GPU の Persistence Mode を有効にしておくことで、パイプライン起動のたびに発生する GPU 初期化遅延(数百ms)を排除できます。

nvidia-persistenced サービス状態(実測)
nvidia-persistenced サービス状態(実測)



ubuntu@linuxlab: ~
$ systemctl status nvidia-persistenced –no-pager
● nvidia-persistenced.service – NVIDIA Persistence Daemon
Active: active (running) since Sun 2026-06-14 18:05:18 JST; 6 days ago
Main PID: 1184 (nvidia-persiste)
Memory: 1020.0K

私の環境では active (running) の状態を 6 日間維持していました。inactive と出る場合は sudo systemctl enable --now nvidia-persistenced で有効化できます。

Python から DeepStream を使う(pyds)

GStreamer パイプラインを Python で組む場合、DeepStream は pyds(Python bindings)を提供しています。コンテナ内に同梱されているため、インストール不要で使えます。




ubuntu@linuxlab: ~ (deepstream コンテナ内)
$ python3 -c “import pyds; print(pyds.__version__)”
1.1.11
$ ls /opt/nvidia/deepstream/deepstream/sources/python/
apps bindings docs Makefile PYTHON_BINDINGS_INSTALL_GUIDE.md README.md

Python サンプルは sources/python/apps/ 以下にあります。deepstream-test1 が最も単純な単一ストリーム検出の例です。




ubuntu@linuxlab: ~ (deepstream コンテナ内)
$ ls /opt/nvidia/deepstream/deepstream/sources/python/apps/
deepstream-imagedata-multistream deepstream-test1 deepstream-test1-usbcam
deepstream-test2 deepstream-test3 deepstream-test3-on-triton deepstream-test4
deepstream-test5 deepstream-dewarper-test deepstream-nvdsanalytics-test
$ python3 deepstream-test1/deepstream_test_1.py <サンプル映像パス>
Creating Pipeline
Pipeline is running

よくあるエラーと解決策

①「WARNING: The NVIDIA Driver was not detected」

NVIDIA Container Toolkit が未設定の状態でコンテナを起動すると表示されます。GPU は使えません(デコード・推論がすべて CPU に落ちます)。手順1 に戻って nvidia-ctk runtime configure を実行してください。

②「Could not open display」

ヘッドレスサーバーで Xorg を持たない場合に出ます。設定ファイルの [sink0] セクションで type=3(EglSink 以外)に変えるか、type=5(FakeSink)を使って画面出力をスキップします。

③「No such file or directory: /dev/video0」

USB カメラを使う設定ファイルで、デバイスが認識されていないときに出ます。ls /dev/video* でデバイス番号を確認し、設定ファイルの camera-v4l2-dev-node を合わせてください。

④「TensorRT」関連エラー(エンジンファイルが見つからない)

DeepStream は初回起動時に TensorRT エンジンファイルを自動生成します。ファイルキャッシュが前回と GPU 世代が異なるときに起きます。--rm でコンテナを使い捨てにしていると毎回生成されて遅いため、ボリューム -v /tmp/deepstream_cache:/opt/nvidia/deepstream/deepstream/samples/models でキャッシュを外に出しておくと 2 回目以降が速くなります。

まとめ

DeepStream 7.1(CUDA 12.6)は nvcr.io/nvidia/deepstream:7.1-samples-multiarch をプルすれば、Ubuntu 22.04 + RTX 4090 の環境でそのまま動きます。GStreamer 1.20.3 はDeepStream の要件(1.16 以上)を満たしており、パッケージ管理も安定しています。

  • NVIDIA Container Toolkit のインストール → nvidia-ctk runtime configure --runtime=docker
  • コンテナプル → docker pull nvcr.io/nvidia/deepstream:7.1-samples-multiarch
  • サンプル実行 → deepstream-app -c <設定ファイル>
  • nvidia-persistenced が active (running) なら GPU 初期化遅延を排除できる

映像解析を自前サーバーに乗せるなら、GPU 搭載の VPS を使うのも現実的です。VPS の選び方は https://linuxlab.jp/ubuntu-server-setup/ で解説しています。

コメント

タイトルとURLをコピーしました