Ubuntu20.10にnvidia-driverとCUDAを入れる


# はじめに
Nvidiaのドライバについてググっていると、やたらとハマる人を見かけるので私も備忘録としてメモ。
ついでにCUDAという単語もやたらと出てくるので、CUDAについて調べつつ、CUDA有りと無しの場合で比較する。

# 環境
Ubuntu 20.10 最小インストール
Karnel : 5.8.0-44-generic
CPU：Ryzen 5950x
GPU:Geforce RTX3060

# ゴール
1. Ubuntuで動く3Dベンチソフトでベンチマークを測定できる状態にする事
2. CUDA有りと無しで比較すること


# 現在のドライバ状態

Ubuntuが勝手に探してきてくれたやつをデフォルトのまま入れています。
ディアルディスプレイにディスプレイからUSB接続のスピーカー等、正常に動作しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/04cf4096-768b-efe4-d08c-850168a5445e.png)

```bash:DriversPackageList

sudo apt list --installed | grep nvidia

libnvidia-cfg1-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-common-460/groovy,groovy,now 460.56-0ubuntu0.20.10.1 all [インストール済み、自動]
libnvidia-compute-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-compute-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
libnvidia-decode-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-decode-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
libnvidia-encode-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-encode-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
libnvidia-extra-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-fbc1-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-fbc1-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
libnvidia-gl-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-gl-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
libnvidia-ifr1-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
libnvidia-ifr1-460/groovy,now 460.56-0ubuntu0.20.10.1 i386 [インストール済み、自動]
nvidia-compute-utils-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
nvidia-dkms-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
nvidia-driver-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み]
nvidia-kernel-common-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
nvidia-kernel-source-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
nvidia-prime/groovy-updates,groovy-updates,now 0.8.16~0.20.10.1 all [インストール済み、自動]
nvidia-settings/groovy-updates,groovy,now 460.39-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
nvidia-utils-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
xserver-xorg-video-nvidia-460/groovy,now 460.56-0ubuntu0.20.10.1 amd64 [インストール済み、自動]
```

# とりあえず3Dベンチマークを動かす
今のままで動いちゃいそうなので適当に探してきて動かしてみます。
Valley BenchmarkってやつがLinux対応しているようなのでそれを使ってみます。

公式HP
https://benchmark.unigine.com/valley

```bash:valleyインストーラーのダウンロードと実行
mkdir ~/tmp_valley
cd ~/tmp_valley/
wget https://assets.unigine.com/d/Unigine_Valley-1.0.run
chmod +x Unigine_Valley-1.0.run
./Unigine_Valley-1.0.run 
```
Unigine Valley Benchmark installation is completed.
と表示されたら成功です。
同一階層にUnigine_Valley-1.0/というフォルダができていると思います。
実行してみます。

```bash:valleyの実行
# カレントディレクトリをこいつにしないと動かない
cd Unigine_Valley-1.0/
./valley
```
無事立ち上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/b6be8949-eecb-2d95-baff-b98ed74a859e.png)

デフォルトのままRUNしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/ef1d7e87-2e7b-8522-f6ad-613fc41642b1.png)

無事動き切りました。

それにしても最近のゲームはキレイですね。（これゲーム？）
ゲーマーの皆様がハイエンドPCを使いたがるのもわかる気がします。
はじめてGPUのファン回ってんの見たわ。

何もしていないのにゴール①をクリアしちゃいました。
それではCUDAに進んで行きます。

