Ubuntu22.04にCUDA/cuDNN/tensorRTをインストール




# はじめに

CUDAのインストールを何度も繰り返しているので流石にそろそろ手順をまとめようと思って書いています。nvidia driver, cuda, cudnn, tensorRTをインストールすることを目的とします。

筆者もそんなに詳しくないので補足などあれば歓迎します。というか寧ろ教えてください。
また、手順書はメモからの転記の「である調」で書きます。

## Autowareのsetup.shを用いたインストール

もし環境がまっさらの場合、Autowareのinstall processでROS2環境含め全部インストールすることが出来ます。

https://autowarefoundation.github.io/autoware-documentation/main/installation/autoware/source-installation/

もし、ROS2環境を作っておいても良い容量の余裕があったり、デフォルトのPython環境をある程度いじられても良ければこちらでワンコマンドで終了する可能性もあるので是非試してみてください。

なお、本記事は上記の自動プロセスで謎にコケてしまったのが発端で書き始めています。

## 何かとよく叩くコマンド

今どうなっているっけ？となった場合のコマンド一覧

| 確認内容                                                | command                   | 一言                                  |
| --------------------------------------------------- | ------------------------- | ----------------------------------- |
| driverのversion確認（古いものが残っているとうまく動かないことがあるのでその場合は再起動） | `nvidia-detector`         | あんま使わない                             |
| 接続されているハードウェアの確認                                    | `lspci \| grep -i nvidia` | 最初だけ                                |
| nvidia driverが正常に動いているか確認                           | `nvidia-smi`              | よく使う。よくバグる。困ったら一旦再起動する。             |
| nvidiaのソフトの残党を探す                                    | `dpkg -l \| grep nvidia ` | 残党刈りに使う                             |
| cudaの残党を探す                                          | `dpkg-query -l '*cudnn*'` | dpkg-queryでいちいちgrepしなくていいことに途中できづいた |
| cudaのversion確認                                      | `nvcc -V`                 | 使う                                  |
| 環境変数のcudaを確認                                        | `printenv \| grep cuda`   | 初めて使ったのでメモ                          |


## 参照ページ

NVIDIAのドライバまわりはバージョン同士の食い合わせの問題があるので公式の下記のページを見ると良いでしょう。

https://docs.nvidia.com/deploy/cuda-compatibility/index.html

他の方の記事はこちら

https://qiita.com/tf63/items/0c6da72fe749319423b4

# 0: 既存の環境を消し飛ばす

まっさらなPCのセットアップをしている場合はSkip可。既にcudaの何某かを入れたことがある方はこちら。
もしよくわからない方は下記の出力で引っかからないか確認して見て欲しい。


## 0-1: holdされているドライバをunhold

holdされているとうまく削除できない場合があるのでunhold。

```
sudo apt-mark unhold cuda-*
sudo apt-mark unhold nvidia-*
sudo apt-mark unhold libcudnn*
sudo apt-mark unhold libnv*
```

### Optional: nouveauを無効化

下記は実行したことがあるが今回はやってないのでOptionalとする。

install前にデフォルトで導入されているドライバnouveauを無効化

`/etc/modprobe.d/blacklist-nouveau.conf` を作成し以下を書き込む。


```
blacklist nouveau
options nouveau modeset=0
```
設定適用、再起動


```
sudo update-initramfs -u
sudo reboot
```

## 0-2: 古いdriverの削除


```
sudo apt purge cuda-*
sudo apt purge nvidia-*
sudo apt purge libcudnn*
sudo apt purge libnv*
```

この後、きちんとautoremoveをしたほうが経験上良い

```
sudo apt autoremove 
```

人によってはこのあと再起動したいかもしれないが、デフォルトのドライバ(Nouveau)を無効化していたりするとGUIが起動しなくなったりする（した）ので個人的にはこのまま次のdriver installに移りたい。

# 1: NVIDIA Driver Install

NVIDIAのDriverのインストール方法にはいろいろあるが今回はCUIを用いた一例を示す。
詳しくは公式や他の方の記事を参照。


## 1-1: 適したdriverの確認

Get nvidia repository

```
sudo add-apt-repository ppa:graphics-drivers/ppa
```

適したdriverの確認を下記のコマンドで行う。（以後コマンドと結果と同時に載せる場合、$から始まる部分をコマンド、それ以外をCUIの出力とする）

```
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002520sv000017AAsd000022E4bc03sc00i00
vendor   : NVIDIA Corporation
model    : GA106M [GeForce RTX 3060 Mobile / Max-Q]
manual_install: True
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-535 - distro non-free recommended
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-545-open - distro non-free
driver   : nvidia-driver-535-open - distro non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-545 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
```

