NVIDIA AI Workbenchを使ってみる

# 概要
NVIDIA AI Workbenchを触ってみたため、構築手順と軽く使ってみるところまでを備忘として残します。

## 本記事の対象
- NVIDIA AI Workbenchを触ってみたい方
- NVIDIA GPUを使ったコンテナ環境での開発を便利にしたい方

## NVIDIA AI Workbenchとは
NVIDIA AI WorkbenchはAIプロジェクト開発のための開発者ツールキットです。
用いることでAI Workbenchを通じてプロジェクトの管理やコンテナの実行、コードの作成などをスムーズに行えます。
また、インストールの過程でコンテナやGPUドライバなど開発で必要な環境も合わせてセットアップしてくれます。
(Windowsの場合WSL有効化もやってくれる)

本記事執筆時点では以下OSにて利用することができます。
※ Windows Server2022は試したところ、だめでした
- Windows 11 (build 22000 or later)
- Windows 10 (build 19044 or later)
- Ubuntu 24.04
- Ubuntu 22.04
- macOS Monterrey (12) or later

https://docs.nvidia.com/ai-workbench/user-guide/latest/overview/introduction.html

## 構築環境
今回はUbuntu ServerとWindowsクライアントマシンをそれぞれ1台ずつ用意しています。
Ubuntu Serverは物理GPUを搭載しており、実際にコード等を実行するコンテナが動く場所として用います。
WindowsクライアントはAI Workbenchの操作用マシンとして用います。

実際は両方ともAI Workbenchをインストールしておき、Windowsクライアント側のAI WorkbenchにRemote LocationとしてUbuntu Server側のAI Workbenchを登録して繋げる形です。
利用者がAI Workbenchを用いて開発などをする際はWindows側のAI Workbenchを操作して、Ubuntu Server上のコンテナを操作する感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/fc729013-a999-f57e-8546-b764874cacc2.png)
※ Windows側のDockerは使わないですが、NVIDIA AI Workbenchのインストール過程で入ります

それぞれの簡易的なマシンの状態は以下です。
- Ubuntu Server
    - OS: Ubuntu Server 24.04
    - コンテナランタイム: Dockerインストール済
    - GPU: 有 (L40s)
    - GPUドライバ: 未
- Windowsクライアントマシン
    - OS: Windows10 Pro
    - コンテナランタイム: 未
    - WSL: 未
    - GPU: 無

## 流れ
流れとしては以下となります。
- NVIDIA AI Workbenchセットアップ
    1. Ubuntu Server側 (Remote Location) の準備
        1. NVIDIA AI Workbench インストール
        1. docker buildx インストール
    1. Windows側 (AI Workbench操作側) の準備
        1. SSH Keyの準備
        1. NVIDIA AI Workbench インストール
        1. Remote Locationの追加
- NVIDIA AI Workbenchを使ってみる
    1. Hello World
    1. コンテナカスタマイズ
    1. GPU割り当て

# NVIDIA AI Workbenchセットアップ
## Ubuntu Server側 (Remote Location) の準備
ここでの操作はすべてWindowsクライアント側からUbuntu ServerにSSHで接続して行います。
### NVIDIA AI Workbench インストール

まずUbuntu ServerにNVIDIA AI Workbenchのインストールを行います。
[公式ドキュメント](https://docs.nvidia.com/ai-workbench/user-guide/latest/installation/ubuntu-remote.html)に従い、以下コマンドを実行します。
```bash
mkdir -p $HOME/.nvwb/bin && \
curl -L https://workbench.download.nvidia.com/stable/workbench-cli/$(curl -L -s https://workbench.download.nvidia.com/stable/workbench-cli/LATEST)/nvwb-cli-$(uname)-$(uname -m) --output $HOME/.nvwb/bin/nvwb-cli && \
chmod +x $HOME/.nvwb/bin/nvwb-cli && \
sudo -E $HOME/.nvwb/bin/nvwb-cli install
```

実行するとインストールウィザードが表示されるため、案内に従いながら進めていきます。

まず初めにコンテナランタイムのインストールを聞かれます。
今回はDockerがインストール済みのため、そちらを選択して次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/7804ebe2-a076-9419-ce06-47d07ddbfb4e.png)

続いてGPU Driverのインストールを聞かれます。
今回は未インストールのため、こちらでインストールを行ってもらうよう選択して次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/dc6ea303-598e-3a4f-5ab4-234a5ce7ef97.png)

インストールプロセスが開始されるため、しばらく待ちます。
以下画像のようにこのタイミングでGPU Driverのインストール等も行ってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/48ff6220-2da3-b456-dcd0-07dae216770c.png)


インストールが完了したら Reboot Nowを選択して再起動を待ちます。
この手順の中でGPU Driverのインストールを行わない場合は再起動は不要となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/e9b40e51-d497-2d2d-bba0-309638acce7f.png)