# CUDAって何？
[wikipedia](https://ja.wikipedia.org/wiki/CUDA)より
>CUDA（Compute Unified Device Architecture：クーダ）とは、NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム（並列コンピューティングアーキテクチャ）およびプログラミングモデルである[5][6][7]。専用のC/C++コンパイラ (nvcc) やライブラリ (API) などが提供されている。なおNVIDIA製GPUにおいては、OpenCL/DirectComputeなどの類似APIコールは、すべて共通のGPGPUプラットフォームであるCUDAを経由することになる[8]。

うーんわからん。

>メリット
CUDAはNVIDIAが独自に開発を進めているGPGPU技術であり、NVIDIA製のハードウェア性能を最大限引き出せるように設計されている[32]。CUDAを利用することで、NVIDIA製GPUに新しく実装されたハードウェア機能をいち早く活用することができる。

NVIDIA製のGPU使っているなら入れたほうが幸せになれそう。

機械学習のパフォーマンスも上がるみたいだし(※)
対応ソフトウェアにAdobe Premiere があるのも◎

※Deep Learningのパフォーマンスを上げるにはcuDNNというライブラリも入れるらしい。今回は割愛

## CUDAのインストール
公式DLページ

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=debnetwork

ここでOSとインストール方法を選ぶとイントール用のコマンドが出てくる。


しかしちょっと待て。
このページから飛べる以下のlinuxのInstallガイドのページがあるから、良く読んで見る。

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html

### preinstall の項目に従い前準備していく（公式読む人はスキップ）

①GPUの確認の話

```bash:gpuの確認
lspci | grep -i nvidia
2d:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060] (rev a1)
2d:00.1 Audio device: NVIDIA Corporation Device 228e (rev a1)
```
いや、使ってるGPUが何かは知っとるわ。
表示されなかったらupdate-pciidsしろとの事。

で、このページでサポートされているか見ろとの事

https://developer.nvidia.com/cuda-gpus

いや・・・GeForce RTX 3060が無いんだけど。
2060はあるのに。
こりゃGPU選びしくったか？
本当は3070買おうとしてたんだけど、売ってないし、転売で価格おかしいし、ふらっと寄った店で3060置いてあったからこれでいっかーってなっちゃったんだよ。重たいゲームしないし。
それでも6万円だよ。
話それた。

どうすりゃいいのこれ？
とりあえず無視して入れてみることにします。

②ディストリビューションの確認
　64bitだけだよ〜とかいう話なのでSkip

③gccが入ってないとだめだよ〜って話

```bash:
gcc --version
gcc (Ubuntu 10.2.0-13ubuntu1) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

大丈夫。

④カーネルの話
cudaのインストーラーではカーネルのヘッダーと開発パッケージも必要とされていて、入っていない場合は自動でイントールするけど最新とっちゃうから実行中のカーネルと合わないかも。
手動で入れといた方がいいよ。とのこと。
やる。


```bash:カーネルのヘッダーのインストール
sudo apt install linux-headers-$(uname -r)
```

入ってたわ。

preinstallのこれ以降はどうインストールするかのお話なので割愛。

### cudaを入れる

[先程のDLページ](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=debnetwork
)から、対応するOSのversion等を選んで、出てきたコマンドを実行

```bash:deb(local)を選択
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda-repo-ubuntu2004-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-2-local_11.2.2-460.32.03-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-2-local/7fa2af80.pub
sudo apt update
sudo apt -y install cuda
```

### Post-installation Actionsの項目に従い、後処理
①パスを通す（必須）

```bash:
sudo su
touch /etc/profile.d/path.sh
echo "export PATH=/usr/local/cuda-11.2/bin\${PATH:+:\${PATH}}" >> /etc/profile.d/path.sh
echo "export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}" >> /etc/profile.d/path.sh
exit
source ~/.profile
```


②POWER9 Setup（必須）

```bash:ステータスを見る
systemctl status nvidia-persistenced
```

```bash:↑で動作していなかったら実行
sudo systemctl enable nvidia-persistenced
```

多分以上。

# ベンチの比較

ベンチを走らせてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/29c7e308-6e33-b9e9-da64-8f467f1e5024.png)

ちょっとだけ上がった？まぁ変わっているうちに入らん、誤差だと思います。

このソフトがCUDA対応しているか知らんし（調べてない）
CUDAのGPUリストにRTX3060無かったし。
（これ本当にサポートしてないんですかね？）

CUDAの効果の測定はGPU変えた時や対応ソフトでコレだってのが出てきたらやってみます。


# Steamとの衝突 (2021/3/23追記)

どうやらcudaの最新のパッケージリストでは32bitアプリケーションは動かないようです。
参考：https://forums.developer.nvidia.com/t/latest-cuda-driver-from-deb-repository-breaks-steam/70950/2

Steamは現在32bitアプリケーションですのでこんなエラーを吐いて落ちるようになります。

>Opted in to client beta 'publicbeta' via beta file
You are in the 'publicbeta' client beta.
SteamUpdateUI: An X Error occurred
X Error of failed request:  GLXBadContext
SteamUpdateUI: An X Error occurred
X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  151 (GLX)
Minor opcode of failed request:  3 (X_GLXCreateContext)
Value in failed request:  0x0
Serial number of failed request:  45
xerror_handler: X failed, continuing
Major opcode of failed request:  151 (GLX)
Minor opcode of failed request:  6 (X_GLXIsDirect)
Serial number of failed request:  46
xerror_handler: X failed, continuing

グラボのドライバが見つからなくてテンパってるようです。

~~解決策としては、cudaを消してnvidia-driverを入れ直すのが一番簡単だと思います。~~
~~cudaと共存させることができるならどなたか教えてほしいです。。。~~

2021/5/24追記
解決方法がわかりましたので記事にしました。

https://qiita.com/yakitatata/items/b2203f90defcad68bb9f