UbutnuでTensorflowやChainerでのGPU機械学習環境の簡単な構築方法

# UbutnuでTensorflowやChainerでのGPU機械学習環境の簡単な構築方法

機械学習をさせようと思ったらGPU計算がなければ厳しいと思います。
しかし、GPU計算が可能な環境を構築するには手間がかかります。
tensorflowやchainerだと以下の手順が必要です。

1. Nvidiaドライバのインストール
2. cudaのインストール
3. cudnnのインストール

これらに加えて、cudaやcudnnのバージョンに合わせた機械学習フレームワークをインストールする必要があります。  
ですが、cudaは一つのOSで複数バージョンの共存ができないのでフレームワークのバージョンを気軽に変更することができません。

しかし、[こちらのサイトから](https://www.anaconda.com/tensorflow-in-anaconda/)確認できると思いますが、condaコマンド一つだけで機械学習フレームワークに対応するcudaやcudnnが一緒にインストールすることができようになりました。

ここではMinicondaのインストールと合わせて、condaコマンドで仮想環境上に機械学習のGPU環境を構築する方法について説明します。

## 環境

Ubuntu16.04 LTS

## Miniconda3のインストール

condaコマンドを使うにはAnacondaかMinicondaをインストールする必要があります。
ここではデータの軽いMinicondaを選択します。以下のURLからダウンロードしてください  
https://docs.conda.io/en/latest/miniconda.html

ダウンロードしたらbashコマンドでインストールしてください。

```
bash Miniconda3-latest-Linux-x86_64.sh
```

ライセンスについての説明がしばらく続いたのち、承認するかどうかのメッセージが表示されるのでyesを選択

```
Do you accept the license terms? [yes|no]
[no] >>>
Please answer 'yes' or 'no':'
```

進めるとminiconda3の置き場所を聞かれます。こだわりがなければここはENTERで進めます。

```
>>> yes

Miniconda3 will now be installed into this location:
/home/vagrant/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/vagrant/miniconda3] >>>
```

conda initをするかどうか聞かれます。yesを入力するとconda initが実行されます。
conda initを行うとminiconda3のPATHが優先されるようになり、UbuntuデフォルトのPythonが使うのが面倒になります。  

```
PREFIX=/home/vagrant/miniconda3
installing: python-3.7.3-h0371630_0 ...
Python 3.7.3
installing: ca-certificates-2019.1.23-0 ...
installing: libgcc-ng-8.2.0-hdf63c60_1 ...
 :
 :
 :
installing: conda-4.6.14-py37_0 ...
installation finished.
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>>
```

ここではそのままENTERで進めました。

```
Thank you for installing Miniconda3!
```

これでインストール完了です。

## condaコマンドのPATHを通す

Minicondaのcondaコマンドにのみ興味がある場合は.bashrcに以下のようなスクリプトを追加します。
$PATHを前に持ってくることでUbuntu標準のPythonが優先されます。

```bash:.bashrc
export PATH=$PATH:~/miniconda3/bin
```

PATHの確認をします。PATHが通っていることが確認できます。

```
$ echo $PATH
/home/vagrant/bin:/home/vagrant/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vagrant/miniconda3/bin
```

condaを使えるか確認します。

```
$ conda -V
conda 4.6.14
```

使えるようです。

## Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no] で yes を選択した場合

ちなみにyesを入力すると.bashrcファイルに以下のスクリプトが追加されます。

```sh:.bashrc
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/vagrant/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/home/vagrant/miniconda3/etc/profile.d/conda.sh" ]; then
        . "/home/vagrant/miniconda3/etc/profile.d/conda.sh"
    else
        export PATH="/home/vagrant/miniconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
```

そうすると以下のようにMinicondaのpythonが優先されるようになるので、Ubuntu標準のPythonを使うのが面倒になります。

```
(base) vagrant@main:~$ python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```


## tensorflowとchainerのGPU環境を構築

初めにcondaコマンドで仮想環境を構築

```
conda create -n [env name] python=[version] anaconda
```

仮想環境上でconda installを実行

```
$ conda install tensorflow-gpu
Collecting package metadata: done
Solving environment: done

## Package Plan ##

  environment location: /home/vagrant/miniconda3

  added / updated specs:
    - tensorflow-gpu


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _tflow_select-2.1.0        |              gpu           2 KB
                            :
                            :
    cudatoolkit-10.0.130       |                0       380.0 MB
    cudnn-7.3.1                |       cuda10.0_0       385.1 MB
                            :
                            :
    tensorboard-1.13.1         |   py37hf484d3e_0         3.3 MB
    tensorflow-1.13.1          |gpu_py37hc158e3b_0           4 KB
    tensorflow-base-1.13.1     |gpu_py37h8d69cac_0       293.5 MB
    tensorflow-estimator-1.13.0|             py_0         205 KB
    tensorflow-gpu-1.13.1      |       h0d30ee6_0           2 KB
                            :
                            :
    ------------------------------------------------------------
                                           Total:        1.28 GB

The following NEW packages will be INSTALLED:

  _tflow_select      pkgs/main/linux-64::_tflow_select-2.1.0-gpu
                            :
                            :
  cudatoolkit        pkgs/main/linux-64::cudatoolkit-10.0.130-0
  cudnn              pkgs/main/linux-64::cudnn-7.3.1-cuda10.0_0
                            :
                            :
  tensorboard        pkgs/main/linux-64::tensorboard-1.13.1-py37hf484d3e_0
  tensorflow         pkgs/main/linux-64::tensorflow-1.13.1-gpu_py37hc158e3b_0
  tensorflow-base    pkgs/main/linux-64::tensorflow-base-1.13.1-gpu_py37h8d69cac_0
  tensorflow-estima~ pkgs/main/noarch::tensorflow-estimator-1.13.0-py_0
  tensorflow-gpu     pkgs/main/linux-64::tensorflow-gpu-1.13.1-h0d30ee6_0
                            :
                            :

Proceed ([y]/n)?
```

cudatoolkit と cudnn がインストール可能であることが確認できます。

chainerに必要なcupyでも確認します。

```
$ conda install cupy
Collecting package metadata: done
Solving environment: done

## Package Plan ##

  environment location: /home/vagrant/miniconda3

  added / updated specs:
    - cupy


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    blas-1.0                   |              mkl           6 KB
    cudatoolkit-10.0.130       |                0       380.0 MB
    cudnn-7.3.1                |       cuda10.0_0       385.1 MB
    cupy-5.1.0                 |   py37hc0ce245_0        12.8 MB
                            :
                            :
    ------------------------------------------------------------
                                           Total:       996.7 MB

The following NEW packages will be INSTALLED:

  blas               pkgs/main/linux-64::blas-1.0-mkl
  cudatoolkit        pkgs/main/linux-64::cudatoolkit-10.0.130-0
  cudnn              pkgs/main/linux-64::cudnn-7.3.1-cuda10.0_0
  cupy               pkgs/main/linux-64::cupy-5.1.0-py37hc0ce245_0
                            :
                            :

Proceed ([y]/n)?
```

cudatoolkit と cudnn がインストール可能であることが確認できました。