気づけば、Chainer開発会社において深層学習フレームワークを自社製Chainerから、順次、Facebook製PyTorchに移行するとのこと。
コンテナ型仮想化Dockerを使って日本発の機械学習、ニューラルネットワーク、ディープラーニング(深層学習)などのフレームワークChainerの開発環境を作ってみました。
先にTensorFlow/Kerasの環境を作ったのですが、自身のマシンが何かに対応していないのか、TensorFlowの最新版(1.11.0)を使えず、ダウングレードして試していった結果、1.5.0含む以前のバージョンしか使えなかったため、DebianリポジトリにもあるCaffeや他にもTorch/PyTorchなどもあるようですが、勘案した結果、最新版を使えるChainerにしました。
Pythonは3系(Python 3.6.6)を使いますが、自動で入った模様の2系は、2.7.15rc1です。
ちなみに今回、検証に使っているパソコンのGPUは、Intel HD Graphics 510というオンボードのもので主流らしきNVIDIA製ではないのでCPUで動かしてみている一方、Intel CPU アクセラレータiDeepは、まだ、試していません。
少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使える模様、DebianはやFedoraはCE版のみ、自身はDebianをメインとしており、今のところOSを乗り換える気もないのでCE版をインストールしました。
OS、プラットフォームごとに詳述されているCE版のインストールは、スムースに完了しました。
ホスト側の一般ユーザーでsudoなしでdockerコマンドを実行したい場合には、Dockerインストール時に作成されるdockerグループにユーザーを追加しておきます。
下記列挙のChainerや公式アドオンの情報を踏まえ、NVDIA GPUのないマシンでCPUで動かしたいと思っている自身は、とりあえず、UbuntuベースでaptでPython3、Python3-pip、git、less、curl、wget、vim、mpich、Firefoxを、pip3でnumpy、gym、scipy、cython、opencv-python、Pillow、h5py、matplotlib、chainercv、chainerrl、chainermn、chainerui、chainerを入れたイメージからコンテナを作って作業してみています。
今のところ不都合はありませんが、Python3ではなく、Python3-devの方がよいのかもしれません。
ただ、Intel CPUの場合、スピードアップできるiDeepというものもあるようですが、入れ忘れ、まだ入れてません。
ChainerMNは、分散型の深層学習(ディープラーニング)ライブラリ、ChainerCVは、コンピュータビジョン(デジタル画像・動画解析)深層学習用ライブラリ、ChainerRLは、深層強化学習ライブラリとのこと。
尚、ChainerMNインストール時に依存関係にあるらしきmpi4pyでmpi.hが見当たらない旨のエラーに遭遇、ググったところ、mpi4pyインストール時のエラーの対処でmpichが必要な旨あったのでUbuntuイメージを使っている自身は、このmpichをapt installすることでpip3 installでchainermnもインストールできた経緯があります。
ちなみに、このエラーに対処すべく、コンテナ内で作業する中でaptでmpichパッケージを入れた後、ChainerMNインストールしてみると依存するmpi4pyのあたりで[Running setup.py bdist_wheel for mpi4py: started]でフリーズしたかのように時間がかかりましたが、しばらく待つとちゃんと処理されインストールに成功しました。
より良い環境ができたと思った時や何かやらかしてしまった時には、Dockerfileを編集してビルドし直せばよく、簡単なのが助かります。
docker imagesによるイメージサイズは、1.33GBでインストールされたChainerバージョンは、安定版で最新らしき4.5.0でした。
尚、どこが違うのか把握できていませんが、Docker-Hubの公式イメージchainer/chainerをダウンロードしてみるとChainerのバージョンは、開発版の5.0.0rc1、イメージサイズは、2.45GBでした。
コンテナ内でGUIアプリを起動するための準備xhostコマンドについては、後述しますが、端末上で先のDockerfileのあるディレクトリにいることを確認し、docker buildでコンテナからイメージを作成します。
docker imagesなどでイメージwebzoit:chainer1が作成されていることを確認、docker runでGUI絡みでホストとコンテナ側の/tmp/.X11-unix/をマウントしつつ、作成されたイメージを使ってコンテナを起動します。
whichコマンドやpip3 listコマンドなどでDockerfileに書いたパッケージが入っていることを確認できます。
chainer、chainermn、chainerrl、chainercv、chaineruiをimportしてもエラーにならず、ちゃんと入っていることが確認できます。
ソケット通信によりローカルで完結して実現するというDockerコンテナの中でGUIアプリケーションを起動させるに習って、さり気なく、以下の手順を踏んであるため、コンテナ側にはX11は入っていませんが、ホスト側ディスプレイを使ってコンテナ側のブラウザFirefoxもすんなり起動します。
よって、コンテナ内のFirefoxがホストのディスプレイを使って起動します。
今回、DockerfileにはChainerUIもインストールするように書いたわけですが、chainer/chaineruiを見るとホスト上で行なう場合とDockerイメージをダウンロードする方法の例が示されており、
Dockerの公式リポジトリからChainerの公式イメージファイルをダウンロードする方法だと実行して、http://localhost:5000にアクセスしても、ホスト側からDockerコンテナに接続はできているものの、結果としてコンテナ内からGUIアプリを起動できているかどうかは、わかりづらいですが、
ここでは、そのためにDockerコンテナにChainerUIをインストールしてあり、コンテナ内で、リンク先のホスト上で実行する方法ができるはずなのでやってみます。
結局、Firefoxを起動することにはなるのですが、http://localhost:5000にアクセスするとChainerUIをコンテナ内から実行できること、ブラウザのタイトルバーには、起動中のコンテナのホスト名がカッコ付きで表示されていることががわかります。
尚、[chainerui db create]/[chainerui db upgrade]を忘れると[chainer create db]してね、とか、[The current DB schema version is not supported, please setup DB]とかエラーが出るので注意。
あ、ChainerでもJupyter Notebookって使うものなんですね...、これを使う場合には、インストールしておくことは、もちろん、先の設定に加えてDockerfileに追加設定が必要です。
使うコンテナが決まったら、こんな風にスクリプト作ってみたら、ちょっとは楽なのかなと。
尚、Jupyter Notebookについては、rootで起動する場合、[--allow-root]を付ける必要がありました。
Dockerで環境構築する前にAnacondaを使っていたのですが、Docker-HubにAnacondaもあるし、DockerにAnacondaを入れるっていう選択肢もあるんですね。