tkato’s blog

ブログ名は暫定。

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)を参考にさせていただいた。

qiita.com

上記の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を道具として使いこなせるようになりたい。