1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NVIDIA DeepStreamを "Jetson上でなく" x86-64 Ubuntu 22.04 x RTX3060Tiの環境で利用するためのセットアップ手順と推論スクリプトの実行例

Last updated at Posted at 2025-02-13

Jetsonで使えるNVIDIA DeepStreamをx86_64で試す

NVIDIA DeepStreamは動画に対してAI処理を適用することのできるミドルウェアです。みなさん大好きJetsonで利用することができますが、私はJetsonをまだ入手できていないため、事前調査として、RTX3060Ti(Ampere) を搭載した x86_64 Ubuntu22.04上 でDeepStreamを使ってみました。DeepStreamはいくつかのミドルウェアと連携して動作するため、本記事では、それら依存するミドルウェアのインストールも含めて、DeepStreamを使うまでの手順を紹介します。NVIDIA DeepStreamはCUDAのバージョン12.8を未だサポートしていないため、そのあたりも回避する手順となっております、是非ご活用ください。

image.png

Screenshot from 2025-02-13 11-54-48.png

注意:ONNXモデルのファイルのみが存在し、TensorRT engineが存在しない状態でDeepStreamによる推論を実行すると、TensorRT engineが見つからなかった旨のerrorを吐いた後、真っ黒な画面が開き30秒~1分程度固まります。これは裏でDeepStreamがONNXモデルからTenserRT engineを生成しているためで不具合ではありません。落ち着いて、待ちましょう。

ハードウェアの構成

今回は以下の環境にNVIDIAの提供する開発フレームワークをセットアップしました。

  • Core i5-14500 (14cores, 20threads)
  • RAM 64GB
  • NVIDIA GeForce RTX3060Ti 8GB x2
  • Ubuntu 22.04 LTS
    • Yocto Linux等、併設する他の開発環境も考慮しました

NVIDIAのツールセットをインストールする前準備をする

まず、 OSのインストールや開発に便利なツールなどのインストールを行い、 NVIDIAのツールセットをインストールするための土台を組み上げていきます。

Ubuntu 22.04 LTSをインストールする

まず、PCに「Ubuntu22.04 LTS」をインストールします。以下のインストーラーを利用し、インストールしました。 なお今回、当方の環境ではインストーラーを起動しようとすると、RTX3060Tiがブラックアウトする状態となってしまったため 「汎用グラフィックデバイスのドライバ「nouveau」を無効化する」 までの手順はRTX3060Tiを外して マザーボード上のオンボードのHDMIポートを利用してインストールしました。

ubuntu2204

最低限必要な前準備を行う

日本語設定でインストールすると、ホームディレクトリ以下に日本語名のディレクトリが作成されてしまい、何かと不都合が生じるため xdg-user-dirs-gtk-update を使ってディレクトリを英語名に変更します。 また、以降の手順にて sudo を利用することが多いため、 sudo 実行時にパスワードを求められないよう /etc/sudoersshino ALL=(ALL:ALL) NOPASSWD:ALL の設定を追記し、パスワード無しでsudoできるようにしました。 設定した後、OSを再起動します。

### ホームディレクトリへ移動
$ cd ~

### ホームディレクトリ名から日本語を除外する
$ LANG=C xdg-user-dirs-gtk-update

### ユーザーからsudoをパスワード無しで実行できるようにする
$ sudo vi /etc/sudoers
# -->> 以下の行を追加する(ユーザー名がshinoの場合)
# shino   ALL=(ALL:ALL) NOPASSWD:ALL

### 再起動する
$ sudo reboot

Ubuntuのパッケージをすべて更新する

続いて、Ubuntuのパッケージを最新の状態へと更新します。
また、エディタを追加します。

# リポジトリにアクセス
$ sudo apt update

# 更新可能なパッケージをすべてアップグレード
$ sudo apt upgrade

# 再起動
$ sudo reboot

リモートから開発できるようにSSHサーバをインストールする

Ubuntuをリモートからも利用したいため openssh-server をインストールし、SSH接続ができるように設定を行います (必須の手順ではありませんが、操作が簡単にになります)。 Visual Studio Codeや、Windowsのターミナルからパスワード入力すること無くSSH接続したい場合は、下記の記事をご参照ください。

### sshサーバをインストールします
$ sudo apt install openssh-server

### Ubuntu24.04からsshdでなくsshになっています 
# ... 起動時にサービスが開始されるように設定します
$ sudo systemctl start ssh
$ sudo systemctl enable ssh

### vimエディタをインストールします。
$ sudo apt install vim
$ sudo update-alternatives --config vi
# alternative vi (/usr/bin/vi を提供) には 2 個の選択肢があります。
# 
#   選択肢    パス              優先度  状態
# ------------------------------------------------------------
# * 0            /usr/bin/vim.basic   30        自動モード
#   1            /usr/bin/vim.basic   30        手動モード
#   2            /usr/bin/vim.tiny    15        手動モード
# 
# 現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:
# -->> [Enter]

### Ubuntu上での操作
$ mkdir -p /home/shino/.ssh
$ touch /home/shino/.ssh/authorized_keys
$ sudo chmod 700 /home/shino/.ssh
$ sudo chmod 640 /home/shino/.ssh/authorized_keys

### 公開鍵を登録する
$ vi /home/shino/.ssh/authorized_keys
# -->> Windows上の "id_rsa.pub" の内容を書き込む

### 再起動する
$ sudo reboot

GeForce RTX3060Tiのドライバをインストールする

続いて、GPUのドライバをインストールします。

汎用グラフィックデバイスのドライバ「nouveau」を無効化する

Ubuntu 22.04には 汎用のグラフィックボード用のドライバ「nouveau」が組み込まれており、これがGeForce RTX3060Tiのインストールを阻害 します。そのため、まずnouveauを無効化します。無効化する設定を行った後に再起動することで、汎用のグラフィックボードドライバがロードされなくなります。

# ファイルを新規作成し、無効化設定を記述する
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

# 保存したらinitramfsを更新して再起動
$ sudo update-initramfs -u

# UEFI/BIOSの設定を変更するために一旦電源OFF
$ sudo poweroff

本手順を行った後は NVIDIA GeForce RTX3060Tiから映像が出力できるようになる ため、一旦電源をOFFにし、グラフィックボードを搭載し、グラフィックボードのHDMI端子とディスプレイを接続します。

Secure Bootを無効化する

NVIDIA GPUのデバイスドライバをインストールを進める前に、MotherboardのUEFI画面からSecure Bootを無効にします。UEFIを起動して Settings/Security/Secure BootSecure BootDiasable にしました。Secure Bootを有効にしたままGeForceのドライバを入れる方法もあるようですが、テクニックが必要になるため、ここでは手順を省略します。

sedureboot

搭載されているGPUを確認し、古いドライバを除去する

NVIDIAのGPUが搭載されていることをlspciコマンドで確認します。今回の環境にはRTX3060Tiが2基搭載されていますので、以下のように2つのデバイスが検出されます。

$ lspci | grep -i vga
# 01:00.0 VGA compatible controller: NVIDIA Corporation GA103 [GeForce RTX 3060 Ti] (rev a1)
# 04:00.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3060 Ti Lite Hash Rate] (rev a1)

GPUのドライバをインストールする前に、NVIDIAに関する古いパッケージがインストールされていないか確認し、削除します。本手順はUbuntu22.04をクリーンインストールしているため、特に削除するパッケージは存在しないはずです。

$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda
$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*
$ sudo apt-get --purge remove libcudnn*
$ sudo apt-get --purge remove cudnn-*
$ sudo apt autoremove -y

GPUに適切なドライバをインストールする

