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

DockerでChainer開発環境を作る

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

DockerでChainer開発環境を作る

DockerでChainer開発環境を作る

2020/08/25

 気づけば、Chainer開発会社において深層学習フレームワークを自社製Chainerから、順次、Facebook製PyTorchに移行するとのこと。

2018/10/11
chainer 4.5.0
chainercv 0.10.0
chainerrl 0.4.0
chainermn 1.3.0
chainerui 0.6.0

 コンテナ型仮想化Dockerを使って日本発の機械学習、ニューラルネットワーク、ディープラーニング(深層学習)などのフレームワークChainerの開発環境を作ってみました。

 先にTensorFlow/Kerasの環境を作ったのですが、自身のマシンが何かに対応していないのか、TensorFlowの最新版(1.11.0)を使えず、ダウングレードして試していった結果、1.5.0含む以前のバージョンしか使えなかったため、DebianリポジトリにもあるCaffeや他にもTorch/PyTorchなどもあるようですが、勘案した結果、最新版を使えるChainerにしました。

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は、Intel HD Graphics 510というオンボードのもので主流らしきNVIDIA製ではないのでCPUで動かしてみている一方、Intel CPU アクセラレータiDeepは、まだ、試していません。

Docker

Docker version 18.06.1-ce, build e68fc7a

 少なくとも現時点では、UbuntuやCentOSならEE/Enterprise版も使える模様、DebianはやFedoraはCE版のみ、自身はDebianをメインとしており、今のところOSを乗り換える気もないのでCE版をインストールしました。

 OS、プラットフォームごとに詳述されているCE版のインストールは、スムースに完了しました。

$ sudo usermod -aG docker USER

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

Dockerfile

# Dockerfile
 
FROM ubuntu
 
RUN apt update && apt install -y \
        python3 \
        python3-pip \
        git \
        less \
        curl \
        wget \
        vim \
        mpich \
        firefox \
  && apt clean \
  && rm -rf /var/lib/apt/lists/*
 
RUN pip3 install -U setuptools \
  && pip3 install \
        gym \
        numpy \
        scipy \
        cython \
        pillow \
        h5py \
        opencv-python \
        matplotlib \
        chainercv \
        chainerrl \
        chainermn \
        chainerui \
        chainer
 
ENV DISPLAY=":0"

 下記列挙の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でした。

Dockerコンテナの実行

$ 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       chainer1              3dd2c78b72ba        1 minutes ago        933MB
$ docker run -v /tmp/.X11-unix/:/tmp/.X11-unix/ -it --rm webzoit:chainer1 /bin/bash
root@120162b48c6d:/# which less
...
root@120162b48c6d:/# pip3 list
...
root@120162b48c6d:/#

 コンテナ内でGUIアプリを起動するための準備xhostコマンドについては、後述しますが、端末上で先のDockerfileのあるディレクトリにいることを確認し、docker buildでコンテナからイメージを作成します。

 docker imagesなどでイメージwebzoit:chainer1が作成されていることを確認、docker runでGUI絡みでホストとコンテナ側の/tmp/.X11-unix/をマウントしつつ、作成されたイメージを使ってコンテナを起動します。

 whichコマンドやpip3 listコマンドなどでDockerfileに書いたパッケージが入っていることを確認できます。

インストール済みChainer環境の確認

root@120162b48c6d:/# 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 chainer
>>> import chainermn
>>> import chainerrl
>>> import chainercv
>>> import chainerui
>>>
([Ctrl]+[d])
root@120162b48c6d:/#

 chainer、chainermn、chainerrl、chainercv、chaineruiをimportしてもエラーにならず、ちゃんと入っていることが確認できます。

GUIアプリの起動

root@120162b48c6d:/# firefox
...

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

  1. ホスト側でxhost local:(コロンの後にコンテナ側ホスト名を指定すればベター)
  2. ホスト側でdocker runする際に-v /tmp/.X11-unix/:/tmp/.X11-unix/としてホストとコンテナのディスプレイを共有すべくマウント
  3. Dockerfileにコンテナ側の環境変数DISPLAYにホスト側と同じ:0を指定してある

 よって、コンテナ内のFirefoxがホストのディスプレイを使って起動します。

 今回、DockerfileにはChainerUIもインストールするように書いたわけですが、chainer/chaineruiを見るとホスト上で行なう場合とDockerイメージをダウンロードする方法の例が示されており、

$ git clone https://github.com/chainer/chainerui.git
$ cd chainerui
$ docker pull chainer/chainerui:v0.4.0
$ docker run -d -p 5000:5000 -v $PWD:/projects --name chainerui chainer/chainerui:v0.4.0
$ curl http://localhost:5000/api/v1/projects -X POST -H "Content-Type: application/json" -d '{"project":{"name":"example-project","path_name":"/projects/examples"}}'
ホスト上で起動したブラウザ上のChainerUIのexample-project

 Dockerの公式リポジトリからChainerの公式イメージファイルをダウンロードする方法だと実行して、http://localhost:5000にアクセスしても、ホスト側からDockerコンテナに接続はできているものの、結果としてコンテナ内からGUIアプリを起動できているかどうかは、わかりづらいですが、

$ xhost local:
non-network local connections being added to access control list
$ docker run -v /tmp/.X11-unix/:/tmp/.X11-unix/ -it --rm webzoit:chainer1 /bin/bash
root@4dabef5d44cb:~/$ chainerui db create
root@4dabef5d44cb:~/$ chainerui db upgrade
root@4dabef5d44cb:~/$ git clone https://github.com/chainer/chainerui.git
root@4dabef5d44cb:~/$ cd chainerui
root@4dabef5d44cb:~/$ chainerui project create -d examples -n example-project
root@4dabef5d44cb:~/$ chainerui server &
root@4dabef5d44cb:~/$ firefox
コンテナ内から起動したブラウザ上のChainerUIのexample-project

 ここでは、そのために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]とかエラーが出るので注意。

# Dockerfile
 
FROM ubuntu
...
RUN jupyter notebook --generate-config
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> ~/.jupyter/jupyter_notebook_config.py
...
ENV DISPLAY=":0"
 

 あ、ChainerでもJupyter Notebookって使うものなんですね...、これを使う場合には、インストールしておくことは、もちろん、先の設定に加えてDockerfileに追加設定が必要です。

  1. Dockerfileにコンテナ内でjupyter_notebook_config.pyを生成、適切に追記・編集するよう書く
$ 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:chainer1 /bin/bash
$ ./test_boot.sh
root@pppi75dhtrtx:/# firefox
...
root@pppi75dhtrtx:/# jupyter notebook --allow-root
...

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

 尚、Jupyter Notebookについては、rootで起動する場合、[--allow-root]を付ける必要がありました。

備考

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

ホーム前へ次へ