いつになっても研究室の計算機が使えないのでGCEを使う話 2

# 研究室の計算機が使えない
略

# インスタンスを立ち上げる
作成したマシンに対して```開始```を行う。
すると外部IPが動的に割り当てられるので(表示されなければページをリロードすれば良い)、これをを用いて、`ssh [username]@[外部IP]` でアクセスする。
~~[私は Docker Tools for Windows で Spacemacs を立ち上げ VcXsrv に X 表示、日本語入力を emacs-mozc 、フォントをNoto Serif CJK JPを用いてターミナル環境としている](https://qiita.com/MeguruMokke/items/28e696f5bb2ce2c30767)が、好みのものを用いればよいだろう。~~

# GPUの確認を行い、Dockerのインストールを行う
まず立ち上げたインスタンスにGPUが付与されているか否かを確認するため、開いたインスタンスに対して以下のコマンドを実行する。

```
~$ lspci | grep -i NVIDIA
# You can see a message contains ``NVIDIA Corporation''
```

NVIDIA Corporation などの表示が得られれば少なくともNVIDIA の 
GPU がそのインスタンスに含まれていることになる。この表示が得られなければインスタンスの設定をもう一度行わなければならない。

Docker のインストールは以下の手順を踏めば問題ないだろう。

### Docker のインストール(ubuntu)
```
~$ sudo apt-get update
~$ sudo apt-get upgrade
~$ sudo apt-get install \
 apt-transport-https \
 ca-certificates \
 curl \
 gnupg-agent \
 software-properties-common 
~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
~$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
~$ sudo apt-get update
~$ sudo apt-get install docker-ce docker-ce-cli containerd.io
~$ sudo gpasswd -a [user-name] docker
# Add you into docker group. You will be able to use docker without root permission
~$ sudo systemctl restart docker
~$ exit
```

再びログインする。

```
~$ docker version
~$ docker run hello-world
# You can see a message like "Hello from Docker!"
```

これで ``Hello from Docker!'' のようなメッセージが表示されればDockerのインストールが正しく行われたことになる。
できない場合は、[Dockerの公式インストールガイド](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-using-the-repository) を参照して頂きたい。



次に nvidia-docker のインストールを行う。
### nvidia-docker のインストール (ubuntu)

まず先に cuda の環境を構築する。ここでインストールする cuda のバージョンは実行したい機械学習フレームワークなどとは関係がないため、おおよそ[NVIDIA の公式](https://developer.nvidia.com/cuda-downloads)から最新のものをインストールすればよいだろう。

```
~$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.105-1_amd64.deb
# Please install the latest package for your OS.
~$ sudo dpkg -i cuda-repo-ubuntu1804_10.1.105-1_amd64.deb
~$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
~$ sudo apt-get update
~$ sudo apt-get install cuda
```

cuda の環境構築が終わったならば、次に nvidia-docker (今回扱うのは ver. 2 である) をインストールする。こちらが上手くいかない場合には、[nvidia-docker のレポジトリ](https://github.com/NVIDIA/nvidia-docker) を参照して頂きたい。

```
~$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
 sudo apt-key add -
 distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
~$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
 sudo tee /etc/apt/sources.list.d/nvidia-docker.list
~$ sudo apt-get update
~$ sudo apt-get install -y nvidia-docker2
~$ sudo pkill -SIGHUP dockerd
```
### nvidia-docker が適切にインストールされているかを確認する。

nvidia-docker のインストールが終わったところで、これを確認するために [tensorflow の公式が公開している docker インスタンス](https://www.tensorflow.org/install/docker) を立ち上げ GPU を用いた計算を試してみる。(2019/03/13 時点で latest-gpu-py3 は Session クラスや enable_eager_execution メソッドが正しく機能しなかった。暫くすれば修正されるだろうが、万が一同様の不具合があれば、バージョンを指定するか、nightly をインストールすると良いだろう。)

```
~$ docker pull tensorflow/tensorflow:latest-gpu-py3
~$ docker run -it --rm --runtime=nvidia -u $(id -u):$(id -g) tensorflow/tensorflow:nightly-gpu-py3 bash
tf-docker /> python
>>> import tensorflow as tf
>>> a = tf.constant(1)
>>> b = tf.constant(2)
>>> c = tf.add(a, b)
>>> sess = tf.Session()
>>> print(sess.run(c))
;; 3
>>> exit()
tf-docker /> python
>>> import tensorflow as tf
>>> tf.enable_eager_execution()
>>> a = tf.constant(1)
>>> b = tf.constant(2)
>>> c = tf.add(a, b)
>>> c
;; <tf.Tensor: id=2, shape=(), dtype=int32, numpy=3>
>>> exit()
tf-docker /> exit
~$ docker rm $(docker ps -aq) 
# Delete all docker instances
~$ docker rmi tensorflow/tensorflow:nightly-gpu-py3
# Delete the docker image
```

(恐らくdocker run の時点でGPUが認識できていなければ、それ以下の内容はすべて実行できないと考えられるため Tensorflow 側で GPU が動いているかどうかの判断基準は明記していないが、例えば ``Sess.run(c)`` 実行時に表示されるログから GPU が使われているか否かは容易にわかるだろう。)
これでおおよそすべての動作ができたことが確認できたはずだ。

# **使い終わったらそのインスタンスを停止することを忘れてはならない**

# 目次
[いつになっても研究室の計算機が使えないのでGCEを使う話 1](https://qiita.com/MeguruMokke/items/de3c0665ec2fb5ba2110)
[いつになっても研究室の計算機が使えないのでGCEを使う話 2](https://qiita.com/MeguruMokke/items/8fc275e7c41267a12b74)