BTOサーバーにCUDA 10を入れた時の作業ログ

オンプレのGPUクラスターにBTOサーバーを増設する機会があったので、その際に出くわしたトラブルとその解決方法を備忘録的に書き留めておく。実際の作業はansibleを介して行っていたりするが、簡単のためにansible部分はシェルでの操作に書きなおしている。

## サーバーのスペック
|||
| ---- | ---- | ---- |
| マザーボード | PRIME X299-A II |
| CPU | Intel(R) Core(TM) i9-9820X CPU @ 3.30GHz |
| GPU | RTX 2080 SUPER × 2 |

## 作業ログ
Bootable USBからUbuntu18.04をインストール。
UEFIセキュアブートによってnvidia-driverが弾かれていたため、BIOSからセキュアブートを無効化(BootタブのOS TypeをWindows UEFI modeの指定からOther OSの指定に変更)。
セキュアブートが無効になっていることを確認。

```sh
$ dmesg | grep Secure
[    0.000000] secureboot: Secure boot disabled
```
同じ構成で作った自作PCでははじめからセキュアブートが切られていたので、この作業はおそらく購入元の設定による。

`nvidia-smi`を実行したところ、ドライバーからGPUが見えていない。

```sh
$ nvidia-smi
No devices were found
```
マザーボードがGPUを認識しているか確認。

```sh
$ sudo update-pciids # PCI ID リストの新しいバージョンをダウンロード
$ lspci | grep -i nvidia
17:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080 SUPER] (rev a1)
...
65:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080 SUPER] (rev a1)
```
認識している。
nvidia-driverのバージョンを確認。

```sh
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.48  Thu Sep  6 06:36:33 CDT 2018
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
```
410が入っている。公式によれば410はRTX2080をサポートしている(https://www.nvidia.com/Download/driverResults.aspx/140135/en-us )はずだけど、念の為ドライバを新しいものに入れなおす。
410をアンインストール後、450を代わりにインストールして再起動。

```sh
$ sudo apt purge nvidia-*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt install nvidia-driver-450
$ sudo reboot
```
ドライバーからのGPUの認識を確認。

```sh
$ nvidia-smi
Fri Sep 11 04:35:14 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.66       Driver Version: 450.66       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| 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  GeForce RTX 208...  Off  | 00000000:17:00.0 Off |                  N/A |
| 23%   42C    P0    43W / 250W |      0MiB /  7982MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:65:00.0 Off |                  N/A |
| 24%   45C    P0    31W / 250W |      0MiB /  7979MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
```

クラスターの他のノードとの兼ね合いでCUDA 10をインストール。
公式からdebファイルを入手。
https://developer.nvidia.com/cuda-10.0-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=deblocal

```sh
$ sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
$ sudo apt update
$ sudo apt install cuda
```
しかし、再度`nvidia-smi`を実行すると再びGPUが行方不明になっている。

```sh
$ nvidia-smi
No devices were found
```
nvidia-driverのバージョンを確認したところ、410に戻っている。

```sh
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.104  Tue Feb  5 22:58:30 CST 2019
GCC version:  gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
```
どうも、公式の提供しているCUDAのdebファイルはnvidia-driverを一緒にインストールしてくるらしい。よく見ると`cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb`の名前に410が入っているので、ここが入れてくるドライバーのバージョンに相当していそう。
440のドライバーに対応するdebがローカルにあったので、それを使って再度CUDAをインストール。

```sh
$ sudo apt purge cuda-*
$ sudo apt purge nvidia-*
$ sudo apt autoremove # これが無いと新しく入るnvidia-driverの依存関係が解決できない
$ sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
$ sudo apt install cuda
```
cuda-10.2が`/usr/local`以下に入っていることを確認。

```sh
$ ls /usr/local | grep cuda
cuda
cuda-10.2
```
pathは通っていないが、クラスターの構成上問題ないので完了。