例えば上記の出力を見るに下記のnvidia-driver-535がおすすめされているのでそれをメモしておく。（なお、今回はこの時点で既に550がインストールされているので、以後550を前提に進める。）

```
driver   : nvidia-driver-535 - distro non-free recommended
```

## 1-2: nvidia driverのインストール


先程のverを選択してapt installを行う。versionの部分は適宜変更のこと。

```
sudo apt update
sudo apt install nvidia-driver-550
```

## 1-3: 再起動

再起動をかける

```
reboot
```

nvidia-smiで確認。下記のような画面になっていたら成功。

```
$ nvidia-smi
Tue Apr 30 00:06:18 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.67                 Driver Version: 550.67         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 ...    Off |   00000000:01:00.0  On |                  N/A |
| N/A   52C    P5             18W /   80W |     138MiB /   6144MiB |      8%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      2212      G   /usr/lib/xorg/Xorg                            133MiB |
+-----------------------------------------------------------------------------------------+
```


# 補足: driverとCUDAその他のバージョンの確認

compativilityの表にもあるようにCUDAの12.xを使うにはdriverはある程度新しい必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188863/9a124ae8-ad25-761f-3f44-a800cee3d681.png)



# 2: install cuda

こちらもいくつか方法があるがここではCUDA toolkitに準拠してインストールする。

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

## 2-1: CUDAのインストールコマンド


上記のToolkitのページにてに必要な情報を入れていくと必要なコマンドが表示される。これを一つずつinstallしていく。

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

上記は間違ってlocal installをしてしまったのでもっと良い手法があるのかも

終了後は一度rebootをする。

<details> <summary> network installはこちら </summary>
network install

```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-5
```


</details>


## 2-2: version確認

https://shift101.hatenablog.com/entry/2022/02/27/200953

cudaの確認

```
$ nvidia-smi
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.67                 Driver Version: 550.67         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 ...    Off |   00000000:01:00.0  On |                  N/A |
| N/A   54C    P8             15W /   80W |     138MiB /   6144MiB |     33%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      2650      G   /usr/lib/xorg/Xorg                            133MiB |
+-----------------------------------------------------------------------------------------+

```


toolkitのver確認

```
$nvcc -v
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
```



# 3: cuDNNのインストール

cuDNN installで調べて出てくる下記を参照。

## 3-1: cudnn install

複数パターンで導入できる。どちらでも動きそうだったが基本Aの方でやる人が多そうなのでそちらのほうが良さそう。（助言ほしいです）

### 3-1-A: cudnnのarchiveからインストール

下記ページからインストールしたいverと機器の組み合わせからファイルを選択。後述だがtensorRTのverによってある程度縛られるので注意。今回は `8.9.7`を選択する。

https://developer.nvidia.com/rdp/cudnn-archive

必要なファイルをDL後、下記のようなinstallコマンドを打った。あくまで一例なので画面の表示に従うこと。(EAがEarly access、GAがStable版らしいのでGAがあるならGAを選択)


deb fileのインストール

```sh
sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb  
sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/
```


