機械学習用の Dockerfile を書いた

December 29, 2018 2 min read

Docker 入門は前回

今回は機械学習でよく使われる Python と Anaconda を導入してみた話。

結論から書くと、 Dockerfile は以下のようになった。

FROM nvidia/cuda:9.2-cudnn7-runtime-ubuntu18.04

ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV PATH /opt/conda/bin:$PATH
ENV LD_LIBRARY_PATH /usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

RUN apt-get update && apt-get install -y --no-install-recommends \
  bzip2 \
  curl \
  gcc \
  git \
  python3-dev \
  && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -o ~/miniconda.sh && \
  /bin/bash ~/miniconda.sh -b -p /opt/conda && \
  rm ~/miniconda.sh && \
  ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
  echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
  pip --no-cache-dir install jupyterlab && \
  conda update -n base conda && \
  conda update --all && \
  conda install -c conda-forge nodejs && \
  conda clean --all -y

RUN jupyter labextension install @jupyterlab/git && \
  pip --no-cache-dir install jupyterlab-git && \
  jupyter serverextension enable --py jupyterlab_git

COPY jupyter_notebook_config.py /root/.jupyter/
COPY notebooks /root/workspace/samples
COPY startup.sh /

RUN export SHELL=/bin/bash
WORKDIR "/root/workspace/"

CMD ["/startup.sh", "--allow-root"]

イメージとしては tensorflow の Dockerfile を参考に、 python の実行環境を Miniconda (Anaconda の縮小版) にし、 jupyterlab とその git 拡張機能を入れている。 ついでに export SHELL=/bin/bash で jupyterlab 上で実行した Terminal のデフォルトを bash に変えた。

設定ファイルの jupyter_notebook_config.py は以下のようにした。 token を設定することで簡易的な初期パスワードにできる。

c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.port = 8888
c.NotebookApp.open_browser = False
c.NotebookApp.notebook_dir = '/root/workspace'
c.NotebookApp.token = 'TOKEN'

また起動スクリプトの startup.sh

#!/usr/bin/env bash
jupyter lab "$@" >> /jupyter.log 2>&1

とすることで、ログを収集したまま jupyterlab をバックグラウンドで起動できる。

また、サンプルのノートブックを notebooks/ ディレクトリに格納しておけば、ビルド時に含めるようにした。

build & run は以下のように実行する。

$ chmod +x ./run_jupyter.sh
$ docker build ./ -t ml-gpu
$ docker run -it -d --runtime=nvidia --restart=always \
    -p 8888:8888 --name ml-gpu ml-gpu

ホストの 8888 番ポートにつなげたので、目的の jupyterlab には http://{host_ip}:8888/ で接続できる。このときにトークンを求められるが、特に変えてなければ TOKEN を入力する。


Written by Shun Nishimura.

© Copyright 2020 Shun Nishimura - All Rights Reserved