WSL2のUbuntu22.04.3 LTSにCUDAをインストール

DeepLearningShogiの実行環境として、WSL2を選択したが、そのためのミドルウェアとしてCUDA Toolkit,cuDNN,TensorRTをインストールする必要がある。

その環境を構築してみたので、手順を以下に示す。

# 前提条件
OS: Windows 11
WSL: デフォルトでインストールされる環境
2024年2月現在のWindows11にWSLをインストールした場合に、デフォルトでUbuntu22.04.3 LTSがインストールされる。
<details><summary>
Ubuntu 22.04.3 LTS (GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)
</summary></details>

# 具体的手順

まず、Windowsに最新のnvidia Graphic driverをインストールする。

WSLの初期状態から以下の３つをインストールする。
CUDA Toolkit 12.1.1
cuDNN 8.9.7
TensorRT 8.6 GA for cuda 12.0 and 12.1

CUDA Toolkitの最新バージョンは12.3であるが、このバージョンを使うのは、TensorRTが最新バージョンをサポートしていないように見えるため。

## 1.CUDA Toolkit
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

### 1.1 環境の確認
* サポートするGPUはインストールされている。(Pascal以降）
* GPUDirect Storageを使うのであれば、ここでインストールするらしいが、今回は無視

### 1.2 gccのインストール
デフォルトではUbuntuにgccは入っていないので、ここでインストールする。
```
sudo apt-get update
sudo apt install gcc
```


### 1.3 ダウンロード
 https://developer.nvidia.com/cuda-downloads

から、ResourcesのArchive of Previous CUDA Releasesをクリックし、過去のリストから使用するバージョンCUDA Toolkit 12.1.1 (April 2023)を選択する。

Linux/x86_64/WSL-Ubuntu/2.0/deb(network)を選択する。

#### 1.3.1 Install the newcuda-keyring package:
```
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
```

#### 1.3.2 Update the Apt repository cache:
```
sudo apt-get update
```
#### 1.3.3 Install CUDA SDK:
```
sudo apt-get install cuda-toolkit-12-1
```

### 1.4  環境変数の設定
PATH、LD_LIBRARY_PATHの２つの環境変数を設定する。
/etc/bash.bashrc に以下の行を追加

```
if [ -e /usr/local/cuda ]; then
        export PATH="/usr/local/cuda/bin:$PATH"
        export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
fi
```

### 1.5 動作確認

#### 1.5.1 サンプルコードをビルドして動作確認
 https://github.com/nvidia/cuda-samples

からサンプルコードを入手して、動作確認する。

サードパーティのライブラリを入れる必要あり。

```
sudo apt-get install libfreeimage3 libfreeimage-dev
```

以下の手順で、２つのプログラムをビルドして実行テスト
deviceQuery
bandwidthTest


```
git clone https://github.com/nvidia/cuda-samples
cd cuda-samples/Samples/1_Utilities/deviceQuery
make
./deviceQuery
cd ../bandwidthTest
make
./bandwidthTest
```

### 1.6 PCを再起動する

## 2.cuDNN
https://docs.nvidia.com/deeplearning/cudnn/installation/overview.html

最新版以外のNetwork Installの説明がないため、local installでインストールを実行する。

### 2.1 Download
ブラウザでダウンロードする。
https://developer.nvidia.com/rdp/cudnn-archive
から、バージョンを選ぶ。今回は、 cuDNN v8.9.7 (December 5th, 2023), for CUDA 12.x

ダウンロードリストから、Local Installer for Ubuntu22.04 x86_64 (Deb)を選ぶと、ダウンロードを開始する。

保存したディレクトリを、C:\Downloads とする。

### 2.2 Enable the local repository.
```
cd /mnt/c/Downloads
sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb
```

### 2.3 Import the CUDA GPG key.
```
sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/
```

### 2.4 Refresh the repository metadata.
```
sudo apt-get update
```

### 2.5 Install the per-CUDA meta-packages.
```
sudo apt-get install nvidia-cudnn
```

### 2.6 動作確認
```
sudo apt-get install libcudnn8-samples
cp -r /usr/src/cudnn_samples_v8 .
cd cudnn_samples_v8/mnistCUDNN
make clean && make

FreeImage.hがない場合は、
sudo apt-get install libfreeimage3 libfreeimage-dev

./mnistCUDNN
```

Test passed! と出れば、完了

## 3. TensorRT
https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html#installing

apt などを使うより、tarを展開して自分の環境を作る方がお勧め(Documentより)

## 3.1 python環境をインストールする。
デフォルトのUbuntuの初期状態では、python3として、python3.10 がインストールされている。
python として　python3.13とデフォルトを切り替えできるように、python3.13をなどをインストールする。

### 3.1.1 pip
```
sudo apt install python3-pip
```
### 3.1.2 リポジトリ追加
```
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
```
### 3.1.3 update
```
sudo apt update
```

### 3.1.4 pythonのインストール
現環境では、3.13までのpythonがインストール可能な状態になっているので、以下の２つをインストールする。venvで仮想環境を分けるため、pythonX.X-venvもインストールしておく。
```
sudo apt install -y python3.13 python3.13-venv
sudo apt install -y python3.10 python3.10-venv
```

### 3.1.5 alternativesで切り替え
```
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.13 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 110
```

### 3.1.2 切り替え
```
sudo update-alternatives --config python
```

これで、3.10 と 3.13 を選択することができるが、デフォルトの3.10を使う。

## 3.2 ダウンロード
https://developer.nvidia.com/nvidia-tensorrt-8x-download から、
TensorRT 8.6 GA for Linux x86_64 and CUDA 12.0 and 12.1 TAR Package　をクリックし、ダウンロードする。

ファイルを保存したディレクトリを、C:\Downloads とする。

## 3.3 インストール
どこにインストールしてもいいが、他のユーザーでも利用できるようにするため、/usr/localにインストールする。

```
tar -xzvf /mnt/c/Downloads/TensorRT*.gz
sudo mv ./TensorRT-8.6.1.6 /usr/local/
sudo ln -s /usr/local/TensorRT-8.6.1.6 /usr/local/TensorRT
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/TensorRT/lib
cd /usr/local/TensorRT/python
python -m pip install tensorrt-8.6.1-cp310-none-linux_x86_64.whl
python -m pip install tensorrt_lean-8.6.1-cp310-none-$ linux_x86_64.whl
python -m pip install tensorrt_dispatch-8.6.1-cp310-none-linux_x86_64.whl
cd ../uff
python -m pip install uff-0.6.9-py2.py3-none-any.whl
cd ../graphsurgeon
python -m pip install graphsurgeon-0.4.6-py2.py3-none-any.whl
cd ../onnx_graphsurgeon
python -m pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl
```
## 3.4 動作確認
/usr/local/TensorRT/samplesに、サンプルコードがあるので、これをビルドして動作させた。

```
cd /usr/local/TensorRT/samples/sampleOnnxMNIST
make
cd ../../bin
./sample_onnx_mnist
```

以下、確認方法を、Installation Guideからそのまま転載した。

* Ensure that the installed files are located in the correct directories. For example, run the tree -d command to check whether all supported installed files are in place in the lib, include, data, and so on directories.
* Build and run one of the shipped samples, for example, sampleMNIST in the installed directory. You should be able to compile and execute the sample without additional settings. For more information, refer to sampleMNIST.
* The Python samples are in the samples/python directory.


# 感想
再現性や拡張性を考えて、色々と調べながら時間を掛けてインストールしたが、使っているうちにぐちゃぐちゃしてくるような気がする。
特に、CUDA関係のライブラリのアップグレードが発生すると、大変だと思う。この辺は、dockerを使おうが何をしようが、どうしようもないところ。

以上