エッジAIを効率的に開発できるNVIDIA TAO ToolkitとNGC CLIをUbuntu22.04上にセットアップし、NVIDIA TAO Toolkitを活用してSSD(Single Shot Multibox Detector)のAIモデルを開発・生成する

# 転移学習により簡単に自社のアプリケーションに最適なAIモデルを生成できるNVIDIA TAO Toolkitを利用してみよう

本記事では、 **学習済みのAIモデルを簡単に入手することが可能で、さらに転移学習(Transfer Learning)を加えることより、手間なく自社のアプリケーション向けのAIモデルを生成することのできる開発プラットフォーム「NVIDIA TAO Toolkit」** のセットアップ方法を解説し、 <font color="blue">**NVIDIA TAOを利用してSSD(Single Shot Multibox Detector)のAIモデルを開発する手順**</font> について紹介します。

https://developer.nvidia.com/ja-jp/tao-toolkit

https://resources.nvidia.com/ja-jp-tao/watch-126

![スクリーンショット 2025-02-09 041106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/4167d0f2-9a32-06ce-524d-92fb9e3f0467.png)

## ハードウェアの構成

今回は以下の環境にNVIDIA TAO Toolkitをセットアップしました。

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

なお、NVIDIA TAOのSystem Requirementsは以下の通りです。
**※現在の私の環境ではGPUのメモリが不足しています。**

- System Requirements
  - 16 GB system RAM
  - 16 GB of GPU RAM
  - 8 core CPU
  - 1 NVIDIA GPU
  - 100 GB of SSD space

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

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

https://releases.ubuntu.com/jammy/

![Ubuntu22.04_Install.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/0b35301c-d7fd-4b4f-fdd8-d955714ce393.jpeg)

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

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

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

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

# 再起動する
$ sudo reboot
```

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

続いて、Ubuntuのパッケージを最新の状態へと更新します。

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

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

# 再起動
$ sudo reboot
```
#### リモートから開発できるようにSSHサーバをインストールする

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

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

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

https://qiita.com/xtrizeShino/items/30dca87bc0789fcacfab

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

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

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

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

```bash
# ファイルを新規作成し、無効化設定を記述する
$ 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のドライバを入れる方法もあるようですが、テクニックが必要になるため、ここでは手順を省略します。

![SecureBoot](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F3919880%2Fc9ad86d2-65c5-5f45-fb80-492d148fe2d9.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f1d9282a7efc71d053f8a028985e38de)

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

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

```bash
$ 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をクリーンインストールしているため、特に削除するパッケージは存在しないはずです。

```bash
$ 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-550` でインストールします。 **本例では NVIDIA GeForce RTX 3060Ti のデバイスドライバをインストールしています。ここでは `recommended` の `nvidia-driver-560` ではなく、私が利用した実績のある `nvidia-driver-550` を選択しました。<font color="red">なお、NVIDIA TAOの実行には550以上が必要です。</font>**

