Macにおけるdocker構築。Pythonと機械学習に向けて。

#記事の目的
Pythonによる機械学習環境として、以下の二つを実施できる環境をdocker上に構築しました。
・データサイエンス100本ノックが実施できる環境
・Tensorflowが使用できる環境

当方、本職はプログラマーではなく、pythonや機械学習は初学者です。本記事は他のページを参考にしまくっておりキュレーションサイトの様ですがご容赦ください。。。

#実施環境
MacBookAir 　early 2020, RAM 8GB, CPU intel core i5 (非M1)
OS: macOS Big Sur Ver. 11.4

#dockerについて
###dockerとは
Wikiによると、「Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである」とのことです。
コンテナ仮想化などの難しいキーワードがありますが、現時点では以下の目的を達成するための手段としています。
「Dockerは、パソコン（私の場合はMac)でPythonを使用して機械学習を実行するための環境」
*Pythonによらず、色々な言語の開発環境を整えられる様ですが、詳しくは分かりません・・・。
*anacondaなどPythonを使用するための環境は他にもありますが、dockerのメリットは以下の様です。

###dockerのメリット
######機械学習のフレームワーク用の環境を簡単に作成して、使い分けができる
例えば、TensorflowとPytorchなど機械学習用のフレームワークを動作させる環境を、docker(正確にはdockerコンテナ)上に個別に作成できます。
初心者目線ではとりあえずTensorflowを使用できる環境を簡単に作れることがメリットですが、上級者目線ではフレームワークのバージョンも含めて個別に環境構築ができるので、論文の検証などにも便利な様です。
######開発環境を即座に構築し、配布できる。グループで開発する時に有効
初心者目線では、グループでアプリを作るとき、グループ内の一番詳しい人が作成してくれた環境を共有できる、といったところでしょうか。パソコン引越しの時にも役に立つはずです。近々パソコン買い替えを検討している方にも良いかと。
######dockerコンテナ上で開発したアプリケーションを別の場所に移動させる際、コンテナイメージに変換することで環境をそのまま移動させることができる。（移動先の環境原因のバグを減らせる）
上のメリットと似てますね。Macからwindows、その逆も簡単にできる様です
######開発環境を除去することも簡単なので、PCに不要なファイルが残ったりしない
初心者目線からこのメリットを理解するのは少々難しいのですが、要らないファイルが残らないのでパソコンがスッキリするという感じですかね・・・。


この他にもメリットはたくさんあるようです。詳しくは割愛します。

#dockerのインストール
初心者にdockなんて必要？と思われるかもしれませんが、何事も試してみたい派なので、とりあえずインストールしました。参考にしたのは、以下のサイトのMacの箇所です。

https://karaage.hatenadiary.jp/entry/2019/05/17/073000

###Docker hubにサインイン
DockerHubのサイトでユーザー登録をしておきます。

https://hub.docker.com

###Docker Desktop on Macをインストール
以下のサイトにアクセスし、「Mac with intel chip」をクリックしてダウンロードし、
ダウンロード完了後に「docker.dmg」をダブルクリックしてインストールしました。
詳細は以下のサイトに記載してあります。

https://docs.docker.com/docker-for-mac/install/

###初回起動とチュートリアル
初回起動時はチュートリアルに沿って進めました。以下の画面です。
青い箇所をクリックするだけで、クローン、ビルド、ラン、シェアの順に進められます。
シェアのところで、先ほど作成したDocker hubに登録したユーザ名とパスワードを入力します。

:::note
もしかして、この初回起動時のチュートリアルは実行不要かも
:::

![スクリーンショット 2021-07-19 15.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1710026/1b1a8c5f-bbea-3af1-91ae-a1d209ea7335.png)

とりあえずdocker自体のインストールはこれで完了の様なので、次にデータサイエンス100本ノックの環境構築を行いました。

#データサイエンス100本ノックが実施できる環境の構築

ここから先は以下のサイトを参考にしました。
Dockerセットアップまでは完了しているので、「Docker上で動かす」以降を実施しました。

https://qiita.com/karaage0703/items/1b18b1f4ab65d35afb5f

###初回起動
docker desktopが起動している状態で、以下のコマンドをteriminal上で実行します。

```
$ git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
$ cd 100knocks-preprocess
$ docker-compose up -d --build
```
次に、**safariなどのブラウザ**上で以下にアクセスします。(terminalではありません！）

```
http://localhost:8888
```
Jupyter Notebookが起動します。Jupyter notebook上からworkのフォルダにアクセスし、その中の「preprocess_knock_Python.ipynb」を起動すれば、データサイエンス100本ノックの環境構築完了でした！

###再開

再開時は、docker desktopを起動して100knocks-preprocessをstartさせます。
そして、ブラウザから以下にアクセスすれば再開できました！簡単！

```
http://localhost:8888
```

#Tensorflowのライブラリが使用できる環境の構築

ここから先は以下のサイトを参考にしました。

https://qiita.com/mktshhr/items/d6eda04e3b4eae8fd51d

https://www.tensorflow.org/install/docker?hl=ja

###Keras/Tensorflowのdockerイメージのダウンロード

以下のコマンドをMacのterminalに入力し、Jupyter付きの最新のtensorflowをダウンロードします。

```
$ docker pull tensorflow/tensorflow:latest-jupyter
```
###dockerとjupyter notebookの起動
次に以下のコマンドをterminalに入力してdockerを起動します。

```
$ docker run -it -p 8081:8888 tensorflow/tensorflow:latest-jupyter
```
この時、tokenが発行されます。terminalの返答にtoken=xxxxxxxxxxxxxxxと長い文字と数字の列があると思いますので、コピーしておきます。
次に、ブラウザ上で以下にアクセスします。起動時にポート8001を指定してるので、１００本ノックとは異なります。

```
http://localhost:8081/
```

ブラウザ上でtokenを聞かれますので、そして先ほどコピーしたtokenを入力してJypyter notebookが使用できるようになりました！
Jypyter notebook上では右上の「New▼」をクリックしてPython3を選べば開始できました。

###テスト
Jypyter notebookで以下をテストで実行したところ、エラーは出なかったのでひとまず成功している様です！

入力

```
import tensorflow as tf
print(tf.reduce_sum(tf.random.normal([1000, 1000])))
```
出力

```
tf.Tensor(-138.44626, shape=(), dtype=float32)
```

###ライブラリ確認
普段使用しているライブラリに関して、この段階で使用可能か確認しました

入っている　・・・numpy、matplotlib
入っていない・・・Pandas、sklearn、imbalanced-learn

次のステップとしてdockerイメージにライブラリを追加していく方法を探してみます。