GPUのデバイスドライバが含まれているリポジトリ ppa:graphics-drivers/ppaadd-apt-repository で追加し、 ubuntu-drivers devices で適切なデバイスドライバを検索し sudo apt install nvidia-driver-560 でインストールします。 本例では NVIDIA GeForce RTX 3060Ti のデバイスドライバをインストールしています。ここでは recommended の nvidia-driver-560 を選択しました。なお、 以降の手順でインストールするTensorRT は560以上のデバイスドライバが、 NVIDIA TAO Toolkit には550以上のドライバが必要です。

# Linuxカーネルのヘッダをインストールする
$ sudo apt update
$ sudo apt install linux-headers-$(uname -r)

# GPUのドライバが含まれているリポジトリをシステムに登録します
$ sudo add-apt-repository ppa:graphics-drivers/ppa

# パッケージ情報を最新にします
$ sudo apt update

# インストール可能なドライバのリストを表示します
$ ubuntu-drivers devices
# == /sys/devices/pci0000:00/0000:00:1c.4/0000:04:00.0 ==
# modalias : pci:v000010DEd00002489sv00001462sd00008D9Bbc03sc00i00
# vendor   : NVIDIA Corporation
# model    : GA104 [GeForce RTX 3060 Ti Lite Hash Rate]
# driver   : nvidia-driver-535-open - distro non-free
# driver   : nvidia-driver-550 - third-party non-free
# driver   : nvidia-driver-570-open - third-party non-free
# driver   : nvidia-driver-560-open - third-party non-free
# driver   : nvidia-driver-545-open - distro non-free
# driver   : nvidia-driver-550-open - third-party non-free
# driver   : nvidia-driver-565 - third-party non-free
# driver   : nvidia-driver-535-server-open - distro non-free
# driver   : nvidia-driver-470-server - distro non-free
# driver   : nvidia-driver-560 - third-party non-free recommended
# driver   : nvidia-driver-470 - distro non-free
# driver   : nvidia-driver-545 - distro non-free
# driver   : nvidia-driver-535-server - distro non-free
# driver   : nvidia-driver-535 - distro non-free
# driver   : nvidia-driver-565-open - third-party non-free
# driver   : nvidia-driver-570 - third-party non-free
# driver   : xserver-xorg-video-nouveau - distro free builtin

# 560.x のデバイスドライバをインストールする
$ sudo apt install nvidia-driver-560

# initramfsを更新します 
$ sudo update-initramfs -u

# システムを再起動します
$ sudo reboot

GPUを認識できることを確認する

nvidia-smi を実行し、GPUの情報が出力されればインストールは成功しています。

$ nvidia-smi
# Wed Feb 12 09:14:58 2025
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 560.35.03              Driver Version: 560.35.03      CUDA Version: 12.6     |
# |-----------------------------------------+------------------------+----------------------+
# | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
# | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
# |                                         |                        |               MIG M. |
# |=========================================+========================+======================|
# |   0  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:01:00.0  On |                  N/A |
# | 30%   35C    P8             12W /  200W |     375MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# |   1  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:04:00.0 Off |                  N/A |
# | 37%   32C    P8              9W /  200W |      15MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# 
# +-----------------------------------------------------------------------------------------+
# | Processes:                                                                              |
# |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
# |        ID   ID                                                               Usage      |
# |=========================================================================================|
# |    0   N/A  N/A      1583      G   /usr/lib/xorg/Xorg                            203MiB |
# |    0   N/A  N/A      1852      G   /usr/bin/gnome-shell                          124MiB |
# |    1   N/A  N/A      1583      G   /usr/lib/xorg/Xorg                              4MiB |
# +-----------------------------------------------------------------------------------------+

映像を扱うためのライブラリをインストールする

Pythonから映像を扱うために必要とされる、代表的なライブラリをインストールします。また、Webカメラを利用することもあると思いますので v4l2 もインストールしておきましょう。

# python3-pipもインストールします
$ sudo apt install python3-pip

# 映像を扱うため、以下のパッケージもインストールする
$ sudo apt install v4l-utils
$ sudo apt install python3-opencv
$ sudo apt install -y python3-dev python3-pip
$ sudo apt install -y libopencv-dev
$ pip install -U --user pip
$ sudo apt install -y wget git

# デバイスが見えることを確認する
# -->> USBカメラ "https://www.amazon.co.jp/dp/B07MBQ1PT3/" を接続している
$ ls /dev/video*
# /dev/video0  /dev/video1

$ v4l2-ctl --all
# Driver Info:
#         Driver name      : uvcvideo
#         Card type        : HD Webcam eMeet C960: HD Webcam
#         Bus info         : usb-0000:00:14.0-5.1.4
#         Driver version   : 6.8.12
#         Capabilities     : 0x84a00001
#                 Video Capture
#                 Metadata Capture
#                 Streaming
#                 Extended Pix Format
#                 Device Capabilities
# ...

# pythonからWEBカメラを制御できることを確認する
$ python3
# Python 3.10.12 (main, Jan 17 2025, 14:35:34) [GCC 11.4.0] on linux
>>> import cv2
>>> cap = cv2.VideoCapture(0)
>>> ret, img = cap.read()
>>> cv2.imshow('Video', img)
>>> cv2.waitKey(0)
>>> quit()

GPUを使うためのライブラリ群をインストールする

続いてNVIDIA TAO Toolkitをはじめ、NVIDIAの提供する開発パッケージをインストールします。 インストールの前に、それらが依存するパッケージをインストールする必要があります。 今回は、以下の6種類のパッケージをインストールしました。 これらのパッケージは NVIDIA TAOが転移学習を実行しようとした際に呼び出され、AIモデルの開発環境として機能します。 NVIDIA TAO Toolkitから入手できるAIモデルを内包したJupyter Notebook形式のPythonスクリプトは、これらのパッケージがインストールされているものとして機能するため、 これらのインストールが不完全な状態でNVIDIA TAOを実行すると、TAOの実行中にエラーが発生します。

  1. CUDA ... GPUへアクセスするためにインストール
  2. cuDNN ... Neural NetworkからCUDAへアクセスするためにインストール
  3. Docker ... NVIDIA TAOを実行するための仮想環境として追加
  4. NVIDIA Container Toolkit ... Docker上からGPUを利用するために必要
  5. NGC CLI ... NGC (NVIDIA GPU Cloud) を連携するためのCLIツール
  6. TensorRT ... NVIDIA DeepStream等のAI関連のミドルウェアに必要なAIフレームワーク
  7. Anaconda3 ... NVIDIA TAO Toolkitと連携するための仮想環境も作成する
  8. NVIDIA TAO Toolkit ... 転移学習によりAIを開発できるツールキット
  9. NVIDIA DeepStream ... AIを呼び出せるようNVIDIAにより拡張されたGStreamer

1. CUDA==12.6 をインストールする

まず、プログラムがGPUへアクセスするためのパッケージ「CUDA」をインストールします。 Webサイトを参考に、表示されるコマンドを入力することでインストールすることができます。インストールの際は「Ubuntu22.04」を選択してください。 なお、以降の手順でインストールするNVIDIA DeepStreamは CUDA 12.8 に対応しておらず CUDA 12.6 までしかをサポートしていないことから、ここでは CUDA 12.6 をインストールします。

image.png

# CUDAのダウンロードサイトに書かれた手順をそのまま実行
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
$ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2204-12-6-local_12.6.3-560.35.05-1_amd64.deb
$ sudo cp /var/cuda-repo-ubuntu2204-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-6
$ sudo apt-get install -y cuda-drivers

インストール後、CUDAのツールにパスを通します。

# 最後の行に下記の4行を追加する
$ vi ~/.bashrc
export PATH="/usr/local/cuda/bin:$PATH"
export PATH="~/.local/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
export CUDA_PATH="/usr/local/cuda-12.6"

