ゼロから作る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