分かりやすい方法でDeep learning環境構築（Ubuntu、NVIDIAドライバ、CUDA、cuDNN）

この記事では、Linuxの初心者向けに、**できるだけCUIコマンドを使わない分かりやすい方法で**deep learning環境構築方法を紹介します。
最近ではAWSのような外部のサーバーを利用する方法もありますが、従量制でお金がかかりますし、自分のPCでできた方が何かと便利です。
WindowsでもDeep Learningをすることができますが、開発されたソフトによってはWindowsではうまく動かないことがあります。それはそもそもDeep Learning開発のほとんどがUbuntuでされているからです。
また、WSLやVirtualBoxなどもありますがGPUは使えないと聞きます。となるとOSをUbuntuに入れ替えてしまうのがよいです。
Deep LearningをするにあたってGPUがあるととても快適になります（時間的にも数十倍速くなる印象）。しかし、GPUを使う環境の構築(NNVIDIAドライバ、CUDA、cuDNN)が初心者には分かりずらいことが多いです。

私は今まで実際に数台のPCでUbuntuのDeep Learning環境構築を経験したので、それをもとに方法をまとめています。GPU付きのPCが手元にあるという前提で進めます。
# Ubuntu OSのインストール
まずはOSを入れ替えるので、バックアップをしましょう。バックアップはCドライブ(OSを入れる方のドライブ)のみすればよく、Dドライブはそのまま認識して使えました。大事なデータはDドライブに映しておきましょう。
##1.USBにUbuntuインストールメディアを入れる
ここは他のサイトなどでもよく紹介されているので省きます。
インストールサイトからisoファイルをダウンロードして、LiveCDとしてUSBに書き込みましょう。
USBではなくDVDに入れることもできますが、DVDでは光学ドライブのあるPCにしかインストールできないので不便です。
Ubuntuは16または18がお勧めです。
## 2.BIOSを設定してUSBをブートする
BIOSは、マザーボードに入っているOSを起動する前提のプログラムです。
PCの電源を入れた後すぐに、F2キーまたはDelキーを連打すると起動します。
BIOS設定のポイントは4つです。
###1. UEFIではなく旧BIOSにする
UEFIはwindowsで使われる最近のBIOSですが、それだとうまくいかないことがありました。
旧BIOS（Legacy BIOS）に切り替える項目があるのでそれで変更しましょう。
###2. セキュアブートをオフにする
セキュアブートは不正なOSがブートするのを防ぐものですが、Windows以外がブートしづらい状態になります。
その状態ではUbuntuやNVIDIAドライバが起動できないので無効にしましょう。
###3. Intel Multi Displayをオンにする
GPUがついているPCでは、マザーボードから出る出力端子は使えないように設定されています。GPUの端子を使用した方がきれいなグラフィックを使用できるからです。
しかし、ゲームではなくDeep Learningをする場合には、グラフィックのきれいさは重要ではないですし、むしろGPUはDeep Learnig計算に専念させた方が安定すると思います。
PCにもよりますが、BIOSのIntel Multi Displayの項目をオンにすればマザーボードの出力端子が使えるようになります。
###4. Boot priorityでUSBを最上位にする
Boot priorityではBootする優先順位を決めています。USBを最上位に設定しましょう。
Ubuntuを入れたUSBをPCにさしていれば、USBが項目として出てくるはずです。

## Ubuntuインストール
そのあとはBIOS設定をセーブして再起動すれば、Ubuntuのインストーラーが起動するはずです。
インストーラーの指示に従って設定を進めます。
ソフトウェアアップデートやサードパーティ製ソフトウェアのインストールはした方がよいと思います。
WindowsとUbuntuのデュアルブートは、不具合が出た話を聞くのでお勧めしません。