# 設定した環境変数を反映させます
$ source ~/.bashrc

nvcc コマンドでCUDAの情報が出てくればインストールに成功しています。

$ nvcc -V
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2024 NVIDIA Corporation
# Built on Tue_Oct_29_23:50:19_PDT_2024
# Cuda compilation tools, release 12.6, V12.6.85
# Build cuda_12.6.r12.6/compiler.35059454_0

2. cuDNNをインストールする

続いて、ディープニューラルネットワーク(DNN)がCUDAを利用するためのパッケージ「cuDNN」をインストールします。 下記のWebサイトを参考に、表示されるコマンドを入力することでインストールすることができます。

image.png

# cuDNNのダウンロードサイトに書かれた手順をそのまま実行します
$ wget https://developer.download.nvidia.com/compute/cudnn/9.8.0/local_installers/cudnn-local-repo-ubuntu2204-9.8.0_1.0-1_amd64.deb
$ sudo dpkg -i cudnn-local-repo-ubuntu2204-9.8.0_1.0-1_amd64.deb
$ sudo cp /var/cudnn-local-repo-ubuntu2204-9.8.0/cudnn-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cudnn
$ sudo apt-get -y install cudnn-cuda-12

3. Dockerをインストールする

NVIDIA TAO Toolkitから呼び出される、仮想環境のDockerをインストールします。Dockerのインストールは以下の公式サイトを参考に、Ubuntuのパッケージ管理ツールがaptであるため 「Installation methods -> install using the apt repository」の手順 でインストールします。なお、Dockerはデフォルトで特権ユーザー(root)のみが実行可能で、他のユーザーからは sudo を付与して実行するようになっています。毎回 sudo を付けることは面倒なため、通常ユーザーからも sudo 無しでDockerを制御できるよう設定を加えます。

# 古いパッケージを削除する
$ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

# 必要なパッケージをインストールする
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl

# インストール時に使用するGPG鍵をシステムに追加する
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# Dockerをインストールする元のリポジトリをシステムに追加する
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Dockerエンジンのインストール
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Dockerが動くことを確認する
$ sudo docker run --rm hello-world
# latest: Pulling from library/hello-world
# c1ec31eb5944: Pull complete 
# Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
# Status: Downloaded newer image for hello-world:latest
# Hello from Docker!
# ...

# 非rootユーザーもDockerを操作できるようにする
$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker

# Linux起動時にDockerサービスが起動するよう設定する
$ sudo systemctl start docker.service
$ sudo systemctl enable docker.service
$ sudo systemctl start containerd.service
$ sudo systemctl enable containerd.service

# 再起動
$ sudo reboot

再起動後、dockerコマンドをsudo無しで実行できるか確認します。

$ docker run --rm hello-world
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# 
# ...

4. NVIDIA Container Toolkitをインストールする

NVIDIA Container Toolkitはコンテナ(Docker)の内部から、ホストPCに搭載されたGPUを利用するために必要なパッケージです。下記のWebサイトを参考にインストールを行います。 NVIDIA Container Toolkitのインストール後は、PyTorchのコンテナを利用して、コンテナ内からGPUにアクセスできることを確認 しましょう。

# NVIDIA Container Toolkitの格納されたリポジトリ情報をシステムに登録する
$ 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
$ sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list

# NVIDIA Container Toolkitをインストールする
$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit

# コンテナのランタイムがDockerであることを登録する
$ sudo nvidia-ctk runtime configure --runtime=docker
# INFO[0000] Config file does not exist; using empty config
# INFO[0000] Wrote updated config to /etc/docker/daemon.json
# INFO[0000] It is recommended that docker daemon be restarted.

# Dockerサービスを再起動する
$ sudo systemctl restart docker