再起動完了後、以下コマンドが正常に動作することを確認しておきます。
GPU DriverとNVIDIA AI Workbenchが無事にインストールされていることが確認できます。
```bash
nvidia-smi

## 出力
| NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4 
```
```bash
nvwb version

## 出力
nvwb 0.27.7 (stable; linux; amd64; go1.21.11; Tue Jun 18 21:41:52 UTC 2024)
```

### docker buildx インストール
NVIDIA AI WorkbenchではコンテナのBuildにbuildxを用います。
そのため、あらかじめインストールを行っておく必要があります。
以下コマンドにてインストールを実施しておきます。
```bash
sudo apt install docker-buildx
```

インストール後、実行できることを確認しておきます。
```bash
docker buildx version

## 出力
github.com/docker/buildx 0.12.1 0.12.1-0ubuntu2.1
```

以上でUbuntu Server側の準備は完了です。

## Windows側 (AI Workbench操作側) の準備
続いてWindows側の準備を進めていきます。

### SSH Keyの準備
後ほどUbuntu Serverを登録するために、公開鍵での認証が必要となります。
そのため、以下コマンドをWindowsのpowershellで実行し、鍵の作成とUbuntu側への公開鍵登録を行っておきます。
```bash
ssh-keygen -f "C:\Users\<ユーザー名>\.ssh\id_rsa" -t rsa -N '""'
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh <ubuntuユーザー>@<ubuntu IP> "cat >> .ssh/authorized_keys"
```
※< >で囲っているところは環境に合わせて変更が必要

### NVIDIA AI Workbench インストール

まずインストーラーを公式サイトからダウンロードしておきます。

https://www.nvidia.com/ja-jp/deep-learning-ai/solutions/data-science/workbench/

インストーラーを実行すると以下のような画面が表示されるため、[Begin Installation]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/3b867272-efe0-6170-3d6a-9e33e1c43f70.png)

するとWSLの有効化を聞かれるため、そのまま進んで有効化処理を待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/b31631dd-5029-9b8c-6e36-1a2b89cffe40.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/b5687c07-0ffc-4bcc-298b-5264a2615233.png)

有効化処理が完了すると再起動が案内されるため、再起動を行います。(WSL側の都合)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/fd006bf3-a056-d746-b78e-bf9f916c545b.png)

再起動完了後、NVIDIA AI Workbenchを起動するとWSLのDistributionのダウンロードが開始されます。
(WindowsアプリケーションにNVIDIA AI Workbenchが登録されています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/749d7847-e7d0-016e-228a-103d8bb38dcb.png)

Distributionのダウンロードが完了すると、コンテナランタイムを聞かれます。
今回はDockerを選んで次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/a7cf1fbe-f1ba-598c-707d-623d8f87277c.png)

すると、Docker Desktopをインストールするよう案内がされます。
ここは手動で表示されているリンクからインストーラーをダウンロードしてインストールを行っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/3763ff37-f171-89c7-3a40-f7e5ded013b7.png)

Docker Desktopインストール後は一度サインアウト、サインインを行い再度AI Workbenchを起動します。

すると、再びコンテナランタイムを選択する画面が表示されるため、Dockerを選んで次に進みます。
(dockerの選択肢の左上にInstalledが記載されています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/4da2106b-38d9-095a-7059-e58c6561ed8e.png)

パッケージのインストールが開始されるため、完了まで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/d0ba59e9-e3c2-7c8c-51ef-05a44368eba6.png)


パッケージのインストールが完了するとGit Serverの選択肢が表示されます。
ここで登録しておくことで、AI Workbenchで作成したコードなどをそのままgitへコミットすることができたりできるようです。

今回は一旦下の[Skip and connect Git server later]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/60c80fb1-9045-f764-0399-016fe5474490.png)

ここまで実施するとインストール完了となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/bf54baa7-ab11-8fc0-00ca-c86de8c6fb15.png)


### Remote Locationの追加
続いてUbuntu ServerをRemote Locationとして追加していきます。
インストール完了後は起動すると以下のようなLocation選択画面が表示されるようになります。
[Add Remote Location]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/e54dc4aa-35fb-da0b-9733-4a9358df5645.png)

Remote Locationの接続情報等を入力する画面が表示されます。
ここのSSH Ke Fileのところで準備しておいた秘密鍵を選択する形になります。
すべて入力を終えたらAdd Locationを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/abc35b9a-23f5-6054-30b2-1d62e1bf7496.png)

無事にLocationが追加されたら完了となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/7b3b7ffd-8d7f-ffb2-bcf8-16c809f816ed.png)

# NVIDIA AI Workbenchを使ってみる
それでは最後にNVIDIA AI Workbenchを軽くコードの実行等を行っていきます。
## Hello World
AI Workbenchを起動して、Locationを選択するとプロジェクトの選択画面が表示されます。
まだ1つも無い状態のため、[Start a New Project]で新しく作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/7805f620-1fd8-78f5-7917-f755167bff59.png)

