コンテナ型仮想化Dockerを使って機械学習、ニューラルネットワーク、ディープラーニング(深層学習)と言えば、TensorFlowとKerasのようなので、これらの開発環境を作ってみました。
当初、ホスト環境上でAnacondaを使っていた際、自身のマシンの場合、何らかの対応が足りないようでTensorFlow 1.6〜最新1.11までは、Illegal errorとなり、1.5.0含む以前のものしか使えず、このバージョンで実績のありそうだった最新が2.2.4のKerasも2.1.4とし、その後、諸事情からDockerに移行しました。
Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。
ちなみに今回、検証に使っているパソコンには、GPUもあるにはありますが、この界隈で先行しているっぽいNVIDIA製ではなく、CPUで動かしてみています。
ホスト側の一般ユーザーでsudoなしでdockerコマンドを実行したい場合には、Dockerインストール時に作成されるdockerグループにユーザーを追加しておきます。
少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使えるようですが、DebianやFedoraはCE版のみ、RHLに触れたり、Fedoraを使っていたこともある自身もOSを乗り換えるほどの熱量はなく、DebianにCE版をインストールしました。
CE版のインストールは、OS、プラットフォームごとに詳述されているので戸惑うこともありませんでした。
NVDIA GPUのないマシンでCPUで動かしたいと思っている自身は、とりあえず、UbuntuベースでTensorFlow、Keras、Jupyter Notebook、Graphviz、vim、Firefox、Python3、Python3-pipを入れたイメージからコンテナを作って作業してみています。
今のところ不都合はありませんが、Python3ではなく、Python3-devの方がよいのかもしれません。
より良い環境ができたと思った時や何かやらかしてしまった時には、Dockerfileを編集してビルドすれば自動でやってくれるので楽ちんです。
なんで楽ちんって言うんだろと思うほどの死語ですが、この楽さは、意味なく避けてた自身が馬鹿みたいに思えるほどです。
cgroupは、1.9GB確保してはいますが、docker imagesによるイメージサイズは、Docker公式リポジトリのUbuntuが84.1MB、先のパッケージを入れてもたったの1.33GBと今時のOSのインストールディスクイメージより軽量です。
作業をしていてもホストとコンテナを全く意識することなく、後述のようにコンテナ側のGUIアプリを表示しても全く違和感なく、軽快に操作できています。
TensorFlowもKerasもimportしてもエラーにならず、ちゃんと入っていることが確認できます。
ただ、前述の通り、自身のマシンの場合、何らかの対応が足りないようで1.6〜最新1.11までは、Illegal errorとなりましたが。
ソケット通信によりローカルで完結して実現するというDockerコンテナの中でGUIアプリケーションを起動させるに習って、さり気なく、以下の手順を踏んであるため、コンテナ側にはX11は入っていませんが、ホスト側ディスプレイを使ってコンテナ側のブラウザを使うGUIアプリJupyter Notebookもすんなり起動します。
4項については、Jupyter Notebook以外のGUIアプリには関係ありません(この設定がなくてもFirefox自体は起動します)。
このスクリーンショットの一番うしろにあるのが、ホスト側のFirefox、右手前がホスト側の端末でDockerコンテナを起動後、Jupyter Notebookを起動、Jupyter Notebookタブのある手前のブラウザが、コンテナ側のFirefoxです。
ちょっと小さくて見えづらいですが、Jupyter Notebookが表示されているFirefoxのタイトルバーには、Dockerコンテナ側のホスト名aac116a1e7dbが表示されています。
使うコンテナが決まったら、こんな風にスクリプト作ってみたら、ちょっとは楽なのかなと。
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かな...。