Python 環境の構築 (docker 利用)

以下, docker コンテナの構築について述べる.

コンテナ

Docker Hub で検索して使えそうなコンテナを探すのが良い.

tensorflow や chainer のコンテナなど見つけることができる.

コンテナに含まれるライブラリを確認する.

chainer が公式に出しているコンテナ (chainer 参照) を例に実行してみる. 他のコンテナでも同様に実行できる.

コンテナに入る.

$ docker run -it chainer/chainer /bin/bash
root@4e69baef2558:/# pip3 list

コンテナに入って pip3 list すると, インストールされているライブラリの一覧が表示される. chainer 7.7.0, cupy-cuda92 がすでにインストールされていることがわかる. また, コンテナの実態は Debian のようである.

root@4e69baef2558:/# pip3 list

  DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a form.
  chainer (7.7.0)
  cupy-cuda92 (7.7.0)
  fastrlock (0.5)
  filelock (3.0.12)
  numpy (1.18.5)
  pip (9.0.1)
  protobuf (3.14.0)
  setuptools (39.0.1)
  six (1.15.0)
  typing-extensions (3.7.4.3)
  wheel (0.30.0)

root@5a9dd8d7232a:/# cat /proc/version 

  Linux version 4.19.0-13-amd64 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.160-2 (2020-11-28)

root@4e69baef2558:/# exit

コンテナにライブラリやユーザを追加する.

コンテナにライブラリを追加することができる. 以下では matplotlib を追加することを考える. また, Python プログラムを実行した際に作られるファイルの所有者を自分自身にするためには, コンテナに自分のユーザを作成しておく必要があることに注意されたい (何もしないとファイルの所有者が管理者(root)になる).

コンテナにライブラリやユーザを作成する場合には Docker ファイルを作成する. Dockerfile の書式は <URL:https://www.atmarkit.co.jp/ait/articles/1407/08/news031.html> などを参照のこと. なお, docker image コマンドは docker run の前に毎回実行して構わない. Dockerfile の中身が書き換えられた場合には, docker が判断して, コンテナを作り直してくれる. そうでなければ, コンテナは作り直されない.

$ mkdir mydocker
$ cd mydocker

$ id -u

  2000     (ユーザID を確認)

$ vi Dockerfile

  FROM chainer/chainer
  RUN pip3 install matplotlib
  RUN adduser --uid <ユーザID> --gecos "" --disabled-password <ユーザ名>

$ cd ..

コンテナを作成する. -t 以下にコンテナ名を, 最後に Dockerfile の置かれたディレクトリを指定する.

$ docker image build -t chainer/hogehoge mydocker  

コンテナを用いて計算を実行する.

コンテナを使って計算を実行する.

$ docker run --gpus all -v $PWD:/tmp -w /tmp --rm -u `id -u $USER` chainer/matsue-ct python3 chainer-sample.py -g 0

なお,バッチシステムで計算するときは, 上記の 2 つをスクリプトに書いておけば良い. 実行したときに, 別のターミナルで nvidia-smi を実行すると, GPU が使われていることがわかる.

$ vi docker-test.sh

  #!/bin/sh
  #PBS -q gpu
  #PBS -l select=1:ncpus=1:ngpus=1

  # ジョブを投入したディレクトリに移動
  cd $PBS_O_WORKDIR

  # コンテナの作成
  docker image build -t chainer/matsue-ct  mydocker

  # docker コンテナを用いて実行
  docker run --gpus all -v $PWD:/tmp -w /tmp --rm -u `id -u $USER` chainer/matsue-ct  python3 chainer-sample.py -g 0

$ qsub docker-test.sh