Ubuntu 18.04.3 LTS に Tensorflow と Keras をインストールする

こんにちは、chlochanです。いままでは、GCP の Deep Learning VM で勉強していましたが、Ubuntu に移行する事にしましたので、CUDAなど必要なライブラリを自分でインストールし、環境を作ります。

## インストールの概要
今回は、

- GCP で、Ubuntu 18.04.1 LTS の VM の作成
- 必要なライブラリのインストール
- CUDA 10.0 のインストール
- CUDA の環境変数の設定
- Tensorflow のインストール
- Keras のインストール
- jupyter lab のインストールと設定
- サンプルコードのダウンロードと実行
- サンプルコード実行中の GPU の utilization を確認
- Ubuntu MATE と vncserver のインストール
- [nvidia-docker2 で CUDA9.0 の環境を作る]
(https://qiita.com/chlochan/items/53e31475b15fee921f3b)

<!-- コメントアウトしたい内容 -->
<!-- 
- [Tcp SSH Forwarding](https://qiita.com/chlochan/items/b5911a841d8fd8d487dd)
- [R/RStudio のインストール](https://qiita.com/chlochan/items/963cdf1fc7378d02a83d)
- [Qt5 のインストール](https://qiita.com/chlochan/items/53f1276522d03f460a81)
-->

を行います。

## Ubuntu 18.04.3 LTS のインストール
GCPに以下の様に Ubuntu 18.04 LTS の OSイメージが用意されていたのでこれを使ってVMをデプロイします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/307576/37f836e2-32a9-0e24-6462-525f87f3c10e.png)
インストールしてバージョンを確認します。

```bash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
... 以下略 ...
```
ちゃんと最新版の Bionic Beaver になっています。

## 必要なライブラリのインストール

必要なソフトウェアやライブラリをインストールします。python3 しか使わないので、python3 系でインストールします。"-y" をつけているのは、何度もやっているうちに Y とか エンターキー を押すのが面倒くさくなってきたためです。

~~~bash
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install python3-pip python3-dev -y
$ sudo apt-get install build-essential cmake git unzip pkg-config -y
$ sudo apt-get install libopenblas-dev liblapack-dev -y
$ sudo apt-get install libhdf5-serial-dev python-h5py -y
$ sudo apt-get install python3-numpy -y
$ sudo apt-get install python3-scipy -y
$ sudo apt-get install python3-matplotlib -y
$ sudo apt-get install ipython3 -y
$ sudo apt-get install graphviz -y
$ sudo apt-get install python-opencv -y
$ sudo pip3 install opencv-python
$ sudo pip3 install pydot-ng
~~~

## CUDA10をインストールする
現時点(2019/12/12)の最新版の CUDA をインストールします。 CUDA10では、"install cuda" ですべてがインストールされます。

```bash
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute\
/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/\
x86_64/cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.2.89-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda -y
```
CUDA10に対応した、cuDNN の現時点(2019/12/12)の最新版もインストールします。

```bash
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/\
machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
$ wget https://developer.download.nvidia.com/compute/machine-learning/repos/\
ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo dpkg -i nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install libcudnn7-dev=7.6.5.32-1+cuda10.2 -y
$ sudo apt-get install libnccl2=2.5.6-1+cuda10.2 -y
$ sudo apt-get install libnccl-dev=2.5.6-1+cuda10.2 -y
```

## CUDAの環境変数の設定
RStudioなどのデスクトップアプリをインストールした時の事も考慮し、.bashrc ではなく、.profile に設定します。( bash からしか実行しないのであれば .bashrc だけ変更すればOKです。)

```:.profile
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${CUDA_HOME}/lib64
PATH=${CUDA_HOME}/bin:${PATH}
export PATH
```
.profileを変更した場合は、変更後、一回再起動します。

```bash
$ sudo reboot
```

再起動後、cudaのバージョンを確認します。

```bash
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89
```
V10.2.89 になっている事を確認します。

## Tensorflow のインストール
自分はpython3系のみインストールするので以下のコマンドになります。

```bash
$ sudo pip3 install tensorflow-gpu==2.0.0b1
```
## Keras のインストール
自分はpython3系のみインストールするので以下のコマンドになります。

```bash
$ sudo pip3 install keras
```
## jupyter lab のインストール
jupyter lab をインストールします。

```bash
$ sudo apt-get install jupyter-notebook -y
$ sudo pip3 install jupyterlab
$ sudo jupyter serverextension enable --py jupyterlab --sys-prefix
$ jupyter notebook --generate-config
$ sed -i -e "s/#c.NotebookApp.ip = 'localhost'/c.NotebookApp.ip = '0.0.0.0'/g"\
 .jupyter/jupyter_notebook_config.py
```
最後の sed コマンドで、.jupyter/jupyter_notebook_config.py の中の c.NotebookApp.ip を、'0.0.0.0' に書き換え、先頭の#を削除し有効にしています。つまり、下記の様に変更しています。ネットで検索すると、'0.0.0.0' ではなく '*' にしている例を見かけますが、自分の環境では、'0.0.0.0' にしないと接続できませんでした。

```:~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '0.0.0.0'
```
## サンプルコードを実行してみる
ここまでくれば python と jupyter lab で Deep Learning の勉強を開始できる状態になっています。教科書は以下になります。
[PythonとKerasによるディープラーニング](https://book.mynavi.jp/ec/products/detail/id=90124 "PythonとKerasによるディープラーニング")
GitHub から上記の教科書のサンプルコードをダウンロードして実行してみます。

```bash
$ git clone https://github.com/fchollet/deep-learning-with-python-notebooks.git
```
GCP のファイアウォール設定で、jupyter が使うポート8888を開けます。なお 8888 はウェルノウンポートで常に攻撃を受け危ないので、GCP のファイアウォール設定で接続できるIPアドレスを自分のPCのみにしています。
そして、jupyter lab を起動します。

```bash
$ jupyter lab
```
起動後以下の様な数字とアルファベットの羅列が入った http アドレスが表示されるので、コピペして xxx.xx.xx.xxx のところにVMの外部IPアドレスを入れて、webブラウザで開きます。

```
http://xxx.xx.xx.xxx:8888/?token=...数字とアルファベットの羅列...
```

## GPU の utilization を確認する
サンプルコード実行中に、GPU の utilization を確認するには、別ウインドウを開いて以下を実行します。以下の例では1秒毎に表示が更新されます。

```bash
$ watch -n 1 nvidia-smi -a --display=utilization
```
## Ubuntu MATE と vncserver をインストールする
GCP のファイアウォール設定でポート5901を開けます。なお 5901 もウェルノウンポートで常に攻撃を受け危ないので、GCP のファイアウォール設定で接続できるIPアドレスを自分のPCのみにしています。
そして、MATE と vncserver をインストールします。

```bash
$ sudo apt-get update
$ sudo apt-get install ubuntu-mate-desktop -y
$ sudo apt-get install vnc4server -y
```
必要なら kde もインストールします。

```bash
$ sudo apt-get install kubuntu-desktop -y
```

vncのパスワードを設定します。

```bash
$ vncpasswd 
```
~/.vnc/xstartup　を作って以下を記載します。

```:~/.vnc/xstartup
#!/bin/bash
# 
unset DBUS_SESSION_BUS_ADDRESS
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
exec /usr/bin/mate-session &
export XDG_DATA_DIRS=/usr/share/mate:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_SESSION_DESKTOP=mate
export XDG_CONFIG_DIRS=/etc/xdg/xdg-mate:/etc/xdg
```
~/.vnc/xstartup　に実行属性を与えます。

```bash
$ chmod +x ~/.vnc/xstartup
```
vncserverを起動します。

```bash
$ vncserver :1
```
ウインドウの大きさをディフォルトから変更したい場合は以下の様に大きさを指定します。

```bash
$ vncserver :1 -geometry 2460x1340
```
以上で vncserver が起動していますので、クライアント側から接続します。
vncserverを停止する場合は以下を実行します。

```bash
$ vncserver -kill :1 
```
## nvidia-docker2 で CUDA9.0 の環境を作る
以下に従って nvidia-docker2 で CUDA9.0 の環境を作ります。
[nvidia-docker2 で CUDA9.0 の環境を作る](https://qiita.com/chlochan/items/53e31475b15fee921f3b)


以上です。