気の向くままに辿るIT/ICT
ソフトウェア

DockerでTensorFlow/Keras開発環境を作る

ホーム前へ次へ
フリーソフト・オープンソースを活用しよう。

DockerでTensorFlow/Keras開発環境を作る

DockerでTensorFlow/Keras開発環境を作る

2018/10/07
tensorflow 1.5.0
keras 2.1.4

 コンテナ型仮想化Dockerを使って機械学習、ニューラルネットワーク、ディープラーニング(深層学習)と言えば、TensorFlowKerasのようなので、これらの開発環境を作ってみました。

 当初、ホスト環境上でAnacondaを使っていた際、自身のマシンの場合、何らかの対応が足りないようでTensorFlow 1.6〜最新1.11までは、Illegal errorとなり、1.5.0含む以前のものしか使えず、このバージョンで実績のありそうだった最新が2.2.4のKerasも2.1.4とし、その後、諸事情からDockerに移行しました。

Python 3.6.6

 Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。

[ホスト環境]
P C:TOSHIBA dynabook B45/B
CPU:Intel Cerelon 3855U 1.60GHz Core x2
GPU:Intel HD Graphics 510 (オンボード)
RAM:4GB
O S:Debian 9.5/Stretch x86-64

 ちなみに今回、検証に使っているパソコンには、GPUもあるにはありますが、この界隈で先行しているっぽいNVIDIA製ではなく、CPUで動かしてみています。

$ sudo usermod -aG docker USER

 ホスト側の一般ユーザーでsudoなしでdockerコマンドを実行したい場合には、Dockerインストール時に作成されるdockerグループにユーザーを追加しておきます。

DockerとDockerfile

Docker version 18.06.1-ce, build e68fc7a

 少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使えるようですが、DebianやFedoraはCE版のみ、RHLに触れたり、Fedoraを使っていたこともある自身もOSを乗り換えるほどの熱量はなく、DebianにCE版をインストールしました。

 CE版のインストールは、OS、プラットフォームごとに詳述されているので戸惑うこともありませんでした。

# Dockerfile
 
FROM ubuntu
RUN apt update && apt install -y \
  python3 \
  python3-pip \
  vim \
  firefox \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
RUN pip3 install \
  tensorflow==1.5 \
  keras==2.1.4 \
  jupyter notebook \
  graphviz
RUN jupyter notebook --generate-config
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> ~/.jupyter/jupyter_notebook_config.py
# ホストと合わせるのが目的なので":0"ではなく$DISPLAYの方が妥当かも
ENV DISPLAY=":0"

 NVDIA GPUのないマシンでCPUで動かしたいと思っている自身は、とりあえず、UbuntuベースでTensorFlow、Keras、Jupyter Notebook、Graphviz、vim、Firefox、Python3、Python3-pipを入れたイメージからコンテナを作って作業してみています。

 今のところ不都合はありませんが、Python3ではなく、Python3-devの方がよいのかもしれません。

 より良い環境ができたと思った時や何かやらかしてしまった時には、Dockerfileを編集してビルドすれば自動でやってくれるので楽ちんです。

 なんで楽ちんって言うんだろと思うほどの死語ですが、この楽さは、意味なく避けてた自身が馬鹿みたいに思えるほどです。

$ xhost local:
non-network local connections being added to access control list
$ ls
Dockerfile
$ docker build -t webzoit:chainer1 .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
webzoit       tensorflow_keras1              3dd2c78b72ba        23 hours ago        1.33GB
$ docker run -v /tmp/.X11-unix/:/tmp/.X11-unix/ -it --rm webzoit:tensorflow_keras1 /bin/bash
root@aac116a1e7db:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay ... /
tmpfs 64M 0 64M 0% /dev
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sdaX ... 64% /tmp/.X11-unix
shm 64M 0 64M 0% /dev/shm
tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs 1.9G 0 1.9G 0% /sys/firmware
root@aac116a1e7db:/#

 cgroupは、1.9GB確保してはいますが、docker imagesによるイメージサイズは、Docker公式リポジトリのUbuntuが84.1MB、先のパッケージを入れてもたったの1.33GBと今時のOSのインストールディスクイメージより軽量です。

 作業をしていてもホストとコンテナを全く意識することなく、後述のようにコンテナ側のGUIアプリを表示しても全く違和感なく、軽快に操作できています。

