ゼロから作るDeep Learning
僕はpythonも機械学習も全く知識が無かったのですが、ここ最近のニュースでも話題が多いですし、何か触りだけでも勉強できたらなと思っていたところにオライリーのゼロから作るDeep Learningがわかりやすいという話を聞いて買ってみました。
適度に数学的な部分も省かれてて、自分のような厳密な証明とかよりイメージを知りたいようなライトな感じの人にはとてもおもしろく読めました。また解説されていることがソースレベルで説明されているのが大変わかりやすかったです。
で、普段pythonとかをガリガリ書いている人はいいんだと思いますが、とりあえずやってみたいときに、pythonいれてnumpyいれて、matplotlibいれてやるのも(一回作ってしまえばいいですが)ちょっとメンドいですよね。
ならDockerで作ってしまおうと思ったのですが、この本ででくるmatplolibでグラフ描画(GUI)があるところでちょっとハマったので記事として残しておきます。
(が、mac側にも何個かライブラリ入れたり、コンテナ起動前の作業があったり若干微妙かもしれないと後から気付きましたが。。)
環境構築
最初一式楽に入れようと思ってJupiter notebook
とかも考えたんですが、Dockerイメージが4Gぐらいあるとかお手軽でなかったのと、この「ゼロから作るDeep Learning」自体が「最低限のライブラリでゼロから作ってみよう」というコンセプトのようなのでそれに必要なライブラリだけいれる環境が欲しいとおもって自分で作ってみました。
注意
ただし僕の環境がmacなのでGUIの部分のメインはmac用です。
必須環境
- Python3系環境
- numpy
- matplotlib
がこの本のサンプルで必要なモノのようです。
このうち、この本でよく出てくるグラフ描画の部分(matplotlib)でGUIの環境があるととてもいい感じにすすめていけるのですが、これをDocker環境で行うとなるとDocker環境からグラフ描画出来る仕組みが必要になります。
いままでそういうことをしたことはなかったので出来るのかどうかわからなかったですが調べてみると
DockerコンテナのGUIをMac側に飛ばして表示させよう
というナイスな記事がありました。これを元に作ってみたところ、コンパクトにこの本をすすめる環境が出来きました。
Docker環境構築
Dockerファイル自体はライブラリを入れるだけなので、Docker hub
の公式のpythonイメージを元に必要なライブラリを入れます。
FROM python:3.5.2
WORKDIR /var/python
RUN pip install \
ipython \
numpy \
matplotlib
CMD ["ipython"]
で、この環境で作ったDockerコンテナの中で、例えば、
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
というようなスクリプトを実行してmac側でグラフ描画したいわけです。
内容は上記のリンクのままですが、mac側のIPアドレスを元にDockerコンテナ側からグラフの内容を送ってもらうために、
- mac側にXサーバ(
XQuartz
)を入れる。 -
socat
でDockerコンテナ側からの描画内容を受けるポートをたててそれをmac内のXサーバに渡すようにする
の二点を行うことでDockerで実行しているpythonからmac側にグラフの内容を描画することができました。
必要ライブラリのインストール
socat
とXQuartz
をbrew
で入れます。
brew install socat
brew install caskroom/cask/brew-cask
brew cask install xquartz
これで準備完了です。
Dockerのビルド
Docker build自体は通常通り、上記のDocker
ファイルで行います。
ここではイメージ名をpython-dl
としています。
docker build -t python-dl .
実行!
まずmac側でX
の準備を行います。
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
参考記事では事前に明示的にopen -a XQuartz
を実行していましたが、僕が試した限りでは特に事前に実行していなくても必要になったら勝手に起動されているようでした。
これで準備が整ったので、dockerコンテナを起動します。
先程ビルドしたイメージを起動する際に、コンテナ側にXサーバのアドレスとしてmac側のipアドレスを渡すことでsocat
で作った口からmac側にGUIの描画を行います。
mac側のIPアドレスはおそらく多くの人がipconfig en0
で取得出来ると思うのでこの内容からipアドレスを取得するために
ifconfig en0 | grep -v inet6 | grep inet | awk '{print $2 ":0"}'`
で取得します(実際にはmacのIPアドレス:0
をコンテナに渡すので上記のようなスクリプトになっています)。
また各種サンプルのソースをマウントするために、-v
でカレントディレクトリをマウントする、などを考慮して下記コマンドでコンテナを起動します。
docker run --rm -it -e DISPLAY=$(ifconfig en0 | grep -v inet6 | grep inet | awk '{print $2 ":0"}') -v $(pwd):/var/python python-dl bash
これでコンテナ側のbashが起動するので、サンプルとしてsamples/sample01.py
に、
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
があるとして、
python samples/sample01.py
で、下記のようなグラフがmac側で描画されれば成功です。
その他
ここまでの環境(+α)をいれた内容を
においています
###書籍のサンプルコードも一緒に取得する
この本のサンプルはgithub
に登録されているので、それのリポジトリをbook-sample
というフォルダ以下にgitのサブモジュールとして登録しているので、
-
この記事のリポジトリclone
git clone https://github.com/pocari/python-dl-docker
-
書籍のサンプルコードディレクトリのコードをclone
git submodule update -i
すれば、書籍のサンプルも実行出来ます。
例)上記のdocker run
コマンドでコンテナに入った後
cd samples/book-sample/ch07
python apply_filter.py