# GPUが見えなくなる問題の対策
# -->> https://qiita.com/tttamaki/items/4f369633b7f53f5131a1
$ sudo vi /etc/docker/daemon.json
{   
    "runtimes": { 
        "nvidia": { 
            "args": [],
            "path": "nvidia-container-runtime"
        }
    },
    "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

# Dockerサービスを再起動する
$ sudo systemctl restart docker

# Dockerにプロセス管理機能cgroup設定が結びつけられていることを確認する
$ docker info | grep Cgroup
# Cgroup Driver: cgroupfs
# Cgroup Version: 2

コンテナからGPUへアクセスできることを確認する

コンテナからGPUを利用できることの確認は、以下の 「pytorch/pytorch:2.6.0-cuda12.6-cudnn9-devel」 コンテナを利用します。 --gpu all オプションをつけることで、ホストの持つすべてのGPUリソースをコンテナへ提供することが可能です。

# Dockerコンテナを取得して、コンテナにすべてのGPUを接続する
(host) $ docker run --rm -it --gpus all pytorch/pytorch:2.6.0-cuda12.6-cudnn9-devel

# コンテナにログインできた
(container) $ 

# ログイン中のユーザーを確認する
(container) $ whoami
root

# 開発ツールのバージョンを確認する
(container) $ /usr/local/cuda/bin/nvcc --version
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2024 NVIDIA Corporation
# Built on Tue_Oct_29_23:50:19_PDT_2024
# Cuda compilation tools, release 12.6, V12.6.85
# Build cuda_12.6.r12.6/compiler.35059454_0

# nvidia-smiでGPUリソースを確認する
(container) $ nvidia-smi
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 560.35.03              Driver Version: 560.35.03      CUDA Version: 12.6     |
# |-----------------------------------------+------------------------+----------------------+
# | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
# | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
# |                                         |                        |               MIG M. |
# |=========================================+========================+======================|
# |   0  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:01:00.0  On |                  N/A |
# |  0%   39C    P8             15W /  200W |     343MiB /   8192MiB |     27%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# |   1  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:04:00.0 Off |                  N/A |
# | 37%   30C    P8              9W /  200W |      15MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# 
# +-----------------------------------------------------------------------------------------+
# | Processes:                                                                              |
# |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
# |        ID   ID                                                               Usage      |
# |=========================================================================================|
# +-----------------------------------------------------------------------------------------+

# コンテナから抜ける
(container) $ exit

# ホストでプロセスやコンテナが残っていないか確認する
(host) $ docker container ls -a
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
(host) $ docker ps -a
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

5. NGC CLIをインストールする

続いて、AIモデル等をNVIDIAのクラウド 「NGC (NVIDIA GPU Cloud)」 から入手するために利用する NGC CLI のセットアップを行います。まず、zip形式のNGC CLIをダウンロードし、展開した後、パスを通します。

# 自身のホームディレクトリにNGC CLIをインストールする
$ cd ~

# NGC CLIをダウンロードする
$ wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/versions/3.59.0/files/ngccli_linux.zip -O ngccli_linux.zip && unzip ngccli_linux.zip

# md5sumを参照し、破損していないことを確認する
$ find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5

# sha256sumを参照し、破損していないことを確認する
$ sha256sum ngccli_linux.zip
# 87f03dab6d05e97547fb213ee4932654b3f6fccf82ca75f470d5cd3a4e8be8be  ngccli_linux.zip

# NGC CLIに実行権限を付与してパスを通す
$ chmod u+x ngc-cli/ngc
$ echo "export PATH=\"\$PATH:$(pwd)/ngc-cli\"" >> ~/.bashrc && source ~/.bashrc

続いて、 ブラウザでNGCにアクセス し、アクセストークンと呼ばれる NGCへログインするための鍵を取得して ngc config set コマンドを利用してNGC CLIに鍵を登録 します。NGCへログインするための鍵は、下記の手順で入手することが可能です。 本手順を行うには、NGCのユーザー登録[無料]が必要です。

NGCCLI

ブラウザを使って作成したNGCへログインするための鍵をNGC CLIへ登録します。

# NGCへログインするための情報を設定する
$ ngc config set
## NGC Catalog -> Account -> Setup -> Generate API Key
# Enter API key [no-apikey]. Choices: [<VALID_APIKEY>, 'no-apikey']: dGdzM3EwYW0zcWUwaGtua2IyMmo4bHExNXE6ODFhOGQ2OGItMzE5...
## Select "ascii"
# Enter CLI output format type [ascii]. Choices: ['ascii', 'csv', 'json']: 
## Select UserName
# Enter org [no-org]. Choices: ['xtrize (063599036568----)']: xtrize (063599036568----)
## Select team
# Enter team [no-team]. Choices: ['no-team']: 
## Select ace
# Enter ace [no-ace]. Choices: ['no-ace']: 
# Validating configuration...
# Successfully validated configuration.
# Saving configuration...
# Successfully saved NGC configuration to /home/shino/.ngc/config

# Dockerコンテナをダウンロードする際に利用するNGC CLIの設定
$ docker login nvcr.io
# Username: $oauthtoken
# Password: <Set NGC API Key>
# WARNING! Your password will be stored unencrypted in /home/shino/.docker/config.json.
# Configure a credential helper to remove this warning. See
# https://docs.docker.com/engine/reference/commandline/login/#credential-stores
# 
# Login Succeeded

# ...

6. TensorRT をインストールする

TensorRTは CUDA cuDNN Linux Distribution にあわせたバージョンのパッケージをインストールする必要があります。今回は CUDA=12.6 cuDNN=9.8.0 Ubuntu22.04 を利用するため、以下のダウンロードページより nv-tensorrt-local-repo-ubuntu2204-10.9.0-cuda-12.8_1.0-1 を入手します。

image.png

image.png

# ホームディレクトリへ移動
$ cd ~

# TensorRTのパッケージをダウンロードする
$ wget https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/10.9.0/local_repo/nv-tensorrt-local-repo-ubuntu2204-10.9.0-cuda-12.8_1.0-1_amd64.deb

以下のサイトの Debian Installation 手順に沿って、TensorRTをインストールします。

### 変数を設定する
$ os="ubuntu2204"
$ tag="10.9.0-cuda-12.8" # CUDA==12.6ですが12.8を指定して問題ありません

### TensorRTが含まれるリポジトリを設定する
$ sudo dpkg -i nv-tensorrt-local-repo-${os}-${tag}_1.0-1_amd64.deb
$ sudo cp /var/nv-tensorrt-local-repo-${os}-${tag}/*-keyring.gpg /usr/share/keyrings/

### パッケージリストを更新する
$ sudo apt-get update

### TensorRTをインストールする
$ sudo apt-get install tensorrt 
### ランタイムパッケージをインストールする
$ sudo apt-get install libnvinfer-lean10 libnvinfer-vc-plugin10 libnvinfer-dispatch10 libnvinfer-vc-plugin10
### Python3向けのパッケージをインストールする
$ sudo apt-get install python3-libnvinfer python3-libnvinfer-lean python3-libnvinfer-dispatch python3-libnvinfer-dev
### devパッケージをインストールする
$ sudo apt-get install tensorrt tensorrt-dev tensorrt-libs

### pythonからTensorRTを呼び出してみる
$ python3 --version
# Python 3.10.12

$ python3
>>> import tensorrt as trt
>>> print(trt.__version__)
# 10.9.0.34
>>> assert trt.Builder(trt.Logger())
# 特にメッセージが出なければ問題ありません
# -->> Error発生時:[TensorRT] ERROR: CUDA initialization failure with error 100. Please check your CUDA installation: ...
>>> quit()

7. Anacondaをインストールする

NVIDIA TAOを実行するには、Pythonの仮想環境を作成する必要があります。今回は、 Python仮想環境を操作するためのミドルウェアとして「Anaconda3」を利用することにしました。 なお、NVIDIAが紹介している手順では miniconda を利用していました(どちらでもあまり大差はないと思われます)。

### Anaconda3をダウンロードする
$ cd ~/Downloads
$ wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

### インストーラに実行権限を付与する 
$ chmod +x ~/Downloads/Anaconda3-2024.10-1-Linux-x86_64.sh

### インストーラを実行する
$ ~/Downloads/Anaconda3-2024.10-1-Linux-x86_64.sh
# Welcome to Anaconda3 2024.10-1
# 
# In order to continue the installation process, please review the license
# agreement.
# Please, press ENTER to continue
# >>>
# ...
# [/home/shino/anaconda3] >>>
# ...
# Do you wish to update your shell profile to automatically initialize conda?
# This will activate conda on startup and change the command prompt when activated.
# If you'd prefer that conda's base environment not be activated on startup,
#    run the following command when conda is activated:
# 
# conda config --set auto_activate_base false
# 
# You can undo this by running `conda init --reverse $SHELL`? [yes|no]
# [no] >>>
# ...
# conda init
# 
# Thank you for installing Anaconda3!

### パスを通す
$ vi ~/.bashrc
# 最後に以下の1行を追加する
export PATH="$PATH:/home/shino/anaconda3/bin"

### 環境変数を読み込みなおす
$ source ~/.bashrc

### Anacondaの初期設定を実行する
$ conda init
# no change     /home/shino/anaconda3/condabin/conda
# no change     /home/shino/anaconda3/bin/conda
# no change     /home/shino/anaconda3/bin/conda-env
# no change     /home/shino/anaconda3/bin/activate
# no change     /home/shino/anaconda3/bin/deactivate
# no change     /home/shino/anaconda3/etc/profile.d/conda.sh
# no change     /home/shino/anaconda3/etc/fish/conf.d/conda.fish
# no change     /home/shino/anaconda3/shell/condabin/Conda.psm1
# no change     /home/shino/anaconda3/shell/condabin/conda-hook.ps1
# no change     /home/shino/anaconda3/lib/python3.12/site-packages/xontrib/conda.xsh
# no change     /home/shino/anaconda3/etc/profile.d/conda.csh
# modified      /home/shino/.bashrc
# 
# ==> For changes to take effect, close and re-open your current shell. <==


### bashrcに以下のコードブロックが増えていることを確認する
$ vi ~/.bashrc
# # >>> conda initialize >>>
# # !! Contents within this block are managed by 'conda init' !!
# __conda_setup="$('/home/shino/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
# if [ $? -eq 0 ]; then
#     eval "$__conda_setup"
# else
#     if [ -f "/home/shino/anaconda3/etc/profile.d/conda.sh" ]; then
#         . "/home/shino/anaconda3/etc/profile.d/conda.sh"
#     else
#         export PATH="/home/shino/anaconda3/bin:$PATH"
#     fi
# fi
# unset __conda_setup
# # <<< conda initialize <<<

### bash初期化スクリプトを再度読み込む
$ source ~/.bashrc

### Anacondaが有効になることを確認する
(base) $

7.1. TensorFlow-gpu実行用のPython仮想環境を作成する

AnacondaからTensorFlowを呼び出すことが多いため、以下のコマンドを実行し 仮想環境 tf-gpu-env を作成 しておきます。作成した仮想環境が機能するかどうかについては、以下の記事末尾のスクリプトを実行してみてください。

$ conda create --name tf-gpu-env tensorflow=*=gpu_*
$ conda activate tf-gpu-env
$ pip install tensorboard
$ pip install pandas
$ pip install matplotlib
$ pip install scikit-learn
$ pip install numpy
$ pip install ipykernel
$ conda install opencv

### TensorFlowからGPUとOpenCVにアクセスできるか確認する
$ python
>>> import tensorflow as tf
>>> import cv2
>>> tf.test.is_gpu_available()
Created device /device:GPU:0 with 5681 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3060 Ti, pci bus id: 0000:01:00.0, compute capability: 8.6
True
>>> quit()

### 仮想環境から抜ける
$ conda deactivate

以上で、NVIDIA TAO Toolkitをインストールする準備が整いました。

8. NVIDIA TAO Toolkitをインストールする

それでは早速、NVIDIA TAO Toolkitをインストールしていきましょう。

NGCと連携するためのPython仮想環境を作成する

NVIDIA TAOはPythonの仮想環境の中で実行します。 そこで、まずNVIDIA TAO向けにPythonの仮想環境(環境名:launcher)を作成します。NVIDIA TAOは Jupyter Notebook でユーザーに学習済みのAIモデルを提供するため、新しいPythonの仮想環境を作成し ipykernal をインストールします。手順は以下の通りです。

### Python3.10ベースの仮想環境を作成する
(base) $ cd ~
(base) $ conda create -n launcher python=3.10

### Pythonの仮想環境を有効化する 
(base) $ conda activate launcher
(launcher) $

### jupyter notebook用にipykernelをインストールする
(launcher) $ python -m pip install ipykernel
(launcher) $ python -m ipykernel install --user --name launcher --display-name "launcher"

######
### NVIDIA TAOを利用するときはこのPython仮想環境を利用します
######

NVIDIA TAO Toolkitを入手する

NVIDIA TAO Toolkitは、先の手順で作成したPythonの仮想環境上で実行します。 ipykernel 以外のPythonのパッケージをインストールしていないことに驚くかもしれませんが、NVIDIA TAOの提供するAIモデルを記述した Jupyter Notebook の中にインストールスクリプトが封入されており、NVIDIA TAOの提供する学習済みのAIモデルをJupyter Notebookで実行する際にはじめて必要なパッケージがインストールされます。


NVIDIA TAO Toolkitは、下記のサイトにて提供されている 「tao_tutorials.git」を利用 することによりインストールできます。

### NVIDIA TAOのインストールスクリプトを入手する
(launcher) $ cd ~
(launcher) $ git clone https://github.com/NVIDIA/tao_tutorials.git
(launcher) $ cd tao_tutorials

### インストールスクリプトの内容を確認する
(launcher) $ ls ./setup
# quickstart_api_aws_eks    quickstart_api_bare_metal  quickstart_launcher.sh
# quickstart_api_azure_aks  quickstart_api_gcp_gke

### NVIDIA TAOをインストールする
(launcher) $ bash setup/quickstart_launcher.sh --install
# INFO: Check requirements
# INFO: Checking Python installation
# INFO: python3 found.
# INFO: Python version: Python 3.10.16
# INFO: pip3 found.
# INFO: Pip version: pip 25.0 from /home/shino/anaconda3/envs/launcher/lib/python3.10/site-packages/pip (python 3.10)
# INFO: Docker found. Checking additional requirements for docker.
# INFO: Checking nvidia-docker2 installation
# ERROR: nvidia-docker not found.
# INFO: NGC CLI found.
# INFO: NGC CLI 3.59.0
# INFO: Requirements check satisfied. Installing TAO Toolkit.
# By installing the TAO Toolkit CLI, you accept the terms and conditions of this license: https://developer.nvidia.com/tao-toolkit-software-license-agreement
# Would you like to continue? (y/n): y
# ...
# task_group:
#     model:
#         dockers:
#             nvidia/tao/tao-toolkit:
#                 5.5.0-pyt:
#                     docker_registry: nvcr.io
#                     tasks:
#                         1. action_recognition
#                         2. centerpose
#                         3. visual_changenet
# ...
#                         18. segformer
#                         19. bevfusion
#                 5.0.0-tf1.15.5:
#                     docker_registry: nvcr.io
#                     tasks:
#                         1. bpnet
#                         2. classification_tf1
#                         3. converter
#                         4. detectnet_v2
# ...
#                         16. yolo_v4
#                         17. yolo_v4_tiny
#                 5.5.0-tf2:
#                     docker_registry: nvcr.io
#                     tasks:
#                         1. classification_tf2
#                         2. efficientdet_tf2
#     dataset:
#         dockers:
#             nvidia/tao/tao-toolkit:
#                 5.5.0-data-services:
#                     docker_registry: nvcr.io
#                     tasks:
#                         1. augmentation
#                         2. auto_label
#                         3. annotations
#                         4. analytics
#     deploy:
#         dockers:
#             nvidia/tao/tao-toolkit:
#                 5.5.0-deploy:
#                     docker_registry: nvcr.io
#                     tasks:
#                         1. visual_changenet
#                         2. centerpose
#                         3. classification_pyt
#                         4. classification_tf1
#                         5. classification_tf2
# ...
#                         28. yolo_v3
#                         29. yolo_v4
#                         30. yolo_v4_tiny
# format_version: 3.0
# toolkit_version: 5.5.0
# published_date: 08/26/2024
# ...

### NVIDIA TAOのコマンドを実行できることを確認する
(launcher) $ tao --help
# ~/.tao_mounts.json wasn't found. Falling back to obtain mount points and docker configs from ~/.tao_mounts.json.
# Please note that this will be deprecated going forward.
# usage: tao [-h] {list,stop,info,dataset,deploy,model} ...
# 
# Launcher for TAO Toolkit.
# 
# options:
#   -h, --help            show this help message and exit
# 
# task_groups:
#   {list,stop,info,dataset,deploy,model}

NVIDIA TAO ToolkitNGC CLI の利用方法は下記のサイトをご参照ください。

NVIDIA TAO Toolkitにアクセスできることを確認する

まず jupyter notebook コマンドにより、PythonでAIモデルを開発するためのWebサーバーを起動し、起動ログの中にあるURLをブラウザで開く ことにより、NVIDIA TAO Toolkitの開発環境にログインできます。Webサーバーのアドレスは jupyter notebook コマンド実行時のログに出力されますので、URLをブラウザへコピーして利用してください。本例ではhttp://127.0.0.1:8888/tree?token=3af74c44e870b074eef05cdef606b2cbf2441a1698d522ee となっています。

(launcher) $ cd ~/tao_tutorials/
(launcher) $ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root
# ...
# [I 2025-02-12 01:56:39.100 ServerApp] http://Ubu22-devel:8888/tree?token=f0ca182eaaaeab46709c4425d32a3c286a0187c8b330ca3f
# [I 2025-02-12 01:56:39.100 ServerApp]     http://127.0.0.1:8888/tree?token=f0ca182eaaaeab46709c4425d32a3c286a0187c8b330ca3f
# [I 2025-02-12 01:56:39.100 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
# ...

######
### ブラウザからjupyter notebookにアクセスする
######

# -->> Ctrl+Cで終了
(launcher) $ conda deactivate
(base) $ cd ~

ブラウザで下記の開発画面が開ければ、インストールは成功しています。

スクリーンショット 2025-02-12 015727.png

NGC CLIが利用できることを確認する

NGC CLIコマンド ngc を利用してNGC Model Catalogにアクセスできることを確認しておきましょう。 以下のコマンドが実行できれば、NGC CLIは機能しています。

# ダウンロードできるモデルを検索する
(launcher) $ ngc registry model list nvidia/tao/pretrained_*
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------+---------------+------------+-------------+---------------------+
# | Name                  | Repository            | Latest Version        | Application           | Framework             | Precision | Last Modified | Permission | Access Type | Associated Products |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------+---------------+------------+-------------+---------------------+
# | Pre-trained SegFormer | nvidia/tao/pretrained | fan_large_hybrid_nvim | Semantic Segmentation | TAO Toolkit           | FP32      | Oct 16, 2023  | unlocked   |             |                     |
# | NvImageNet weights    | _segformer_nvimagenet | agenet                |                       |                       |           |               |            |             |                     |
# | TAO Pretrained        | nvidia/tao/pretrained | efficientnet_b0       | OBJECT_DETECTION      | TransferLearningToolk | FP32      | Dec 13, 2022  | unlocked   |             |                     |
# | EfficientDet-TF2      | _efficientdet_tf2     |                       |                       | it                    |           |               |            |             |                     |
# ...

9. NVIDIA DeepStreamをインストールする

NVIDIA DeepSteamをインストールするには、ベアメタルへインストールする方法と、Dockerコンテナとして入手する方法の二通りがあります。

9.1. NVIDIA DeepStreamをベアメタルにインストールする

続いて、 AI機能を呼びだせるようにNVIDIAの拡張が加えられたGStreamer「NVIDIA DeepStream」 をセットアップします。セットアップ方法は下記のサイトの dGPU Setup for Ubuntu に従います。

インストールはここまでの手順でインストールした、以下のパッケージが必要です。

  • Ubuntu 22.04
  • GStreamer 1.20.3 (以降の手順でインストールします)
  • NVIDIA driver 560.35.03 (for RTX GPUs)
  • CUDA 12.6
  • TensorRT 10.3.0.26

NVIDIA DeepStreamインストール済みのDockerコンテナも存在します

なお、DeepStreamは以下の手順により、ベアメタル環境にセットアップすることもできますが、Docker + NVIDIA Container Toolkit を利用して構築した、GPU付きコンテナでも実行できるよう「NVIDIA DeepStreamインストール済みのコンテナ」も配布されています。この利用方法については "9.2. NVIDIA DeepStreamコンテナを入手する" に後述します。

NVIDIA DeepStreamをインストールする準備をする

それでは、Install Dependencies の手順から作業を進めていきましょう。まず、NVIDIA DeepStreamが必要とするパッケージを apt コマンドによりインストールします。次に、アプリケーションのビルドに利用される glib を最新版へと更新してください。更新後 pkg-config --modversion glib-2.0 を実行し、glib のバージョンを確認しましょう。

### NVIDIA DeepStreamが必要とするパッケージをインストールします
$ sudo apt install libssl3 libssl-dev libgles2-mesa-dev 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 libjsoncpp-dev protobuf-compiler gcc make git python3

######
### glibを更新する
######
# -->> https://github.com/GNOME/glib/tags
$ sudo pip3 install meson
$ sudo pip3 install ninja 
$ cd ~
$ git clone https://github.com/GNOME/glib.git
$ cd glib
$ git checkout 2.83.3
$ meson build --prefix=/usr
$ ninja -C build/
$ cd build/
$ sudo ninja install

### glibcのバージョンを確認する
$ pkg-config --modversion glib-2.0
2.83.3

次に、NVIDIA DeepStreamが依存するパッケージである librdkafka をインストールしてください。インストール手順はNVIDIA DeepStreamのインストール手順書に書かれていますので、そのまま実行します。最後にライブラリを ldconfig で登録すれば、DeepStreamをインストールする準備は完了となります。

### librdkafkaをインストールします
$ cd ~
$ git clone https://github.com/confluentinc/librdkafka.git
$ cd librdkafka

### 2.2.0をインストールします
$ git checkout tags/v2.2.0
$ ls 
# CHANGELOG.md        LICENSE               LICENSE.pycrc        Makefile        dev-conf.sh    src
# CMakeLists.txt      LICENSE.cjson         LICENSE.queue        README.md       examples       src-cpp
# CODE_OF_CONDUCT.md  LICENSE.crc32c        LICENSE.regexp       README.win32    lds-gen.py     tests
# CONFIGURATION.md    LICENSE.fnv1a         LICENSE.snappy       STATISTICS.md   mainpage.doxy  vcpkg.json
# CONTRIBUTING.md     LICENSE.hdrhistogram  LICENSE.tinycthread  configure       mklove         win32WARNING: ../nvdsinfer/nvdsinfer_model_builder.cpp:1152 Deserialize engine failed because file path: /opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/../../models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx_b30_gpu0_int8.engine open error

# Doxyfile            LICENSE.lz4           LICENSE.wingetopt    configure.self  packaging
# INTRODUCTION.md     LICENSE.murmur2       LICENSES.txt         debian          service.yml

### ビルドしてインストールします
$ ./configure --enable-ssl
$ make
$ sudo make install

### ライブラリを展開します
$ sudo mkdir -p /opt/nvidia/deepstream/deepstream/lib
$ sudo cp /usr/local/lib/librdkafka* /opt/nvidia/deepstream/deepstream/lib
$ sudo ldconfig

NVIDIA DeepStreamをインストールする

それではいよいよ、NVIDIA DeepStreamのインストールを行いましょう。下記のサイトから deepstream-7.1_7.1.0-1_amd64.deb を入手し、インストールします。

スクリーンショット 2025-02-12 025721.png

スクリーンショット 2025-02-12 025902.png

まず、wget コマンドで deepstream-7.1_7.1.0-1_amd64.deb をローカルにダウンロードします。ダウンロード後 apt-get コマンドを利用して、パッケージをインストールしてください。インストールが完了すると以下のディレクトリが作成されます。

  • /opt/nvidia/deepstream/deepstream/lib/ ... DeepSTreamのライブラリ
  • /opt/nvidia/deepstream/deepstream-7.1/bin/ ... に実行ファイル
  • /opt/nvidia/deepstream/deepstream-7.1/samples ... AIによる推論を行うサンプル
### パッケージをダウンロードします
$ cd ~
$ wget --content-disposition 'https://api.ngc.nvidia.com/v2/resources/org/nvidia/deepstream/7.1/files?redirect=true&path=deepstream-7.1_7.1.0-1_amd64.deb' -O deepstream-7.1_7.1.0-1_amd64.deb

### パッケージをインストールします
$ sudo apt-get install ./deepstream-7.1_7.1.0-1_amd64.deb

### インストールされたライブラリを確認する
$ ls /opt/nvidia/deepstream/deepstream/lib/
# librdkafka++.a  librdkafka++.so  librdkafka++.so.1  librdkafka-static.a  librdkafka.a  librdkafka.so  librdkafka.so.1
$ ls /opt/nvidia/deepstream/deepstream-7.1/
# LICENSE.txt           README.rhel  lib                                 service-maker  update_rtpmanager.sh
# LicenseAgreement.pdf  bin          rtpjitterbuffer_eos_handling.patch  sources        version
# README                install.sh   samples                             uninstall.sh

### インストールされたコマンド
$ deepstream-app -h
# Usage:
#   deepstream-app [OPTION?] Nvidia DeepStream Demo
# 
# Help Options:
#   -h, --help                        Show help options
#   --help-all                        Show all help options
#   --help-gst                        Show GStreamer Options
# 
# Application Options:
#   -v, --version                     Print DeepStreamSDK version
#   -t, --tiledtext                   Display Bounding box labels in tiled mode
#   --version-all                     Print DeepStreamSDK and dependencies version
#   -c, --cfg-file                    Set the config file
#   -i, --input-uri                   Set the input uri (file://stream or rtsp://stream)
# ...

### インストール先のディレクトリの内容を確認する
$ cd /opt/nvidia/deepstream/deepstream-7.1
$ ls 
# LICENSE.txt           README.rhel  lib                                 service-maker  update_rtpmanager.sh
# LicenseAgreement.pdf  bin          rtpjitterbuffer_eos_handling.patch  sources        version
# README                install.sh   samples                             uninstall.sh

### インストール完了後に再起動する
$ sudo reboot

インストール後、念のため、再起動しておきましょう。

9.2. NVIDIA DeepStreamコンテナを入手する

NVIDIA DeepStreamでは、アプリケーションをUbuntu22.04上に直接インストールしなくても、DeepStreamをDockerコンテナという形で入手し、利用することができます。まず、DeepStreamは 動画を扱いXに出力するプログラムのため、実行に備えて xhost + を実行し、Xの利用を許可します。 次に docker pull コマンドを実行しNVIDIA DeepSteamと、その実行に必要とされるCUDA SDK等がインストールされているコンテナを入手しましょう。ここでは、 サンプルスクリプトも入手したかったため nvcr.io/nvidia/deepstream:7.1-samples-multiarch を選択しました。 docker pull によりコンテナを取得します。

スクリーンショット 2025-02-12 151754.png

スクリーンショット 2025-02-12 151503.png

Dockerコンテナを実行する際は、GPUをすべて共有し --gpus all、Xを利用できるように -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY を指定します。また、USB接続のWebカメラ等をDeepStreamの入力にすることもあるでしょうから --device /dev/video0:/dev/video0:mwr も付与しておきましょう。作業ディレクトリを -w /opt/nvidia/deepstream/deepstream-7.1 で選択し、docker run コマンドによりコンテナを起動してください。

### allow X
$ xhost +

### DEEPSTREAM Docker Container
$ docker pull nvcr.io/nvidia/deepstream:7.1-samples-multiarch

### 
$ docker run --gpus all -it --rm --network=host --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --device /dev/video0:/dev/video0:mwr -w /opt/nvidia/deepstream/deepstream-7.1 nvcr.io/nvidia/deepstream:7.1-samples-multiarch

(container) $ nvidia-smi
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 560.35.03              Driver Version: 560.35.03      CUDA Version: 12.6     |
# |-----------------------------------------+------------------------+----------------------+
# | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
# | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
# |                                         |                        |               MIG M. |
# |=========================================+========================+======================|
# |   0  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:01:00.0  On |                  N/A |
# |  0%   45C    P8             16W /  200W |     501MiB /   8192MiB |      3%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# |   1  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:04:00.0 Off |                  N/A |
# | 37%   34C    P8             18W /  200W |      15MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# 
# +-----------------------------------------------------------------------------------------+
# | Processes:                                                                              |
# |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
# |        ID   ID                                                               Usage      |
# |=========================================================================================|
# +-----------------------------------------------------------------------------------------+

(container) $ cd samples/
(container) $ pwd
# /opt/nvidia/deepstream/deepstream-7.1/samples

NVIDIA DeepStreamにより動画に対して推論を行う

それでは、NVIDIA DeepSteamを使って、動画をソースとして、推論を実行してみましょう。DeepStreamを利用する場合 deepstream-app コマンドに -c configs/deepstream-app/source30_1080p_dec_infer の引数を加えて実行します。引数に指定した *.txt に記述されている設定に応じて、動画の処理と推論が実行されます。

samples ディレクトリへ移動し、以下のコマンドを実行します。

### サンプルが格納されているディレクトリへ移動する
$ cd /opt/nvidia/deepstream/deepstream-7.1/samples

### NVIDIA DeepStreamにより動画に対して推論を実行する
$ deepstream-app -c configs/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt 
# -->> modelのopen errorが発生しますが無視して問題ありません
# WARNING: ../nvdsinfer/nvdsinfer_model_builder.cpp:1152 Deserialize engine failed because file path: /opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/../../models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx_b30_gpu0_int8.engine open error
# ...
# 20-30秒程度ブラックスクリーンになった後に推論がはじまります
# ...
# 終了する場合は"Ctrl+C"

動画に対して、以下のように推論が実行され
以下のように結果を得ることができます。

Screenshot from 2025-02-12 14-50-51.png

Screenshot from 2025-02-12 14-58-08.png

Dockerコンテナ上でも
同様の手順でサンプルスクリプトを実行できます。

(container) $ deepstream-app -c configs/deepstream-app/source30_1080p_dec_infer-resnet_tiled_display_int8.txt 
# -->> modelのopen errorが発生しますが無視して問題ありません
# WARNING: ../nvdsinfer/nvdsinfer_model_builder.cpp:1152 Deserialize engine failed because file path: /opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/../../models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx_b30_gpu0_int8.engine open error
# ...
# 20-30秒程度ブラックスクリーンになった後に推論がはじまります
# ...
# 終了する場合は"Ctrl+C"

Screenshot from 2025-02-12 14-51-17.png

NVIDIA DeepStream、利用することができましたね!

NGC Model Catalogから入手したAIモデルをDeepStream上で実行し、推論する

最後に、NGC(NVIDIA GPU Cloud) Model Catalogにて配布されているAIモデルを取得して、これをDeepStreamから利用できるのか、確かめてみましょう。今回は「PeopleNet」というモデルを利用します。下記のサイトより取得してください。 PeopleNetは画像を入力として、物体のバウンディングボックスを出力とするAIモデルです。

スクリーンショット 2025-02-13 101538.png

PeopleNetの入力

スクリーンショット 2025-02-13 101551.png

PeopleNetの出力

スクリーンショット 2025-02-13 101603.png

NVIDIA DeepStreamにより推論を実行する

作業ディレクトリを作成する

まず、作業ディレクトリを作成します。

### 作業用ディレクトリを作成する
$ cd ~
$ mkdir sandbox_deepstream

DeepStream向けのスクリプトを入手する

NVIDIA DeepStreamによりAIモデルを実行する方法は、NGC Model Catalogに明記されています。 ですが、推論に利用するサンプルスクリプトが /opt/nvidia/deepstream/deepstream-5.1/samples/configs/tlt_pretrained_models に格納されていると記載されていますが、標準的なインストール方法ではこのディレクトリは生成されないようなので git から別途入手します。

スクリーンショット 2025-02-13 110721.png

gitコマンドを利用してスクリプトを入手する

下記のgithubよりサンプルスクリプトを入手します。

### 作業ディレクトリへ移動する
$ cd ~
$ cd sandbox_deepstream/

### githubからNVIDIA TAO Toolkit x DeepStream向けのサンプルスクリプトを入手する
$ git clone https://github.com/NVIDIA-AI-IOT/deepstream_tao_apps.git
# Cloning into 'deepstream_tao_apps'...
# remote: Enumerating objects: 2930, done.
# remote: Counting objects: 100% (2930/2930), done.
# remote: Compressing objects: 100% (1140/1140), done.
# remote: Total 2930 (delta 1744), reused 2803 (delta 1681), pack-reused 0 (from 0)
# Receiving objects: 100% (2930/2930), 97.70 MiB | 24.07 MiB/s, done.
# Resolving deltas: 100% (1744/1744), done.
# Updating files: 100% (389/389), done.

### サンプルが含まれているディレクトリへ移動する
$ cd deepstream_tao_apps/deepstream_app_tao_configs/

### 必要となるファイルがあることを確認する
$ ls deepstream_app_source1_peoplenet.txt
# deepstream_app_source1_peoplenet.txt
$ ls nvinfer/config_infer_primary_peoplenet.txt
# nvinfer/config_infer_primary_peoplenet.txt
$ ls labels_peoplenet.txt
# labels_peoplenet.txt

AIモデル「peoplenet」と「設定ファイル」を作業ディレクトリにコピーする

### 作業用ディレクトリを作成する
$ cd ~
$ cd sandbox_deepstream```
$ mkdir peoplenet
$ cd peoplenet/

### ngcコマンドによりNGC Model CatalogからPeopleNetをダウンロードする
$ ngc registry model download-version "nvidia/tao/peoplenet:pruned_quantized_decrypted_v2.3.4"
# -----------------------------------------------------------------------------------------------------------
#    Download status: COMPLETED
#    Downloaded local path model: /home/shino/sandbox_deepstream/peoplenet_vpruned_quantized_decrypted_v2.3.4
#    Total files downloaded: 4
#    Total transferred: 8.4 MB
#    Started at: 2025-02-13 11:30:46
#    Completed at: 2025-02-13 11:30:49
#    Duration taken: 2s
# -----------------------------------------------------------------------------------------------------------

### ダウンロードしたモデルの内容を確認する
$ ls peoplenet_vpruned_quantized_decrypted_v2.3.4/
labels.txt  nvinfer_config.txt  resnet34_peoplenet_int8.onnx  resnet34_peoplenet_int8.txt

### 実行に必要なファイルをかき集める
$ cp ~/sandbox_deepstream/deepstream_tao_apps/deepstream_app_tao_configs/deepstream_app_source1_peoplenet.txt ./
$ cp ~/sandbox_deepstream/deepstream_tao_apps/deepstream_app_tao_configs/nvinfer/config_infer_primary_peoplenet.txt ./
$ cp ~/sandbox_deepstream/deepstream_tao_apps/deepstream_app_tao_configs/labels_peoplenet.txt ./
$ cp /opt/nvidia/deepstream/deepstream-7.1/samples/streams/sample_1080p_h265.mp4 ./
$ cp peoplenet_vpruned_quantized_decrypted_v2.3.4/resnet34_peoplenet_int8.onnx ./
$ cp peoplenet_vpruned_quantized_decrypted_v2.3.4/resnet34_peoplenet_int8.txt ./
$ cp /opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/config_tracker_NvDCF_perf.yml ./

### ディレクトリの内容は以下の通り
$ ls 
# config_infer_primary_peoplenet.txt    
# config_tracker_NvDCF_perf.yml
# labels_peoplenet.txt  
# sample_1080p_h265.mp4
# deepstream_app_source1_peoplenet.txt  
# resnet34_peoplenet_int8.onnx
# resnet34_peoplenet_int8.txt

### 設定ファイルを更新する
$ pwd
# /home/shino/sandbox_deepstream/peoplenet

### PeopleNetの設定用スクリプトを編集
### -->> 記入内容は次の節に記載
$ vi deepstream_app_source1_peoplenet.txt

### 起動用スクリプトを編集
### -->> 記入内容は次の節に記載
$ vi config_infer_primary_peoplenet.txt

スクリプト内に設定を記述する

入手した設定ファイルの config_infer_primary_peoplenet.txtdeepstream_app_source1_peoplenet.txt に、本環境でのファイルパスを記入します。

推論の設定をするスクリプト
config_infer_primary_peoplenet.txt の設定例

[property]
gpu-id=0
net-scale-factor=0.0039215697906911373
#tlt-model-key=tlt_encode
######
### -->> ファイルパスを変更する
onnx-file=./resnet34_peoplenet_int8.onnx
######
### -->> ファイルパスを変更する
labelfile-path=./labels_peoplenet.txt
######
### -->> ファイルパスを変更する
### -->> resnet34_peoplenet_int8.onnxから自動生成される (ファイル不要)
model-engine-file=./resnet34_peoplenet_int8.onnx_b1_gpu0_int8.engine
######
### -->> ファイルパスを変更する
int8-calib-file=./resnet34_peoplenet_int8.txt
######

input-dims=3;544;960;0
uff-input-blob-name=input_1:0
batch-size=1
process-mode=1
model-color-format=0
## 0=FP32, 1=INT8, 2=FP16 mode
network-mode=1
num-detected-classes=3
cluster-mode=2
interval=0
gie-unique-id=1
output-blob-names=output_bbox/BiasAdd:0;output_cov/Sigmoid:0

#Use the config params below for dbscan clustering mode
#[class-attrs-all]
#detected-min-w=4
#detected-min-h=4
#minBoxes=3
#eps=0.7

#Use the config params below for NMS clustering mode
[class-attrs-all]
topk=20
nms-iou-threshold=0.5
pre-cluster-threshold=0.2

## Per class configurations
[class-attrs-0]
topk=20
nms-iou-threshold=0.5
pre-cluster-threshold=0.4

#[class-attrs-1]
#pre-cluster-threshold=0.05
#eps=0.7
#dbscan-min-score=0.5

起動用スクリプト
deepstream_app_source1_peoplenet.txt の設定例

[application]
enable-perf-measurement=1
perf-measurement-interval-sec=1

[tiled-display]
enable=1
rows=1
columns=1
width=1280
height=720
gpu-id=0

[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI
type=3
num-sources=1

######
### -->> ファイルパスを変更する
uri=file:///home/shino/sandbox_deepstream/peoplenet/sample_1080p_h265.mp4
######
gpu-id=0

[streammux]
gpu-id=0
batch-size=1
batched-push-timeout=40000
## Set muxer output width and height
width=1920
height=1080

[sink0]
enable=1
#Type - 1=FakeSink 2=EglSink 3=File
type=2
sync=1
source-id=0
gpu-id=0

[osd]
enable=1
gpu-id=0
border-width=3
text-size=15
text-color=1;1;1;1;
text-bg-color=0.3;0.3;0.3;1
font=Arial

[primary-gie]
enable=1
#(0): nvinfer; (1): nvinferserver
plugin-type=0
gpu-id=0
# Modify as necessary
batch-size=1
#Required by the app for OSD, not a plugin property
bbox-border-color0=1;0;0;1
bbox-border-color1=0;1;1;1
bbox-border-color2=0;0;1;1
bbox-border-color3=0;1;0;1
gie-unique-id=1

######
### -->> ファイルパスを変更する
config-file=./config_infer_primary_peoplenet.txt
######

[sink1]
enable=0
type=3
#1=mp4 2=mkv
container=1
#1=h264 2=h265 3=mpeg4
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=2000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
output-file=out.mp4
source-id=0

[sink2]
enable=0
#Type - 1=FakeSink 2=EglSink 3=File 4=RTSPStreaming 5=Overlay
type=4
#1=h264 2=h265
codec=1
#encoder type 0=Hardware 1=Software
enc-type=0
sync=0
bitrate=4000000
#H264 Profile - 0=Baseline 2=Main 4=High
#H265 Profile - 0=Main 1=Main10
profile=0
# set below properties in case of RTSPStreaming
rtsp-port=8554
udp-port=5400

[tracker]
enable=1
# For NvDCF and DeepSORT tracker, tracker-width and tracker-height must be a multiple of 32, respectively
tracker-width=640
tracker-height=384

######
### -->> ファイルパスを変更する
ll-lib-file=/opt/nvidia/deepstream/deepstream-7.1/lib/libnvds_nvmultiobjecttracker.so
######

# ll-config-file required to set different tracker types
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_IOU.yml

######
### -->> ファイルパスを変更する
ll-config-file=/home/shino/sandbox_deepstream/peoplenet/config_tracker_NvDCF_perf.yml
######

# ll-config-file=/opt/nvidia/deepstream/deepstream-7.1/samples/configs/deepstream-app/config_tracker_NvDCF_perf.yml
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_NvDCF_accuracy.yml
# ll-config-file=/opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app/config_tracker_DeepSORT.yml
gpu-id=0
enable-batch-process=1
enable-past-frame=1
display-tracking-id=1

[tests]
file-loop=0

スクリプトを実行する

スクリプトを実行すると、動画に対して推論が実行され、人物が検出されます。

### DeepStreamでスクリプトを実行する
deepstream-app -c deepstream_app_source1_peoplenet.txt

Screenshot from 2025-02-13 11-54-48.png


以上が、Jetson無しに、Ubuntu22.04 x RTX3060Ti上でNVIDIA DeepStreamを実行する手順です。設定ファイルひとつで人物検出のアプリを実行することができます。設定ファイルには色々な設定項目がありますので、設定次第で面白いことができそうですね!

今後も色々と試してみたいと思います!お疲れさまでした!


1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?