root@aac116a1e7db:/# python3
Python 3.6.6 (default, Sep 12 2018, 18:26:19)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> import keras
Using TensorFlow backend.
>>>
([Ctrl]+[d])
root@aac116a1e7db:/#

 TensorFlowもKerasもimportしてもエラーにならず、ちゃんと入っていることが確認できます。

 ただ、前述の通り、自身のマシンの場合、何らかの対応が足りないようで1.6〜最新1.11までは、Illegal errorとなりましたが。

root@aac116a1e7db:/# jupyter notebook --allow-root
...
ホスト側ウィンドウに表示されたDockerコンテナから起動したJupyter Notebook

 ソケット通信によりローカルで完結して実現するというDockerコンテナの中でGUIアプリケーションを起動させるに習って、さり気なく、以下の手順を踏んであるため、コンテナ側にはX11は入っていませんが、ホスト側ディスプレイを使ってコンテナ側のブラウザを使うGUIアプリJupyter Notebookもすんなり起動します。

  1. ホスト側でxhost local:(コロンの後にコンテナ側ホスト名を指定すればベター)
  2. ホスト側でdocker runする際に-v /tmp/.X11-unix/:/tmp/.X11-unix/としてホストとコンテナのディスプレイを共有すべくマウント
  3. Dockerfileにコンテナ側の環境変数DISPLAYにホスト側と同じ:0を指定してある
  4. Dockerfileにコンテナ内でjupyter_notebook_config.pyを生成、適切に追記・編集するよう書いてある

 4項については、Jupyter Notebook以外のGUIアプリには関係ありません(この設定がなくてもFirefox自体は起動します)。

 このスクリーンショットの一番うしろにあるのが、ホスト側のFirefox、右手前がホスト側の端末でDockerコンテナを起動後、Jupyter Notebookを起動、Jupyter Notebookタブのある手前のブラウザが、コンテナ側のFirefoxです。

 ちょっと小さくて見えづらいですが、Jupyter Notebookが表示されているFirefoxのタイトルバーには、Dockerコンテナ側のホスト名aac116a1e7dbが表示されています。

$ chmod u+x test_boot.sh
$ cat test_boot.sh
#! /bin/sh
 
xhost local:
docker run -v /tmp/.X11-unix/:/tmp/.X11-unix/ -it --rm webzoit:tensorflow_keras1 /bin/bash
$ ./test_boot.sh
root@123d456g789b:/# jupyter notebook --allow-root
...

 使うコンテナが決まったら、こんな風にスクリプト作ってみたら、ちょっとは楽なのかなと。

備考

 Dockerで環境構築する前にAnacondaを使っていたのですが、Docker-HubにAnacondaもあるし、DockerにAnacondaを入れるっていう選択肢もあるんですね。

 が、最新バージョンが使えない、しかも自身が使えたTensorFlow 1.5.0のリリースが、今年2018年1月末で、最新の1.11.0が9月末とリリースサイクルが、こんなにも早いとなると追加された新たな機能を使うことはできず、巷のサンプルもバージョンが合わず、使えない、使えるかどうか定かではない=仮に使ってエラーが出た時、原因の切り分けがしづらいこともありそう...。

 となると最新バージョンを使える、それなら、(よりコア数の多い)NVIDIA GPU搭載のパソコンを買うか、存在するなら、現状、手持ちのパソコン、かつ、CPUでも最新バージョンを動かせるニューラルネットワークライブラリを使うのが賢明かも...Chainer、Caffe/Caffe2、Torch/PyTorch、CNTK、Theano等々があるようですが、Chainerかな...。

ホーム前へ次へ