今回は機械学習でよく使われる 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
を入力する。