```bash
# 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-server - distro non-free
# driver   : nvidia-driver-535-server-open - distro non-free
# driver   : nvidia-driver-535-open - distro non-free
# driver   : nvidia-driver-570 - third-party non-free
# driver   : nvidia-driver-535 - distro non-free
# driver   : nvidia-driver-570-open - third-party non-free
# driver   : nvidia-driver-545-open - third-party non-free
# driver   : nvidia-driver-550 - third-party non-free
# driver   : nvidia-driver-560 - third-party non-free recommended
# driver   : nvidia-driver-550-open - third-party non-free
# driver   : nvidia-driver-565 - third-party non-free
# driver   : nvidia-driver-470 - distro non-free
# driver   : nvidia-driver-545 - third-party non-free
# driver   : nvidia-driver-470-server - distro non-free
# driver   : nvidia-driver-565-open - third-party non-free
# driver   : nvidia-driver-560-open - third-party non-free
# driver   : xserver-xorg-video-nouveau - distro free builtin

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

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

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

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

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

```bash
$ nvidia-smi
# Fri Feb  7 20:45:03 2025
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 550.144.03             Driver Version: 550.144.03     CUDA Version: 12.4     |
# |-----------------------------------------+------------------------+----------------------+
# | 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%   34C    P8              6W /  200W |     195MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# |   1  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:04:00.0 Off |                  N/A |
# | 37%   32C    P8              8W /  200W |       9MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# 
# +-----------------------------------------------------------------------------------------+
# | Processes:                                                                              |
# |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
# |        ID   ID                                                               Usage      |
# |=========================================================================================|
# |    0   N/A  N/A      1490      G   /usr/lib/xorg/Xorg                             70MiB |
# |    0   N/A  N/A      1684      G   /usr/bin/gnome-shell                          117MiB |
# |    1   N/A  N/A      1490      G   /usr/lib/xorg/Xorg                              4MiB |
# +-----------------------------------------------------------------------------------------+
```

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

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

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. **Anaconda3** ... NVIDIA TAOと連携するための仮想環境も作成する

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

まず、プログラムがGPUへアクセスするためのパッケージ「CUDA」をインストールします。 **下記のWebサイトを参考に、表示されるコマンドを入力することでインストールすることができます。** インストールの際は「Ubuntu22.04」を選択してください。

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local

![スクリーンショット 2025-02-07 205024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/b5d5c86a-7cb4-770d-64da-80f19415cb70.png)

```bash
# 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.8.0/local_installers/cuda-repo-ubuntu2204-12-8-local_12.8.0-570.86.10-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu2204-12-8-local_12.8.0-570.86.10-1_amd64.deb
$ sudo cp /var/cuda-repo-ubuntu2204-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
$ sudo apt-get update
$ sudo apt-get -y install cuda-toolkit-12-8
```

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

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

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

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

```bash
$ nvcc -V
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2025 NVIDIA Corporation
# Built on Wed_Jan_15_19:20:09_PST_2025
# Cuda compilation tools, release 12.8, V12.8.61
# Build cuda_12.8.r12.8/compiler.35404655_0
```

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

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

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local

![スクリーンショット 2025-02-07 205716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/dea450cc-9a21-d126-fa3d-d55aa0cdbfef.png)

```bash
# cuDNNのダウンロードサイトに書かれた手順をそのまま実行します
$ wget https://developer.download.nvidia.com/compute/cudnn/9.7.1/local_installers/cudnn-local-repo-ubuntu2204-9.7.1_1.0-1_amd64.deb
$ sudo dpkg -i cudnn-local-repo-ubuntu2204-9.7.1_1.0-1_amd64.deb
$ sudo cp /var/cudnn-local-repo-ubuntu2204-9.7.1/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から呼び出される、仮想環境のDockerをインストールします。Dockerのインストールは以下の公式サイトを参考に、Ubuntuのパッケージ管理ツールがaptであるため **「Installation methods -> install using the apt repository」の手順** でインストールします。なお、Dockerはデフォルトで特権ユーザー(root)のみが実行可能で、他のユーザーからは `sudo` を付与して実行するようになっています。毎回 `sudo` を付けることは面倒なため、通常ユーザーからも `sudo` 無しでDockerを制御できるよう設定を加えます。

https://docs.docker.com/engine/install/ubuntu/

```bash
# 古いパッケージを削除する
$ 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無しで実行できるか確認します。

```bash
$ 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!
# ...
```

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

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

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

```bash
# 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.5.1-cuda12.4-cudnn9-devel」** コンテナを利用します。 `--gpu all` オプションをつけることで、ホストの持つすべてのGPUリソースをコンテナへ提供することが可能です。

https://hub.docker.com/layers/pytorch/pytorch/2.5.1-cuda12.4-cudnn9-devel/images/sha256-14611869895df612b7b07227d5925f30ec3cd6673bad58ce3d84ed107950e014?context=explore

```bash
# Dockerコンテナを取得して、コンテナにすべてのGPUを接続する
(host) $ docker run --rm -it --gpus all pytorch/pytorch:2.5.1-cuda12.4-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 Thu_Mar_28_02:18:24_PDT_2024
# Cuda compilation tools, release 12.4, V12.4.131
# Build cuda_12.4.r12.4/compiler.34097967_0

# nvidia-smiでGPUリソースを確認する
(container) $ nvidia-smi
Fri Feb  7 12:22:02 2025
# +-----------------------------------------------------------------------------------------+
# | NVIDIA-SMI 550.144.03             Driver Version: 550.144.03     CUDA Version: 12.4     |
# |-----------------------------------------+------------------------+----------------------+
# | 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 Off |                  N/A |
# |  0%   36C    P8              5W /  200W |     159MiB /   8192MiB |      0%      Default |
# |                                         |                        |                  N/A |
# +-----------------------------------------+------------------------+----------------------+
# |   1  NVIDIA GeForce RTX 3060 Ti     Off |   00000000:04:00.0 Off |                  N/A |
# | 37%   29C    P8              8W /  200W |       9MiB /   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をダウンロードし、展開した後、パスを通します。

https://org.ngc.nvidia.com/setup/installers/cli

```bash
# 自身のホームディレクトリに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のユーザー登録［無料］が必要です。**

