Linuxで任意のCUDA環境を構築するときの予備知識の備忘録、トラブルシュート

# 事前知識

CUDA環境を作るときには必要なものの組み合わせが重要になってくる。
例えばCuPyを動かす際に必要になるのは

- CuPy
- CUDA Toolkit(SDK, ツール群) 
- CUDA
- Nvidia Driver

で、これらのソフトウェア間のバージョンの互換性があっていないといけない。
CuPy, cuDNN, cuBLASなどはCUDA Toolkitと、
CUDA ToolkitはCUDAと
CUDAはNvidia Driverとの互換性が重要になる。

# Nvidia Driverのインストール
まずはNvidia Driverをインストールする。
これはGPUの種類によってある程度上のバージョンからしかインストールすることができない。
セキュアブートを切ってインストールする方法が一番簡単。
セキュアブートを切ってインストールするのはボチボチ大変、アップデートが怖い。
手順は今回は割愛。

## 確認
![スクリーンショット 2020-09-21 12.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/61ddb47d-b4d2-a89c-29ce-a474ab8bd260.png)
インストール後に`nvidia-smi`コマンドでDriverのVersionを確認。

##### トラブルシュート
`Failed to initialize NVML: Driver/library version mismatch`
と出る場合とりあえず再起動してみる。再起動してダメならGPUとDriverの相性やその他の問題の可能性も。

![スクリーンショット 2020-09-21 12.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/4d0e80cc-edcf-1f60-f374-7b5b06d18398.png)
正常にインストールできているとGPUの情報などが見られるコンソールが出てくる`Driver Version: 450.51.06` がドライバのバージョン。

# CUDA, CUDA Toolkitのインストール
Nvidiaドライバーがちゃんと動作していれば、最大の難関は突破したと言ってよい。
Dockerをつかって任意の環境を作ることが可能。

Python2で使えるバージョンのCuPyはCUDA 10.1までにしか対応していないので、現時点最新の11ではなく任意のバージョン、今回はv10.1をインストールしてみる。NvidiaのCUDA Toolkitのインストール手順を解説するページの説明に従ってCUDAをインストールするとCUDA, CUDA Toolkit, cuBLASなどのCUDAを使ったライブラリがいくつかインストールされる。

https://developer.nvidia.com/cuda-downloads?target_os=Linux
![スクリーンショット 2020-09-21 12.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/d91af4a9-d7e8-3dce-e509-5cd59ed7b23a.png)
今回は最新バージョンをインストールしないのでLegacy Releasesを選ぶ。

![スクリーンショット 2020-09-21 12.14.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/51bf88a4-e853-fcdc-dc68-761c7cb67bbf.png)
CUDA Toolkit10.1を選ぶ。

![スクリーンショット 2020-09-21 12.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/01bab256-d739-9066-77a3-faa0791e73fb.png)
任意の環境を選ぶとインストール手順が表示される。今回はUbuntu18.04を使用。

##### ポイント
最後の`sudo apt-get -y install cuda`のみ`sudo apt install cuda-10-1`と明示的にバージョンを指定したパッケージをインストールしたほうが良い。

##### トラブルシュート
![スクリーンショット 2020-09-21 12.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/8ac66b0d-c3b5-214d-9cb8-40d8eb43ec16.png)

```
dpkg: アーカイブ /tmp/apt-dpkg-install-T6Cu3b/25-libcublas-dev_10.2.2.89-1_amd64.deb の処理中にエラーが発生しました (--unpack):
 '/usr/include/nvblas.h' を上書きしようとしています。これはパッケージ nvidia-cuda-dev 9.1.85-3ubuntu1 にも存在します
dpkg-deb: エラー: ペースト subprocess was killed by signal (Broken pipe)
```

別記事で環境構築に失敗するなどして、きれいにインストールができていない場合、別バージョンとバッティングすることがある。当該パッケージや、`sudo apt uninstall cuda`, 当該バージョンを`sudo apt uninstall cuda-9-1`などで削除してみる。バッティングが解消されればインストール可能。

## 確認
![スクリーンショット 2020-09-21 12.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/a95f8872-ee55-82c2-076a-fb5f4f691f62.png)
`nvcc -V`でPATHが通っているCUDA Toolkitのバージョンを確認することができる。別記事で環境構築に失敗するなどして、きれいにインストールができていない場合、別のバージョンのCUDA Toolkitが表示されたりする。

#### トラブルシュート
![スクリーンショット 2020-09-21 12.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40630/f759abc5-6acf-8cf2-d07c-7b8d8cbf501d.png)
Ubuntuの場合は/usr/localにインストールしたCUDAのディレクトリがある。

`.bashrc`

```
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib:$LD_LIBRARY_PATH"
export LIBRARY_PATH="/usr/local/cuda-10.1/include:$LIBRARY_PATH"
```

`source ~/.bashrc`
当該バージョンのインストールディレクトリを環境変数に追加するとちゃんと指定したCUDAバージョンを利用することができる。

# CuPyのインストール
Python2ではCuPyの10.1までが利用できます。こちらも明示的にインストール。
`pip install cupy-cuda101`
正常に利用できない場合はライブラリが正常に読み込まれていない場合が多いので、前項を確認してみる。CuPyを自前でビルドしているなどで利用が省かれていなければCuPyを再インストールする必要はないはず。

これでCuPyが動作すると思われる。