MacでNNabla使うためにDockerの設定した
macでNNablaを使った開発したいが、公式にはMacは現在対応中の様子。
ここ数年はmacで手軽にLinux環境導入する手段としてDockerが流行ってるらしく、またNNabla公式もDockerfileを公開している。
そのため、今回はDockerを使ってNNablaの環境構築してみる。
以下で公開されている公式のDockerfile(develop-ubuntu16.04)に加筆して、Jupyter Notebookが使えるようにした。
https://github.com/sony/nnabla/tree/master/docker
FROM ubuntu:16.04 RUN apt-get update && apt-get install -y --no-install-recommends \ ccache \ clang-format-3.8 \ cmake \ curl \ g++ \ make \ python-dev \ python-pip \ python-setuptools \ unzip RUN curl -L https://github.com/google/protobuf/releases/download/v3.1.0/protoc-3.1.0-linux-x86_64.zip -o /tmp/protoc-3.1.0-linux-x86_64.zip \ && cd /usr/local \ && unzip /tmp/protoc-3.1.0-linux-x86_64.zip \ && chmod 755 /usr/local/bin/protoc \ && rm -f /tmp/protoc-3.1.0-linux-x86_64.zip readme.txt ADD python/setup_requirements.txt /tmp/deps/ RUN pip install -U -r /tmp/deps/setup_requirements.txt ADD python/requirements.txt /tmp/deps/ RUN pip install -U -r /tmp/deps/requirements.txt ADD python/test_requirements.txt /tmp/deps/ RUN pip install -U -r /tmp/deps/test_requirements.txt # tkato ADD RUN pip install -U jupyter RUN pip install -U nnabla VOLUME /notebooks WORKDIR /notebooks EXPOSE 8888 CMD ["jupyter", "notebook", "--no-browser", "--allow-root", "--ip=*", "--NotebookApp.password='sha1:XXXX'"]
jupyterの公式のDockerfileなどを読むと、設定は別ファイルに書いたりしてるようだが、面倒だったので上記のように書いた。
Jupyterのpasswordは、暗号化してDockerfileに記述する。 平文からSHA-1に変換する方法は、以下の投稿の(2-B)を参考にさせていただいた。
上記のDockerfileは、NNablaのに直接加筆した dockerのビルドスクリプトも提供されたのでそれを使って以下のようにビルドした
./docker-build develop-ubuntu16.04
また、コンテナの起動用には以下のスクリプトを作成し実行した。
docker run --name nbla -v /Volumes/share/nnabla-tutor:/notebooks -p 8888:8888 --rm nbla:develop-ubuntu16.04
これで、localhost:8888でNNablaが使えるJupyter Notebookが起動する。
保存したノート類は、ホストからアクセスでき、コンテナを消してもちゃんと残る。
Dockerについて
以前も、開発環境としてDockerを使おうとしたことはあったが、ちょっと試して面倒になって消してしまっていた。
しかし、以下の点に注意して運用すれば今回はうまくいきそう。
- まずDockerfileに書くもの、永続化するものを決める
- 永続化するのは/notebooksなどコード
- Pythonパッケージの追加などの環境の変更は、Dockerfileに記載して都度ビルド
- コンテナ内は必要最低限の環境
- 永続化すしたコードはホストからもいじれるので、例えばgitはホスト側に入ってればコンテナには不要
- エイリアスやシェルスクリプト書いて、1コマンドでコンテナを立ち上げられるようにして、使うに当たっての心理的な壁をなくす
- 今回は
docker-rm-none-images
とかalias定義して便利だった
- 今回は
docker run --rm
でコンテナ終了時に削除- コンテナは使い捨て前提にすることで、オペレーションが単純になった
- パフォーマンスも気にならない
これでとりあえずは不自由なく開発できるようになったはず。
Dockerを道具として使いこなせるようになりたい。