Jetsonで使えるNVIDIA DeepStreamをx86_64で試す
NVIDIA DeepStreamは動画に対してAI処理を適用することのできるミドルウェアです。みなさん大好きJetsonで利用することができますが、私はJetsonをまだ入手できていないため、事前調査として、RTX3060Ti(Ampere) を搭載した x86_64 Ubuntu22.04上 でDeepStreamを使ってみました。DeepStreamはいくつかのミドルウェアと連携して動作するため、本記事では、それら依存するミドルウェアのインストールも含めて、DeepStreamを使うまでの手順を紹介します。NVIDIA DeepStreamはCUDAのバージョン12.8を未だサポートしていないため、そのあたりも回避する手順となっております、是非ご活用ください。
注意: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ポートを利用してインストールしました。
最低限必要な前準備を行う
日本語設定でインストールすると、ホームディレクトリ以下に日本語名のディレクトリが作成されてしまい、何かと不都合が生じるため xdg-user-dirs-gtk-update
を使ってディレクトリを英語名に変更します。 また、以降の手順にて sudo を利用することが多いため、 sudo 実行時にパスワードを求められないよう /etc/sudoers
に shino 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 Boot
の Secure Boot
を Diasable
にしました。Secure Bootを有効にしたままGeForceのドライバを入れる方法もあるようですが、テクニックが必要になるため、ここでは手順を省略します。
搭載されている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/ppa
を add-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の実行中にエラーが発生します。
- CUDA ... GPUへアクセスするためにインストール
- cuDNN ... Neural NetworkからCUDAへアクセスするためにインストール
- Docker ... NVIDIA TAOを実行するための仮想環境として追加
- NVIDIA Container Toolkit ... Docker上からGPUを利用するために必要
- NGC CLI ... NGC (NVIDIA GPU Cloud) を連携するためのCLIツール
- TensorRT ... NVIDIA DeepStream等のAI関連のミドルウェアに必要なAIフレームワーク
- Anaconda3 ... NVIDIA TAO Toolkitと連携するための仮想環境も作成する
- NVIDIA TAO Toolkit ... 転移学習によりAIを開発できるツールキット
- 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
をインストールします。
# 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サイトを参考に、表示されるコマンドを入力することでインストールすることができます。
# 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のユーザー登録[無料]が必要です。
ブラウザを使って作成した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
を入手します。
# ホームディレクトリへ移動
$ 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 Toolkit
や NGC 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 ~
ブラウザで下記の開発画面が開ければ、インストールは成功しています。
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
を入手し、インストールします。
まず、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
によりコンテナを取得します。
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"
動画に対して、以下のように推論が実行され
以下のように結果を得ることができます。
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"
NVIDIA DeepStream、利用することができましたね!
NGC Model Catalogから入手したAIモデルをDeepStream上で実行し、推論する
最後に、NGC(NVIDIA GPU Cloud) Model Catalogにて配布されているAIモデルを取得して、これをDeepStreamから利用できるのか、確かめてみましょう。今回は「PeopleNet」というモデルを利用します。下記のサイトより取得してください。 PeopleNetは画像を入力として、物体のバウンディングボックスを出力とするAIモデルです。
PeopleNetの入力
PeopleNetの出力
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
から別途入手します。
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.txt
と deepstream_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
以上が、Jetson無しに、Ubuntu22.04 x RTX3060Ti上でNVIDIA DeepStreamを実行する手順です。設定ファイルひとつで人物検出のアプリを実行することができます。設定ファイルには色々な設定項目がありますので、設定次第で面白いことができそうですね!
今後も色々と試してみたいと思います!お疲れさまでした!