プロジェクト名などを入力して、次に進みます。
今回は[hello-world]にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/aaaf4128-ec5c-7273-0577-577cb012a6ad.png)

次は実行するコンテナイメージの選択する画面が表示されます。
今回はPython Basicを選択して[Create]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/36afb351-d4a8-85e4-7961-7a7cdd43de14.png)

するとプロジェクトが作成され、フォルダ構造等が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/07655d69-0d61-ee9f-611a-ffac993f5b5f.png)

なお最初はBuild中のため、画面下のOutputをクリックしてBuild完了まで待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/fde75ac1-fde1-5398-91b0-675ffc148842.png)

Buildが完了したら左のペインから[Environment]を選択します。
ここでは含まれているPackageの確認や、ビルドのスクリプトの編集、コンテナにマウントするフォルダなどを設定したりすることができます。
一旦そのまま右上の[Start Environment]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/0980cdf4-f72a-6188-0d39-08a240c5d25e.png)

[Start Environment]の処理完了後右上の[Open Jupyterlab]をクリックします。
するとブラウザでJupyter labが起動してきます。
今回はNotebookからPython3を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/82bb7bbc-8fb2-4a34-018b-f83fb29e7992.png)

Hello Worldを表示するコードを実行して、問題なくPythonが動作することが確認できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/14a0ba8e-81eb-63bf-f573-0a8360e8df7a.png)

ちなみにこのタイミングでubuntu Server側にSSHで繋いでコンテナを確認すると実行されていることが確認できます。
```bash
docker ps

## 出力
CONTAINER ID   IMAGE                                       COMMAND                  CREATED          STATUS          PORTS                                       NAMES
86172c9477e5   project-hello-world                         "/entrypoint.sh tail…"   3 minutes ago    Up 3 minutes                                                project-hello-world
d2d3d2e3ebea   traefik:v2.10.7                             "/entrypoint.sh trae…"   38 minutes ago   Up 11 minutes   80/tcp, 127.0.0.1:10000->10000/tcp          workbench-proxy
```

## コンテナカスタマイズ
続いてコンテナのカスタマイズを行います。
厳密には以下Python ライブラリの追加をここでは行ってみます。
```
torch
numpy
matplotlib
pandas
scikit-learn
```

Jupyterlabの画面で左のrequirements.txtを開き、先程のライブラリを追記して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/b37fad13-1ca6-e51f-78fc-a46629e2b4f4.png)

AI Workbenchに戻ると、変更を検知してRebuildの案内が表示されています。
[Rebuild & ReStart]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/5299c968-d846-611d-c3f2-034f582a92ca.png)

Restart完了後、Jupyterlabに戻りライブラリがインストールされていることを確認します。
以下のようにimportができて実行できることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/54f69d3c-5081-0eba-d681-4feb37387c40.png)

ちなみにAI WorkbenchのEnvironmentのPackagesを見ると、追加したライブラリ群が認識されていることも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/1c4b3549-e864-614b-c51a-dc35713c63c5.png)


## GPU割り当て
それでは最後にGPUの割り当てを行っていきます。
デフォルトではGPUを使わない設定でコンテナを起動するため、手を加えます。

AI WorkbenchのEnvironmentの中のHardwareを確認します。
Number of Desired GPUsの項目で割り当てるGPU数を選ぶことができます。
今回は1を選択しておきます。
選択後はRestartの案内がでるため、そのまま[Restart]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/851fa9b8-ed38-cb67-09f0-7dd897eb1493.png)

Restart完了後、Jupyterlabに戻りtorchのライブラリでGPUを確認できるため以下のように実行します。
すると無事GPUを認識できていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/267dd8ab-8f92-f1e7-1ce4-e5093902a43f.png)


# まとめ
今回はNVIDIA AI Workbenchを使ってみました。
思ったより使いやすく、コンテナの実行環境を提供する際に便利だなと感じました。
今回は試しきれていませんが、VS Codeと連携したりGitとの連携等も別途触ろうと思います。

## おまけ
記事上はきれいに順番を整理していますが、初め試行錯誤する中でAI WorkbenchのRemote Locationにて使われるworkbench-proxyのコンテナが落ちていたときがありました。
手順結構ごちゃった時になったため、基本気にする必要は無いのですが、もし落ちていたら再起動をしてあげてください。
```
docker restart workbench-proxy
```
## 参考にしたサイト

https://docs.nvidia.com/ai-workbench/user-guide/latest/overview/introduction.html

https://docs.nvidia.com/ai-workbench/user-guide/latest/locations/remote.html#locations-remote-link

https://docs.nvidia.com/ai-workbench/user-guide/latest/installation/ubuntu-remote.html