Help us understand the problem. What is going on with this article?

dockerでKerasを使える環境を構築する

はじめに

Docker上で手軽にKerasの環境構築を行います。
使用環境はMacを想定しています。

DockerにKerasイメージをインストールする

dockerにKerasの環境が用意されたイメージをpullします。

$ docker pull flydhub/dl-docker:cpu

このコマンドによって、Kerasを利用するために必要なあらゆるフレームワークがインストールされた環境を用意できます。

インストールしたイメージからコンテナを作る

イメージはプログラムでいうクラスにあたり
コンテナはプログラムでいうインスタンスにあたります。

よって、使用するためにはコンテナをイメージから生成する必要があります。

コンテナの生成のために以下のコマンドを使用します。

$ docker run -d -it --name docker_keras -p 8888:8888 -p 6006:6006 floydhub/dl-docker:cpu bash

-d はバックグラウンドで起動しておくという意味です。
これがないと、一回つないだコンテナのシェルから抜けただけでコンテナが終了してしまいます。

-it をつけることで、生成されたコンテナの標準入出力(シェル)と、ホスト(Mac)のターミナルをがっちゃんこします。
つまり、このオプションをつけることで、MacのターミナルからコンテナのCLIを操作できます。嬉しいですね。

--name docker_kerasでは、このコンテナにdocker_kerasという名前を付けています。名前を付けないとあとから色々とIDを指定しないといけないなど面倒なので付けたほうがいいです。

-p では、ホストOSのポートと、コンテナのポートをガッチャンコします。
-p 8888(ホストOS側):8888(コンテナ側)のイメージです。
Kerasの仮想環境では、コンテナ内でJupyter Notebookを起動・利用することができます。しかし、せっかくコンテナ内でJupyter Notebookを起動しても、デフォルトのままではホストOS側のブラウザから、コンテナ内のlocalhost:8888にアクセスできません。
そこで、ホストOS(Mac)の8888ポートと、Jupyter Notebookの8888ポートをつなぐことで、ホストOSのブラウザで
localhost:8888
にアクセスすれば、コンテナ内のJupyter Notebookにアクセスすることができます。
もし、-p 83872:8888とすれば、ホストOSで
localhost:88372
とブラウザでアクセスすれば、おそらくコンテナ内のJupyter Notebook(ポートは8888)にアクセスすることができます。

-p 6006:6006はやっていることは同じです。しかし、6006はTensorFlowのTensorboardというアプリのポートとなっています。
よって、コンテナ内で実行されているTensorboard(6006)に、Macのブラウザ側から6006というポートを指定することでアクセスできるようにしています。

最後に、利用するイメージfloydhub/dl-docker:cpuと、起動するコンテナ内で利用するシェル(Bash)を指定しています。

コンテナとホストOS(Mac)側のシェルをつなぐ

現在、Kerasのコンテナは上記のコマンドによって、バッググラウンドで動き続けています。
よって、このコンテナにMacのターミナルを接続して、コンテナ内部のCLIにアクセスする必要があります。

$ docker exec -it docker_keras /bin/bash

上記のコマンドを打ち込むと、コンテナ内のバッシュのプロセスを起動して、自分のMac上のOSのターミナルと接続することができます。

上記のコマンドは以下のような概念イメージになっています。

$ すでに動いているコンテナのプロセスを新しく作るよ -it(MacのターミナルとコンテナのCLIをつなぐよ) docker_keras(つなぐコンテナ名) /bin/bash(新しいプロセスで実行するコマンド)

というイメージです。

よって、

$ docker exec -it docker_keras pwd

と打ち込むと

  1. バックグラウンドで動いているdocker_kerasのコンテナを、Dockerが持ってくる
  2. docker_kerasの新しいプロセスを作る。
  3. そのプロセス内でpwdコマンドを実行する。

という流れで実行されて、

/root

というpwdの結果が表示されます。

よって、

$ docker exec -it docker_keras /bin/bash

では、docker_kerasのコンテナで新しくバッシュのプロセスを動かして、それを-itオプションでMacのターミナルとつないでいるため、コンテナのCLIをいじることができます。

jupyternotebookを起動する

$ docker exec -it docker_keras /bin/bash

のコマンドでコンテナのCLIにアクセスできたはいいものの、この環境下で
VimでPythonを書くのはなかなか厳しいです(Vim使えないので)

よって、Jupyter Notebookを利用してみます。

上記のコマンドでコマンドにつないだあとで

root@ecdf16228bef:~# sh run_jupyter.sh 

と打ち込みます。
現在コンテナ内の/rootディレクトリに
run_jupyter.shというシェルスクリプトがあるため、それを実行することで
JupyterNotebookが起動します。
そして、コンテナ接続時にポートを設定していたため、Macのブラウザで
http://localhost:8888/treeにアクセスすることで、Jupyter Notebookを利用できます。

Tensorboardを起動する

KerasはTensorFlowをラッパーしたライブラリで、Tensorboardという、ディープラーニングの実行結果過程などの結果をGUIで見れるツールがあります。

よって、このTensorboardを利用することで、より直感的にわかりやすく学習度や精度の変化を見ることができます。

$ docker exec -it docker_keras /bin/bash

をして、コンテナに接続したあとに

root@46e6ade2f98a:~# tensorboard --logdir .

をすることで、Tensorboardを起動することができます。
ポートをコンテナ作成時に設定しておいたため、
localhost:6006とブラウザに打ち込むことで、Tensorboardを利用することができます。

参考文献

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away