Ubuntu 16.04へのCUDAインストール方法

Ubuntu 16.04 に NVIDIA の CUDA のインストール方法です。私は主に Amazon EC2 の GPU インスタンスを使っているので、それ前提で書きます。Amazon EC2 の GPU インスタンス、g3, p2, p3 などで使えます。完全仮想化の hvm の方を使ってます。ストレージは20GB程度必要です。

なお記事の都合上、最新の CUDA および cuDNN をインストールしていますが、TensorFlow などの各種ライブラリを動作させるためには、タイミングによっては少し古いのをインストールしないと対応していない場合が多いです。

Ubuntu 18.04 へのインストール方法は https://qiita.com/yukoba/items/4733e8602fa4acabcc35 をご覧ください。

# 前準備
```
sudo apt update
sudo apt upgrade
```

# CUDA 9 のインストール
CUDA 7.5 はなかったのですが、CUDA 8.0 ～ 9.2 は Ubuntu 16.04 向けが https://developer.nvidia.com/cuda-downloads で配布されるようになりました。以下は、Installer Type で deb(network) を選択する場合の流れです。ここで apt install で cuda だと最新版がインストールされ、cuda-9-0 とか cuda-9-2 のようにバージョン指定も出来ます。CUDA 9.2 の deb ですが 9.0 や 9.1 もインストールできます。

```
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub

wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.88-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_9.2.88-1_amd64.deb
sudo apt update

sudo apt install cuda cuda-drivers
sudo reboot

rm cuda-repo-ubuntu1604_9.2.88-1_amd64.deb
```

その後、~/.bashrc の末尾にこれを追加する必要があります。

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

そして一度ログオフして再度ログインしてください。

nvidia-smi で動作確認です。cuBLAS など cuDNN 以外は一通りついてきます。

### Amazon EC2 での Linux カーネル
2016年の時点では Amazon EC2 の Ubuntu16.04 の AMI には linux-virtual というカーネルが入っていて、これだと GPU が動作しなく、カーネルを linux-generic に切り替える必要があったのですが、2017年3月29日より AWS 専用カーネルが導入され https://insights.ubuntu.com/2017/04/05/ubuntu-on-aws-gets-serious-performance-boost-with-aws-tuned-kernel/ これが AWS の GPU に対応しています。なので、現在は、カーネルは AWS 専用 Linux カーネルをそのまま使うのが最善になりました。

古いイメージを使っている人は、この方法で linux-generic から linux-aws に切り替えられます。

```
sudo apt install linux-aws
sudo reboot
sudo apt purge linux-generic
sudo apt autoremove
```

### デバイスドライバ
2017年10月9日現在、元々 Ubuntu 16.04 では nvidia-375 でデバイスドライバをインストールするのですが、NVIDIA 側が配布している cuda-drivers でインストールするとより新しいデバイスドライバ nvidia-384 がインストールされるのでこちらの方が良いと思います。上記の apt install では cuda-drivers を使っています。なお、nvidia-375 には https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-375/+bug/1662860 で報告されているシンボリックリンクに関するバグがあります。

### CUDA 8.0 の場合
CUDA 8.0 の場合ダウンロードアドレスが http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb になります。

# cuDNN 7.1 のインストール
cuDNN は NVIDIA のサイト https://developer.nvidia.com/rdp/cudnn-download からダウンロードできるのですが、ここでは NVIDIA の再配布用のアドレスからダウンロードします。もし、上記の NVIDIA のサイトからダウンロードする場合は、Download cuDNN v7.1.4 (May 16, 2018), for CUDA 9.2 の cuDNN v7.1.4 Library for Linux です。

```
wget http://developer.download.nvidia.com/compute/redist/cudnn/v7.1.4/cudnn-9.2-linux-x64-v7.1.tgz
tar xzf cudnn-9.2-linux-x64-v7.1.tgz
sudo cp -a cuda/lib64/* /usr/local/lib/
sudo cp -a cuda/include/* /usr/local/include/
sudo ldconfig

rm -R -f cuda cudnn-9.2-linux-x64-v7.1.tgz
```

シンボリックリンクがシンボリックリンクとしてコピーされるように cp には -a をつける必要があります。

cuDNN 4 ～ 7.1 あたりは全てダウンロードするファイル名が違うだけでインストール方法は同じです。例えば CUDA 9.0 の cuDNN 7.0.5 は http://developer.download.nvidia.com/compute/redist/cudnn/v7.0.5/cudnn-9.0-linux-x64-v7.tgz です。

# CUDA 7.5 のインストール
CUDA 8.0 がリリースされましたが 7.5 の方もここに残しておきます。7.5 は Ubuntu 16.04 のパッケージからインストールする必要があります。

```
sudo apt install nvidia-cuda-toolkit nvidia-384
sudo reboot
```
ただし、この方法は Ubuntu 16.04 である限り、ずっと CUDA 7.5 です。

### LightDM を止める
上記のやり方で nvidia-cuda-toolkit をインストールすると、ディスプレイマネージャーの LightDM が動いてしまいます。普通のパソコンでは動くべきですが、クラウドで動かしている場合は無意味です。しかも、Ubuntu 16.04 では、gst-plugin-scanner が1コア分 CPU 使用率 100% になるというバグが付いてきます。

止めるには、/etc/default/grub を編集して、12行目をこれにします。

```
GRUB_CMDLINE_LINUX="systemd.unit=multi-user.target"
```

保存して、

```
sudo update-grub
sudo reboot
```

# 後始末
```
sudo apt autoremove
sudo apt clean
```