https://org.ngc.nvidia.com/setup

![WIN_20250207_21_25_38_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/5a605c6b-e650-e8f3-663d-8df6de45ac61.jpeg)

https://docs.nvidia.com/ai-enterprise/deployment/spark-rapids-accelerator/latest/appendix-ngc.html

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

```bash
# 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 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. Anacondaをインストールする

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

https://www.anaconda.com/download/success

https://qiita.com/sophytoeat/items/34d214c2d6036e2fa229

```bash
### 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) $
```

以上で、MVIDIA TAOを利用する準備が整いました。

## NVIDIA TAOをインストールする

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

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

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

https://docs.nvidia.com/tao/tao-toolkit/text/quick_start_guide/beginner.html

```bash
### Python3.10ベースの仮想環境を作成する
(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を入手する

https://docs.nvidia.com/tao/tao-toolkit/text/quick_start_guide/beginner.html

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

----

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

https://docs.nvidia.com/tao/tao-toolkit/text/quick_start_guide/index.html#tao-getting-started-resource

```bash
### 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を利用する

インストールしたNVIDIA TAOは `Jupyter Notebook` を介して利用します。

### TAOを使った開発をはじめる

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

```bash
### NVIDIA TAO の notebookを開く
(launcher) $ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root
# [W 2025-02-07 22:37:37.204 ServerApp] A `_jupyter_server_extension_points` function was not found in jupyter_lsp. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
# [W 2025-02-07 22:37:37.260 ServerApp] A `_jupyter_server_extension_points` function was not found in notebook_shim. Instead, a `_jupyter_server_extension_paths` function was found and will be used for now. This function name will be deprecated in future releases of Jupyter Server.
# [I 2025-02-07 22:37:37.597 ServerApp] Extension package panel.io.jupyter_server_extension took 0.3366s to import
# ...
# [I 2025-02-07 22:37:37.734 ServerApp] Jupyter Server 2.14.1 is running at:
# [I 2025-02-07 22:37:37.734 ServerApp] http://shino-Ubu22-devel:8888/tree?token=3af74c44e870b074eef05cdef606b2cbf2441a1698d522ee
# [I 2025-02-07 22:37:37.734 ServerApp]     http://127.0.0.1:8888/tree?token=3af74c44e870b074eef05cdef606b2cbf2441a1698d522ee
# [I 2025-02-07 22:37:37.734 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
# ...

### -->> ブラウザから以下にアクセスする
### -->> http://127.0.0.1:8888/tree?token=3af74c44e870b074eef05cdef606b2cbf2441a1698d522ee
```

ブラウザで `jupyter notebook` を開くと以下の画面が表示されます。

![スクリーンショット 2025-02-07 224225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/26dbfb37-3954-b8b3-5b7c-8d99460fb968.png)

`notebooks/tao_launcher_starter_kit` に様々なモデルが格納されています。

![スクリーンショット 2025-02-07 224506.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/1d0090db-e9d1-90b8-21e4-77fabbd0faa9.png)

これらのモデルを開くと、学習済みAIモデルの使い方や、AIモデルを利用するまでに必要な手順を見ることができます。以下の例は `classification_tf2/tao_voc/classification.ipynb` を開いた際の表示内容です。 **これらは `.ipynb` 形式のスクリプトであるため、説明文を読みながら、実際のAIモデルの開発を進めることが可能です。**

![スクリーンショット 2025-02-07 233824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/dd743c71-5345-c478-8307-81e5cbba6a6d.png)

## NGC (NVIDIA GPU Cloud) を活用する

上記の例ではNVIDIA TAOからNGCにあるAIモデルを参照しましたが、NGC CLIを使うことにより、さらに自由に学習済みのAIモデルを入手することが可能です。

### NGCからAIモデルを入手する

NVIDIA TAOのテンプレートに含まれていないAIモデルも、NGC CLIを利用することにより、NGC (NVIDIA GPU Cloud) からダウンロードすることが可能です。 **入手できるAIモデルは `ngc registry model list` コマンドにて確認することができます。 `pretrained_*` 以下に含まれているAIモデルが、事前学習済みのAIモデルです。** 以下の例では `resnet18` をベースとした `pretrained_classification` をローカルに入手しています。ここでダウンロードされたAIモデルは **`resnet_18.hdf5` であり、TensorFlow形式のモデルとなっています。**

https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ja

```bash
# ダウンロードできるモデルを検索する
(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                    |           |               |            |             |                     |
# ...

# モデルをインストールするディレクトリを作成する
(launcher) $ mkdir -p ~/sandbox/pretrained_resnet18

# NGCからモデルをダウンロードする
(launcher) $ ngc registry model download-version nvidia/tao/pretrained_classification:resnet18 --dest ~/sandbox/pretrained_resnet18
# Getting files to download...
#   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • 89.0/89.0 MiB • Remaining: 0:00:00 • 35.2 MB/s • Elapsed: 0:00:05 • Total: 1 - Completed: 1 - Failed: 0
# 
# -----------------------------------------------------------------------------------------------------------
#    Download status: COMPLETED
#    Downloaded local path model: /home/shino/sandbox/pretrained_resnet18/pretrained_classification_vresnet18
#    Total files downloaded: 1
#    Total transferred: 88.96 MB
#    Started at: 2025-02-07 22:58:29
#    Completed at: 2025-02-07 22:58:35
#    Duration taken: 5s
# -----------------------------------------------------------------------------------------------------------

# モデルをインストールしたディレクトリの内容を確認する
$ ls /home/shino/sandbox/pretrained_resnet18/pretrained_classification_vresnet18
# resnet_18.hdf5
```

#### ダウンロードした学習済みAIモデルをTensorFlow上にロードする

ダウンロードした学習済みのAIモデルを利用してみましょう。まず、ダウンロードされたAIモデルはhdf5形式であり、これはTensorFlow用のものであるため、 **Anacondaを使って、TensorFlow(gpu)を含むPythonの仮想環境を作成** し、ロードします。まず以下を参考に、Pythonの仮想環境「first_tensorflow」を新たに作成し、TensorFlow(gpu)とあわせて、AI/MLの分野でよく利用されるいくつかのパッケージを仮想環境にインストールしてください。

```bash
# Python仮想環境を作成する
$ conda create --name first_tensorflow tensorflow=*=gpu_*
# ...

# Python仮想環境にログインする
$ conda activate first_tensorflow

# Pythonのバージョンを確認する
(first_tensorflow) $ python --version
# Python 3.10.13

# 必要なライブラリをインストールする
(first_tensorflow) $ pip install ipykernel
(first_tensorflow) $ pip install numpy
(first_tensorflow) $ pip install matplotlib
(first_tensorflow) $ pip install pillow
(first_tensorflow) $ pip install opencv-python
```

作成後、先の手順でダウンロードした `resnet18` をTensorFlow.kerasのAIモデルのロード機能 `tf.keras.models.load_model` により展開すると **`model.summary()` にてAIモデルを取得できていることを確認することができます。**

https://www.tensorflow.org/tutorials/keras/save_and_load?hl=ja

```bash
# モデルをダウンロードしたディレクトリへ移動する
$ cd ~/sandbox/pretrained_resnet18/pretrained_classification_vresnet18

# 開発用のPythonの仮想環境を有効化する
$ conda activate first_tensorflow

# Pythonを起動する
(first_tensorflow) $ python

# TensorFlowをimportする
>>> import tensorflow as tf

# GPUリソースが利用できることを確認する
>>> tf.config.list_physical_devices('GPU')
# [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU'), PhysicalDevice(name='/physical_device:GPU:1', device_type='GPU')]

# ダウンロードしたモデルをロードする
>>> new_model = tf.keras.models.load_model('resnet_18.hdf5')

# モデルの内容を確認する
>>> new_model.summary()
# Model: "resnet18_nopool_bn"
# __________________________________________________________________________________________________
#  Layer (type)                   Output Shape         Param #     Connected to
# ==================================================================================================
#  input_1 (InputLayer)           [(None, 3, 224, 224  0           []
#                                 )]
# 
#  conv1 (Conv2D)                 (None, 64, 112, 112  9408        ['input_1[0][0]']
#                                 )
# 
#  bn_conv1 (BatchNormalization)  (None, 64, 112, 112  256         ['conv1[0][0]']
#                                 )
# 
# ...
#  add_8 (Add)                    (None, 512, 14, 14)  0           ['block_4b_bn_2[0][0]',
#                                                                   'block_4b_bn_shortcut[0][0]']
# 
#  block_4b_relu (Activation)     (None, 512, 14, 14)  0           ['add_8[0][0]']
# 
#  avg_pool (AveragePooling2D)    (None, 512, 1, 1)    0           ['block_4b_relu[0][0]']
# 
#  flatten (Flatten)              (None, 512)          0           ['avg_pool[0][0]']
# 
#  predictions (Dense)            (None, 176)          90288       ['flatten[0][0]']
# 
# ==================================================================================================
# Total params: 11,632,752
# Trainable params: 11,621,104
# Non-trainable params: 11,648
# __________________________________________________________________________________________________

# 利用できることが確認できたので終了する
>>> quit()
```

### NGCでModelを検索しダウンロードする

`ngc registry model list` コマンドを利用してAIモデルをダウンロードする以外にも、NGC Catalogから直接AIモデルを検索しNGC CLIを用いてダウンロードすることができます。以下の例は **NGCのModelの中から「PeopleNet」を検索し、ダウンロードする手順** です。

https://catalog.ngc.nvidia.com/models?filters=&orderBy=scoreDESC&query=PeopleNet&page=&pageSize=

![スクリーンショット 2025-02-08 025300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/e9d92bbb-8df8-a979-6bbd-9ef67c125490.png)

ダウンロードしたいモデルを発見できたならば、画面右上の「Download」をクリックし「CLI」を選択することにより、ダウンロードするために必要なNGC CLIのコマンドを取得することができます。 **コマンドを取得した後、これをUbuntuのターミナルで実行します。**

![スクリーンショット 2025-02-08 101002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c88b7d19-4572-645b-bff4-1b1fab84c7c3.png)

以下がAIモデルのダウンロード手順です。
**AIモデルは「ONNX」形式でダウンロードされます。**

```bash
### 作業ディレクトリを作成する
(base) $ mkdir ~/sandbox

### 作業ディレクトリへ移動する
(base) $ cd ~/sandbox

### 作業ディレクトリの内容を確認する
(base) $ ls

### NGC Caralogからコピーしたダウンロードコマンドを実行する
(base) $ ngc registry model download-version "nvidia/tao/peoplenet:pruned_quantized_decrypted_v2.3.4"
# Getting files to download...
#   ━━━━━━━━━━━━━━━ • 8.4/8.4 MiB • Remaining: 0:00:00 • 8.7 MB/s • Elapsed: 0:00:02 • Total: 4 - Completed: 4 - Failed: 0
# 
# ------------------------------------------------------------------------------------------------
#    Download status: COMPLETED
#    Downloaded local path model: /home/shino/sandbox/peoplenet_vpruned_quantized_decrypted_v2.3.4
#    Total files downloaded: 4
#    Total transferred: 8.4 MB
#    Started at: 2025-02-08 10:16:16
#    Completed at: 2025-02-08 10:16:18
#    Duration taken: 2s
# ------------------------------------------------------------------------------------------------

### ダウンロード後、内容を確認する
(base) $ ls
# peoplenet_vpruned_quantized_decrypted_v2.3.4

### ONNX形式のAIモデルを入手できている
(base) $ ls peoplenet_vpruned_quantized_decrypted_v2.3.4/
# labels.txt  nvinfer_config.txt  resnet34_peoplenet_int8.onnx  resnet34_peoplenet_int8.txt
```

Netronを利用することで、ダウンロードされたAIモデルの内容を確認できます。このAIモデルも事前学習済みのモデルであるため、 **以降は、学習用のデータセット等を別途集めることなく、ONNXを利用し、実際のアプリケーションの開発にすぐに着手することができます。**

https://netron.app/

![Screenshot from 2025-02-08 10-34-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/94ec37d7-fa08-ffe3-1119-4eceeaf249e6.png)

![Screenshot from 2025-02-08 10-34-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c2176f51-b37b-597b-3b9f-5f63a3e8b9ca.png)

![Screenshot from 2025-02-08 10-34-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/20779297-24d1-04f2-688e-794ee73f11d8.png)

----

本記事の手順により、NVIDIA TAOやNGC CLI等をセットアップし、利用することで、 **学習済みのAIモデルを簡単に入手し、AIアプリケーションを効率的に開発することができます。** 学習済みのAIモデルを利用することにより **転移学習 (transfer learning)** もできるため、より早く精度の高いAIモデルを開発に利用することが可能となります。NVIDIA TAOは多くのツールセットを必要としますが、一度導入してしまえば、後は手間なく運用できるため、是非一度NGCやNVIDIA TAOをインストールし、お試しください。

#### 転移学習とは

https://resources.nvidia.com/ja-jp-tao/watch-126

https://aws.amazon.com/jp/what-is/transfer-learning/

https://event.dbsj.org/deim2022/post/tutorial/deim2022_tutorial_T7_slides.pdf

----

以降の記事では実際に **NVIDIA TAOを利用してSSD(Single Shot Multibox Detector：物体検出)のAIモデルを開発するフロー** を紹介いたします。

----

# NVIDIA TAOを利用してAIモデルを開発する

それでは、インストールしたNVIDIA TAOでAIモデルを開発してみましょう。

- Core i5-14500 (14cores, 20threads)
- RAM 64GB
- NVIDIA GeForce RTX3060Ti 8GB x2
  - System Requirenments(=16GB)に満たないメモリを搭載したGPU 

```bash
### 作業用ディレクトリを作成する
mkdir -p ~/sandbox_tao_tutorial/
```

### Pythonの仮想環境を有効化する

まず、NVIDIA TAOを実行するために必要なPythonの仮想環境「launcher」をactivateします。その後、 `tao_tutorials` ディレクトリにて `jupyter notebook` を実行し、ブラウザからNVIDIA TAOへアクセスできるようにします。

```bash
(base) $ conda activate launcher
(launcher) $ cd ~
(launcher) $ cd tao_tutorials/
(launcher) $ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root

# [I 2025-02-08 12:28:29.403 ServerApp] http://shino-Ubu22-devel:8888/tree?token=d0943ab5b36f7e39133dfef8c902bd8afe07c560c883a0c4
# [I 2025-02-08 12:28:29.403 ServerApp]     http://127.0.0.1:8888/tree?token=d0943ab5b36f7e39133dfef8c902bd8afe07c560c883a0c4
# [I 2025-02-08 12:28:29.403 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

## NVIDIA TAO x SSD

ブラウザでNVIDIA TAOを開いた後に `notebooks` を開きます。

![スクリーンショット 2025-02-09 040756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c10015f3-30a6-bfd6-2629-5c091d3a7d6d.png)

次に `tao_launcher_starter_kit`を選択。

![スクリーンショット 2025-02-09 040815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6bd9093a-6464-638d-9652-0052197132f7.png)

今回扱うAIモデルの `ssd` を選択。

![スクリーンショット 2025-02-09 040926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/aab01d02-1d05-cd88-0256-a9b758db4fc7.png)

開発用のJupyter Notebook形式のスクリプト `ssd.ipynb` を開きます。

![スクリーンショット 2025-02-09 041016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/16368f3c-f347-6091-4464-af0a0ec30f43.png)

`ssd.ipynb` を開くと、以下のように、ドキュメントの同梱されたスクリプトが表示されます。**NVIDIA TAOでは、このようなスクリプトに対して、画面上部の再生ボタンをクリックしながら、順次処理を加えていくことによりAIモデルを開発できます。**

![スクリーンショット 2025-02-09 041106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/4167d0f2-9a32-06ce-524d-92fb9e3f0467.png)

![スクリーンショット 2025-02-09 041527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6a738429-48ad-6e0b-af31-aca927c35c7a.png)

### コードブロックに変更を加えながら、実行する

まず作業ディレクトリを作成し、コードに作業ディレクトリのパスを記入します。

```bash
$ mkdir -p ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments
$ cd ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments
$ pwd
# /home/shino/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments
```

![スクリーンショット 2025-02-09 041351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/9f8442ae-0e97-ecbd-4386-a59ab1cba963.png)

コードブロックでは、必要なパッケージのインストールなども行われます。

![スクリーンショット 2025-02-09 041813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/088eba80-0fd4-c02c-51e5-23d54ccc1ad1.png)

### データセットをダウンロードする

以下のコードブロックでは、AIモデルの学習に利用するデータセットのダウンロードが求められています。 **指定されているURLのデータセットを、先の手順で作成した作業ディレクトリ上に格納** します。

![スクリーンショット 2025-02-09 042341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/a5b5b8e4-2b31-9496-0198-d81788515689.png)

```bash
# 作業ディレクトリへ移動する
$ cd ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments

# データを格納するディレクトリへ移動する
$ cd data/

# 学習用データをダウンロードする
$ wget https://s3.eu-central-1.amazonaws.com/avg-kitti/data_object_image_2.zip
$ wget https://s3.eu-central-1.amazonaws.com/avg-kitti/data_object_label_2.zip
```

これにより、以下のように **データセットが作業ディレクトリ内に展開** されます。
<font color="red">**※作業ディレクトリのパスが絶対パスでない場合エラーとなることがあります**</font>

![スクリーンショット 2025-02-09 084636.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/486ca156-b0f8-297f-73aa-df2870e88a34.png)

そして、以下のコードブロックでデータセットを生成します。

![スクリーンショット 2025-02-09 085849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c81e42f8-64c5-c141-5f75-b9b6cc8d60bb.png)

### 学習済みのAIモデルをダウンロードする

`SSD.ipynb` では、NGC CLIを利用して、NGCから学習済みのAIモデルを取得します。

![スクリーンショット 2025-02-09 090122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/bbffd32b-7fce-f8a2-9939-e9dcaadf4033.png)

### AIモデルの学習をする

AIの学習を実行します。今回利用するワークステーションにはRTX3060Tiが2基搭載されていますので `tao model ssd train` に指定する利用するGPUを選択するためのパラメータを、1基の構成である `--gpus 1 --gpu_index $GPU_INDEX` から、2基の構成である `--gpus 2 --gpu_index 0 1` へと変更しました。

![スクリーンショット 2025-02-09 092149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/f63229f7-45b0-8fce-a8bf-5d1ce134b3c3.png)

これにより、**学習中のGPU使用率は以下のようになりました。2基のGPUを十分に利用できています。** もし1基のGPU上のメモリなどを十分に消費できていない、または、GPUのメモリからAIモデルが溢れるようであれば、学習に利用しているパラメータである **`ssd_train_resnet18_kitti.txt` に指定されている `training_config` 内の `batch_size_per_gpu: 16` をチューニングする** と良いでしょう。

![スクリーンショット 2025-02-09 091819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/d310a81e-a8f7-6c0a-e518-35c647ae3eb2.png)

学習結果は以下のディレクトリへ蓄積されます。

```bash
# 作業ディレクトリへ移動する
$ cd ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments/

# 学習に利用するモデルを確認する
$ ls ssd/pretrained_resnet18/pretrained_object_detection_vresnet18/
# resnet_18.hdf5

# 作業ディレクトリへ移動する
$ cd ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments/

# 学習結果を格納するディレクトリを確認する
$ cd ssd/experiment_dir_unpruned/
$ ls ./weight
# ssd_resnet18_epoch_001.hdf5  ssd_resnet18_epoch_005.hdf5  ssd_resnet18_epoch_009.hdf5  ssd_resnet18_epoch_013.hdf5
# ssd_resnet18_epoch_002.hdf5  ssd_resnet18_epoch_006.hdf5  ssd_resnet18_epoch_010.hdf5  ssd_resnet18_epoch_014.hdf5
# ssd_resnet18_epoch_003.hdf5  ssd_resnet18_epoch_007.hdf5  ssd_resnet18_epoch_011.hdf5  ssd_resnet18_epoch_015.hdf5
# ssd_resnet18_epoch_004.hdf5  ssd_resnet18_epoch_008.hdf5  ssd_resnet18_epoch_012.hdf5  ssd_resnet18_epoch_016.hdf5
# ...
```

### プルーニング(枝刈り)を実行する

NVIDIA TAO Toolkitは、 **プルーニング (Pruning) によりAIモデルを構成する重み値を削減し、演算量を最適化する機能** も備えています。

![スクリーンショット 2025-02-09 102939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/bf4cfcfd-5ee2-d7a8-082e-db8247950615.png)

プルーニング後、プルーニングされたモデルに対して再度学習を実行します。

![スクリーンショット 2025-02-09 103803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/aa4cd88d-072c-1515-c4b1-99961e928a7e.png)

### 推論結果を表示する

学習した結果のAIモデルを利用した推論を実行し、結果を確認します。このSSDのプログラムでは、9枚の写真に対して推論を行い、物体検出結果を得ることができます。

![スクリーンショット 2025-02-09 113352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/ebc4feb6-f2ee-217b-4bec-99a18820c700.png)

![000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/1e375607-cfb5-c291-82d6-c8b82c43c65f.png)

### AIモデルをエクスポートする

#### ONNX形式でエクスポートする

以上の手順により **NVIDIA TAOで開発したAIモデルを、他のプラットフォームでも利用できるようにexport** します。以下のコードでは、開発したAIモデルを「ONNX」形式で出力しています。ONNX形式のAIモデルは、Netronにより可視化することが可能です。

![スクリーンショット 2025-02-09 114435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/0c1da6fc-baf7-1238-6bd4-62acaa39aed6.png)

```bash
### 開発ディレクトリへ移動する
$ cd ~
$ cd ~/sandbox_tao_tutorial/tao_ssd/data/tlt-experiments/ssd

### export結果を確認する
$ ls ./export
# nvinfer_config.txt  ssd_resnet18_epoch_080.onnx
$ cat ./export/nvinfer_config.txt
# net-scale-factor=1.0
# offsets=103.939;116.779;123.68
# infer-dims=3;300;300
# tlt-model-key=
# network-type=0
# model-color-format=1
# maintain-aspect-ratio=0
# output-tensor-meta=0
```

https://netron.app/

![スクリーンショット 2025-02-09 115052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/15ba714d-bf7e-9feb-10eb-528d63e8ce67.png)

![スクリーンショット 2025-02-09 115118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c251acca-cbe1-e013-b599-881a0e860245.png)

#### TensorRTエンジンとしてエクスポートし、評価する

NVIDIA TAOは、ONNXの他にも **TensorRTエンジンとしてAIモデルをエクスポート** することが可能です。以下はTensorRTとしてエクスポートし、エクスポート結果を利用して推論するステップです。このようにNVIDIA TAOは、様々なAI実行プラットフォームに対応しているため、開発したAIモデルをとても柔軟にデプロイすることができます。

![スクリーンショット 2025-02-09 120404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/681dfed3-5824-72cb-d218-9d072748b910.png)

![スクリーンショット 2025-02-09 120421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/b5fb54a2-e794-4e12-5e46-b96e684f64a3.png)

![スクリーンショット 2025-02-09 120431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/de5f8d2a-66be-60d5-b129-9f9ea1bbbcca.png)

----

以上が **NVIDIA TAOを使ってAIモデルを開発し、デプロイする方法** です。 `tao_tutorial` が提供されているためJupyter Notebookを利用して、 **手順を抜かすことなく、NVIDIA TAOでAIモデルを開発するフローを習得することができます。** `tao_tutorial` には様々なAIモデルが含まれていますので、それについても今後の記事で試してみようと思います。


お付き合いいただきありがとうございました！
お疲れさまでした！

### Jetsonとの連携

なお、 **NVIDIA TAOは、NVIDIA Jetsonシリーズとも連携ができる** ようです。DEEPSTREAM等のミドルウェアの知識が求められることから、試行錯誤は必要そうですが、試してみたいですね！このあたりに関しましても、機材を入手し、紹介していきたいと思います。

https://developer.nvidia.com/ja-jp/embedded/develop/software

![スクリーンショット 2025-02-09 122746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/d6199216-b2fe-32aa-a349-2bd836d45e9b.png)

----