JetPack6.0のJetson AGX Orin DevKit で Triton Inference Server を動かす

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

NVIDIA Jetson AGX Orin Developer KitにJetpack 6.0をインストールしたらはまった(無限に再起動するようになった)話 #NVIDIA - Qiita
https://qiita.com/ynott/items/94de1d1dad2ff7d11f95

上記の記事で、Jetson AGX Orin Developer KitにJetpack 6.0を日本最速(当社調べ)でインストールしてはまりました。
問題も解消し、ぼちぼち動かそうということで、Triton Inference Serverを動かしてみました。

# 1. 環境

jetson_releaseの情報は以下の通りです(jetson_releaseについては[こちら](https://qiita.com/dandelion1124/items/b70703e5251ef20a54f7)を参照)

```yaml
$ sudo jetson_release
Software part of jetson-stats 4.2.8 - (c) 2024, Raffaello Bonghi
Model: NVIDIA Jetson AGX Orin Developer Kit - Jetpack 6.0 [L4T 36.3.0]
NV Power Mode[0]: MAXN
Serial Number: [XXX Show with: jetson_release -s XXX]
Hardware:
 - P-Number: p3701-0000
 - Module: NVIDIA Jetson AGX Orin
Platform:
 - Distribution: Ubuntu 22.04 Jammy Jellyfish
 - Release: 5.15.136-tegra
jtop:
 - Version: 4.2.8
 - Service: Active
Libraries:
 - CUDA: 12.2.140
 - cuDNN: 8.9.4.25
 - TensorRT: 8.6.2.3
 - VPI: 3.1.5
 - Vulkan: 1.3.204
 - OpenCV: 4.8.0 - with CUDA: NO
```

# 2. Dockerのインストール

何も入ってないので、Dockerをインストールします。

## 2-1. Dockerをインストールするまえの周辺パッケージのインストール

```bash
sudo nala update 
sudo nala install \ 
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

## 2-2. Dockerのリポジトリ用の鍵をインストールしてリポジトリを追加

```bash
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
```

```bash
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo nala update
```

## 2-3. Dockerのインストール

特にこだわりも無いので最新版をインストールしました。

```
sudo nala install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

aptを使う人は、nalaはaptに読み替えてください(以下同じ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/333817cc-6996-9276-e988-ac20fb564319.png)

## 2-4. インストール確認

```
$ sudo docker -v
Docker version 26.1.3, build b72abbb
```

## 2-5. 現在のユーザーをdockerグループに追加

```
sudo usermod -aG docker $USER
```

セッションを再接続しておく

## 2-5. nvidia container toolkit を有効にする

Jetpackにはnvidia contaier toolkitは入っているはずですが、default-runtimeがnvidiaになってないと思うので、`/etc/docker/daemon.json`を以下のように書き換える

```
sudo vi /etc/docker/daemon.json
```

以下のようにする
```json
{
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}
```

dockerを再起動しておく
```
sudo systemctl restart docker
```


# 3. Triton Inference Serverを動かす

GitHubの[triton\-inference\-server/server: The Triton Inference Server provides an optimized cloud and edge inferencing solution\.](https://github.com/triton-inference-server/server/tree/main?tab=readme-ov-file#serve-a-model-in-3-easy-steps)をやってみる

## 3-1. Modelのダウンロード

以下を実行するとModelがダウンロードされる。

```
git clone -b r24.04 https://github.com/triton-inference-server/server.git
cd server/docs/examples
./fetch_models.sh
```

以下のようにmodelが入る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b90ce3c4-2e9f-df8d-9c33-19b71c42f44a.png)


## 3-2. Triton Inference Serverを動かす

Dockerで動かすのは簡単

```shell
docker run --gpus=1 --rm --net=host -v ${PWD}/model_repository:/models \
nvcr.io/nvidia/tritonserver:24.05-py3-igpu tritonserver --model-repository=/models
```

::: note warn 
- コンテナイメージは、igpuと付いているものを使う事
  (チュートリアルとは違うので注意)
:::

::: note
- model_repositoryがあるディレクトリで実行する事
- Disk空きが12GB以上空きがあること(コンテナイメージが10.9GB)
- 途中起動メッセージで`could not open file to read NUMA node: /sys/bus/pci/devices/0000:00:00.0/numa_node`とか出ますが、無視する
:::

```
I0527 08:24:47.947393 1 grpc_server.cc:2463] "Started GRPCInferenceService at 0.0.0.0:8001"
I0527 08:24:47.948125 1 http_server.cc:4692] "Started HTTPService at 0.0.0.0:8000"
I0527 08:24:47.990732 1 http_server.cc:362] "Started Metrics Service at 0.0.0.0:8002"
```
まで出ればOK

## 3-3. Triton Inference Serverをテストする

Serverが動いても何もしてくれないので、何か画像を投げてテストします。
別のターミナルを起動して、以下のコマンドを打ちます。
こちらはファイルを投げつけるだけなので、tritonserverコンテナである必要もありませんが、チュートリアルに沿ってテストします。

```shell
docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:24.04-py3-sdk
```

コンテナ内に入るので、以下のコマンドを実行
```shell
/workspace/install/bin/image_client -m densenet_onnx -c 3 -s INCEPTION \
/workspace/images/mug.jpg
```

こんな風に返ればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/004c0176-1710-0c52-eb42-7ded88952219.png)

# 4. まとめ

Jetsonには罠が一杯
20GBぐらい容量を利用するので注意する