cudaとcudnnのversionに合わせて、下記のinstallを実行。（なのだが12.4に直接対応するものが無い。この場合、別に12.2でも良いらしい。[12.1に対して入れている人もいる](https://qiita.com/d83yk/items/dd2c7a82c37c65b65359)し多分互換性があるんだと思われる。なかったらごめんなさい。）

```sh
sudo apt update
sudo apt-get install libcudnn8=8.9.7.*-1+cuda12.2
sudo apt-get install libcudnn8-dev=8.9.7.*-1+cuda12.2
sudo apt-get install libcudnn8-samples=8.9.7.*-1+cuda12.2
```


### 3-1-B: cudnnのDownloadsからインストール

最初こちらでやってしまったが多分文献の多さを見るにこちらは推奨されないかもしれない。

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

ubuntu22.04での共通部分。

```sh
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
```

今回はcuda12に対応するcudnnをinstallするので下記を実行。

```sh
sudo apt-get -y install cudnn-cuda-12
```


## 3-2: Installation check

autowareのinstall.shを回しているので

### 3-1-Aの場合の出力例

```sh
$ dpkg -l | grep cudnn
ii  cudnn-local-repo-ubuntu2204-8.9.7.29              1.0-1                                       amd64        cudnn-local repository configuration files
ii  libcudnn8                                         8.9.7.29-1+cuda12.2                         amd64        cuDNN runtime libraries
ii  libcudnn8-dev                                     8.9.7.29-1+cuda12.2                         amd64        cuDNN development libraries and headers
ii  libcudnn8-samples                                 8.9.7.29-1+cuda12.2                         amd64        cuDNN samples
ii  ros-humble-cudnn-cmake-module                     0.0.1-3jammy.20240217.032259                amd64        Exports a CMake module to find cuDNN.
```

### 3-1-Bの場合の出力例


```sh
$ dpkg -l | grep cudnn
ii  cudnn9-cuda-12                                    9.1.0.70-1                                  amd64        NVIDIA cuDNN for CUDA 12
ii  cudnn9-cuda-12-4                                  9.1.0.70-1                                  amd64        NVIDIA cuDNN for CUDA 12.4
ii  libcudnn9-cuda-12                                 9.1.0.70-1                                  amd64        cuDNN runtime libraries for CUDA 12.4
ii  libcudnn9-dev-cuda-12                             9.1.0.70-1                                  amd64        cuDNN development headers and symlinks for CUDA 12.4
ii  libcudnn9-static-cuda-12                          9.1.0.70-1                                  amd64        cuDNN static libraries for CUDA 12.4
ii  ros-humble-cudnn-cmake-module                     0.0.1-3jammy.20240217.032259                amd64        Exports a CMake module to find cuDNN.
```

### 補足：pytorchでのinstall確認

本来このチェックはpytorchをinstallする必要があるが、autowareのinstallationをしていれば確認できたりする。

### 3-1-Aのケース

```sh
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> print(torch.cuda.get_device_name())
NVIDIA GeForce RTX 3060 Laptop GPU
```

### 3-1-Bのケース

```sh
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> print(torch.cuda.get_device_name())
NVIDIA GeForce RTX 3060 Laptop GPU
```

Further check: 

https://stackoverflow.com/questions/48152674/how-do-i-check-if-pytorch-is-using-the-gpu


# Version確認

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

tensorRTにはある程度ver指定がある。上のページの下記表記を見るにcuDNNは8.9.7が良さそうである。


> Ensure that you have the following dependencies installed.
> 
> - CUDA [11.0 update 3](https://developer.nvidia.com/cuda-toolkit-archive), [11.1 update 1](https://developer.nvidia.com/cuda-toolkit-archive), [11.2 update 2](https://developer.nvidia.com/cuda-toolkit-archive), [11.3 update 1](https://developer.nvidia.com/cuda-toolkit-archive), [11.4 update 4](https://developer.nvidia.com/cuda-toolkit-archive), [11.5 update 2](https://developer.nvidia.com/cuda-toolkit-archive), [11.6 update 2](https://developer.nvidia.com/cuda-toolkit-archive), [11.7 update 1](https://developer.nvidia.com/cuda-toolkit-archive), [11.8](https://developer.nvidia.com/cuda-toolkit-archive), [12.0 update 1](https://developer.nvidia.com/cuda-toolkit-archive), [12.1 update 1](https://developer.nvidia.com/cuda-toolkit-archive), [12.2 update 2](https://developer.nvidia.com/cuda-toolkit-archive), [12.3 update 2](https://developer.nvidia.com/cuda-toolkit-archive), or [12.4 update 1](https://developer.nvidia.com/cuda-toolkit-archive)
> - [cuDNN 8.9.7](https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-897/release-notes/index.html#rel-897) (Optional and not required for lean or dispatch runtime installations.)`



# 4:tensorRT install


https://docs.nvidia.com/deeplearning/tensorrt/support-matrix/index.html#platform-matrix

## 4-1: tensorRTのinstall

上の表とにらめっこして、10.0.1で行くことにする。


### 4-1-A: tarからのinstall

下記の基準に倣って書く。

https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-1001/quick-start-guide/index.html#install

下記のページから10.0.1のdebをダウンロード

https://developer.nvidia.com/tensorrt


```sh
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-10.0.1-cuda-12.4_1.0-1_amd64.deb 
sudo cp /var/nv-tensorrt-local-repo-ubuntu2204-10.0.1-cuda-12.4/nv-tensorrt-local-2C63AABB-keyring.gpg /usr/share/keyrings/
```


Full install c++/python modules

```sh
sudo apt-get update
# full install
sudo apt-get install tensorrt
```


### 4-1-B: network install

（項目だけ用意。未検証なので必要になったら追記する）


## 4-2: verify installation

```sh
$ dpkg-query -W tensorrt
tensorrt	10.0.1.6-1+cuda12.4
```

以下WIP

# 5: さらなる動作確認

## 5-1: Python/Pytorchでの動作確認

## 5-2: c++での動作確認