ゼロから作るDeep Learning 2 自然言語処理編のコードを実行できるDockerイメージを作りました。
Dockerコンテナからmatplotlibでグラフを表示できるのと、GPUを使ってコードを実行できます。
前提
- ホストはLinux
- GPUを使うためにはホスト側にnvidia-dockerが必要
Dockerfile
本書でGPU用のNumPyと紹介されているCuPyを使うためにはCUDAが必要なので、CUDAのイメージをベースにします。 ユーザ情報を引数で渡しているのは、Docker内からmatplotlibでグラフを表示するのにホスト側のGUIが必要になるからです。また、CuPyが実行時にホームディレクトリを要求します。
FROM nvidia/cuda:9.0-devel-ubuntu16.04
ARG user
ARG uid
ENV python_version 3.7.0
ENV DEBIAN_FRONTEND="noninteractive"
ENV LANG="en_US.UTF-8"
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
curl \
libncursesw5-dev \
libffi-dev \
libgdbm-dev \
liblzma-dev \
libsqlite3-dev \
libssl-dev \
openssl \
tk-dev \
xz-utils \
zlib1g-dev \
&& rm -rf /var/lib/apt/lists/*
# CuPy
RUN mkdir -p /home/${user}
RUN chown ${uid}.${uid} /home/${user}
# Install Python
RUN curl -fsSL -o /usr/local/src/python.tar.xz \
https://www.python.org/ftp/python/${python_version}/Python-${python_version}.tar.xz \
&& tar xf /usr/local/src/python.tar.xz -C /usr/local/src/ \
&& cd /usr/local/src/Python-${python_version} \
&& ./configure \
&& make -j $(nproc) \
&& make install \
&& ldconfig \
&& rm -rf /usr/local/src/python.tar.xz /usr/local/src/Python-${python_version} \
&& ln -s /usr/local/bin/pip3 /usr/local/bin/pip \
&& ln -s /usr/local/bin/python3 /usr/local/bin/python
RUN pip install --upgrade pip
RUN pip install numpy matplotlib cupy
RUN mkdir -p /app
WORKDIR /app
ビルド
ユーザ名とUIDをビルド引数にしてビルドします。
docker build \
--build-arg user=$(id -un) \
--build-arg uid=$(id -u) \
-t dlfs2 .
実行
matplotlibでのグラフ表示に必要なファイルをマウントしてやります。また、実行ユーザも指定します。
docker run --rm -ti \
--runtime nvidia \
--user=$(id -u) \
-e DISPLAY \
-v `pwd`:/app \
-v /etc/group:/etc/group:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/shadow:/etc/shadow:ro \
-v /etc/sudoers.d:/etc/sudoers.d:ro \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
dlfs2 \
bash -l