# Ubuntuの起動とNVIDIAドライバのインストール
インストールした後はPCの電源を入れればUbuntuが起動するはずです。
Ubuntuの16.04では、場合によってはlow graphic modeでうまく起動できないという表示が出ることが発生します。
この場合の対処法はいくつかあるようですが、私の場合は代わりにUbuntuの18.04をインストールして対処しました。
## NVIDIAドライバのインストール
NVIDIAドライバがインストールされているかの確認は、端末で以下のコマンドを入力して行うことができます。

```
nvidia-smi
```

GPUの情報が出てこない場合は、NVIDIAドライバのインストールをしましょう。
NVIDIAドライバのインストールのインストール方法はいくつかありますが、簡単なものを紹介します。
AまたはBのどちらかをやりましょう。

### A:ソフトウェアとアップデートのGUIから
設定を開き、「ソフトウェアとアップデート」から「追加のドライバー」を選択します。そこでNVIDIA binary driverがあればそれにチェックを入れて「変更の適用」をします。これだけでインストールできました。
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521288/3be56b73-11e8-0005-66e1-3784b30b4ce4.png)

### B:ppaレポジトリを足してインストール
PPA(パーソナル・パッケージ・アーカイブ)はソフトウェアがまとまったレポジトリです。
GPU Driversが入っているレポジトリを追加で登録します。
端末を開いて以下のコマンドを打ちます(390はドライバーのバージョンのため適宜変更する)

```
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt-get install nvidia-390
```

これでもインストールされるはずです。

# CUDAのインストール
CUDAはNVIDIAのGPUを一般計算にも用いるためのソフトウェアです。NVIDIAのホームページから無料でインストールすることができます。(https://developer.nvidia.com/cuda-toolkit-archive)
バージョンが8、9、9.2、10、10.2などあります。新しい方がよいように思いますが、新しすぎると、Deep Learningのソフトウェアが対応していない場合があります。
tensorflowやPytorchやそれらから開発されたコードなど、使いたいDeep Learningソフトウェアが対応しているCUDAのバージョンを確認しましょう。複数のバージョンのCUDAが必要な場合はそれらをすべてインストールして、使い分けて使用することもできます。
私はrunfileをダウンロードして以下のコマンドでインストールしました。

```
cd ~/ダウンロード
sh cuda_<ここはバージョンによって違う>_linux.run
```

上のコマンドを実行すると、コマンドでいくつが質問が出ますが、
利用規約でaccept
ドライバーのインストールでno
CUDA toolkitのインストールでyes
インストールする場所の指定はデフォルト
シンボリックリンク作成はno
CUDAサンプルはno
でインストールしました。

インストールした後はCUDAを環境変数パスに通す必要があります。
ファイルエクスプローラーを起動してホームフォルダに移動し、[Ctrl + h]を押すと隠しファイルが表示されます。
そこで「.bashrc」ファイルがあるのでそれを編集します。
最初の方に以下のコマンドを追加しましょう。(8.0はバージョン)

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

.bashrcはシェルが起動するたびに読み込まれて実行されるファイルです。


# cuDNNのインストール
cuDNNはCUDA上でDeep Learningするためのライブラリです。これもNVIDIAのホームページからダウンロードできますが、ユーザー登録が必要になります。cuDNNはCUDAのバージョンによって異なるので適切なものを選びましょう。(https://developer.nvidia.com/cudnn)
私はRuntime Libraryのみをダウンロードしました。
ダブルクリックすることでインストールすることもできますが、端末で以下のコマンドを打つことでもインストールできます。

```
sudo apt install libcudnn<バージョンによる>+cuda<バージョン>_amd64.deb
```

debファイルはapt installでインストールできます。

# 終わりに
これでUbuntuのdeep learning環境構築ができるはずです。
後はAnacondaなどをインストールしてPythonでDeep Learningのパッケージを入れましょう。
もちろんUbuntuはRやMATLABもインストールすることができます。
またCUDAの違うバージョンを使い分ける方法は[別記事](https://qiita.com/takeajioka/items/8737fab5cffbe0118fea)にします。