Docker+anaconda上でtensorflowを動かしてみる

#はじめに
新しくPCを購入したのでDockerを使用してpythonの環境構築してCNNを動かしてみました。
Dockerはほぼ初心者なのでこれを機に勉強していこうと思います。
<br>
今回の流れとしては
1．Docker上で公式のanaconda3イメージを取得する
2．anaconda3イメージを基にコンテナを作成
3．anaconda3にtensorflowを導入する
4．JupyterNoteookをブラウザから開く
5．Dockerのメモリを増やす
6．tensorflowを使用してCNNを構築する
となっています。

#環境


* MacOS Catalina version 10.15.5

* Docker version 19.03.8

#1．Docker上で公式のanaconda3イメージを取得する
anacondaとは、データサイエンスをする方には必須なパッケージが一通り揃っているオープンソースのプラットフォームです。
こちらは公式からanaconda3のイメージがあるのでありがたく使っていきます。

[https://hub.docker.com/r/continuumio/anaconda3/](https://hub.docker.com/r/continuumio/anaconda3/)

それでは、Dockerを起動してAnaconda3のイメージを取得します。

```
％ docker pull continuumio/anaconda3

Using default tag: latest
latest: Pulling from continuumio/anaconda3
68ced04f60ab: Pull complete
57047f2400d7: Pull complete
8b26dd278326: Pull complete
Digest: sha256:6502693fd278ba962af34c756ed9a9f0c3b6236a62f1e1fecb41f60c3f536d3c
Status: Downloaded newer image for continuumio/anaconda3:latest
docker.io/continuumio/anaconda3:latest

```

`pull`はDockerイメージを取得するコマンドです。

#2．anaconda3イメージを基にコンテナを作成
次にコンテナを作成していきます。

```
% docker run --name anaconda -it -p 8888:8888 -v /Users/xxxx/docker/anaconda:/home continuumio/anaconda3 /bin/bash
(base) root@xxxx:/# conda list
```

各コマンド、オプションの意味は以下です。

* `run` : コンテナを生成します。

* `--name [名前]` : コンテナの名前を設定します。

* `-it` : コンテナ内を操作できます。

* `-p [ホスト側のポート番号:コンテナのポート番号]` : コンテナのポートをホスト側にバインドします。

* `-v [ホスト側のディレクトリ:コンテナ側のディレクトリ]` : ホスト側のディレクトリをコンテナ内に
  マウントします。
<br>

#3．anaconda3にtensorflowを導入する
anaconda３に事前からインストールされているパッケージを確認してみます。
<br>

```
base) root@xxxx:/# conda list
# packages in environment at /opt/conda:
#
# Name                    Version                   Build  Channel
_ipyw_jlab_nb_ext_conf    0.1.0                    py37_0  
_libgcc_mutex             0.1                        main  
alabaster                 0.7.12                   py37_0  
anaconda                  2020.02                  py37_0  
anaconda-client           1.7.2                    py37_0  
anaconda-navigator        1.9.12                   py37_0  
anaconda-project          0.8.4                      py_0  
argh                      0.26.2                   py37_0  
asn1crypto                1.3.0                    py37_0  
astroid                   2.3.3                    py37_0  
astropy                   4.0              py37h7b6447c_0  
atomicwrites              1.3.0                    py37_1  
attrs                     19.3.0                     py_0  
.
.
.
yaml                      0.1.7                had09818_2  
yapf                      0.28.0                     py_0  
zeromq                    4.3.1                he6710b0_3  
zict                      1.0.0                      py_0  
zipp                      2.2.0                      py_0  
zlib                      1.2.11               h7b6447c_3  
zstd                      1.3.7                h0b5b093_0  
```

anaconda3のコンテナに入っているので`docker`コマンドは使えません。
anaconda terminalで使用できる`conda list`でパッケージを見ます。
<br>
anaconda3はtensorflowが最初からインストールされていないので、`conda install`を用いて
tensorflowとその周辺のパッケージをインストールしてきます。

```
base) root@xxxx:/# conda install tensorflow
```

#4．JupyterNotebookをブラウザから開く
大学時代に愛用していたJupyterNotebookをブラウザから開けるようにします。

```
base) root@xxxx:/# jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
.
.
.
To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-12-open.html
    Or copy and paste one of these URLs:
        http://81127b992594:8888/?token=22ab4d7b42e6629eb76dad08af9c8e6b1d5b59e0f0050f73
     or http://127.0.0.1:8888/?token=22ab4d7b42e6629eb76dad08af9c8e6b1d5b59e0f0050f73
```
<br>
末尾のURLをブラウザに入力するとJupyterNotebookが起動します。
<br>

<img width="855" alt="jupyter.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671665/58cc6c55-fc69-17f6-9918-a6516ecd39bf.png">


#5．Dockerのメモリを増やす
CNNを構築する前にDockerはデフォルトではメモリが2Gまでしか使用できないので、CNNで学習させようとするとオーバーフローします。なので7Gまで使用できるように設定を変更していきます。
<br>
1. デスクトップの上部にあるDockerアイコンをクリック
2. Preferenceをクリック
3. Resourcesのタブをクリック
4. Memoryを7Gにする
<img width="1042" alt="スクリーンショット 2020-07-15 22.12.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671665/a6dda488-c9fb-63ce-d683-77487498c746.png">

#6．tensorflowを使用してCNNを構築する
最後にCNNを構築していきます。データセットは定番のCIFAR10をダウンロードし、3層の畳み込み層、最適化はadam法、損失関数はクロスエントロピー誤差を使用する至ってシンプルな構築でいきます。
<img width="912" alt="スクリーンショット 2020-07-09 22.45.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671665/e7413118-23ac-9a30-bd7e-31a4d5ed76ae.png">
<br>
tensorflowを問題なくインポートできて、メモリもオーバーフローしなかったのでこれで環境構築終了です！

#終わりに
Dockerを軽い気持ちで触ってみましたが、奥が深すぎて沼にハマりそうでした...
anaconda3にtensorflowを導入かつJupyterNotebookを開くという、おそらくDocker経験者なら簡単なことにかなり難航しました。Dockerはやっておいて損はないので積極的に使っていきたいです。
とりあえずtensorflowを動かすことができる環境を構築することができたので、これから色々深層学習についてこの環境で試していこうと思います。