機械学習のための GPU 関連ライブラリの設定 (docker 利用)

<URL:https://medium.com/nvidiajapan/nvidia-docker-って今どうなってるの-20-09-版-558fae883f44> に従って NVIDIA-Docker の導入を行う. 以下の 3 ステップで実行する.

  1. NVIDIA ドライバのインストール
  2. Docker のインストール
  3. NVIDIA Container Toolkit のインストール

なお, 上記の手順 (1) は <URL:03_ComputationNode-nvidia-venv.htm> の方法とほぼ同じである. apt install するのが cuda か cuda-drivers の違いだけである. cuda をインストールしても 特に問題ないようなので, 実際の作業では <URL:03_ComputationNode-nvidia-venv.htm> を行ったことを前提として, 手順 (2) から行うことにした.

[参考] cuda-drivers のインストール

<URL:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html> の手順 1, 2 を実行するが, apt-get でインストールするのを cuda でなく, cuda-driver に変える.

デバイスの確認

$ lspci | grep -i nvidia

カーネルヘッダのインストール

$ sudo apt-get install linux-headers-$(uname -r)

<URL:https://developer.nvidia.com/cuda-downloads> において アーキテクチャを選択すると表示される手順に従う.

$ sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/debian10/x86_64/7fa2af80.pub
$ sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/debian10/x86_64/ /"
$ sudo add-apt-repository contrib

$ sudo apt update
$ sudo apt -y install cuda-drivers

再起動

$ sudo reboot

Docker のインストール

$ sudo apt-get install curl

$ curl https://get.docker.com | sh

$ sudo usermod -aG docker <ユーザ名>

$ sudo systemctl start docker
$ sudo systemctl enable docker

NVIDIA Container Toolkit

nvidia-docker2 パッケージをインストールすれば必要なものが全て入る.

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

インストールされていないコンテナ (以下の例では cuda:11.0-base) を指定すると, 自動的にコンテナイメージがダウンロードされる.

$ docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

  Unable to find image 'nvidia/cuda:11.0-base' locally     <=== 注目!
  11.0-base: Pulling from nvidia/cuda                      <=== 注目!
  54ee1f796a1e: Pull complete
  f7bfea53ad12: Pull complete
  46d371e02073: Pull complete
  b66c17bbf772: Pull complete
  3642f1a6dfb3: Pull complete
  e5ce55b8b4b9: Pull complete
  155bc0332b0a: Pull complete
  Digest: sha256:774ca3d612de15213102c2dbbba55df44dc5cf9870ca2be6c6e9c627fa63d67a
  Status: Downloaded newer image for nvidia/cuda:11.0-base
  Sat Jan  9 05:33:24 2021
  +-----------------------------------------------------------------------------+
  | NVIDIA-SMI 460.27.04    Driver Version: 460.27.04    CUDA Version: 11.2     |
  |-------------------------------+----------------------+----------------------+
  | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
  | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
  |                               |                      |               MIG M. |
  |===============================+======================+======================|
  |   0  Tesla V100S-PCI...  Off  | 00000000:3B:00.0 Off |                    0 |
  | N/A   45C    P0    38W / 250W |      0MiB / 32510MiB |      0%      Default |
  |                               |                      |                  N/A |
  +-------------------------------+----------------------+----------------------+
  |   1  Tesla V100S-PCI...  Off  | 00000000:86:00.0 Off |                    0 |
  | N/A   47C    P0    39W / 250W |      0MiB / 32510MiB |      0%      Default |
  |                               |                      |                  N/A |
  +-------------------------------+----------------------+----------------------+
  |   2  Tesla V100S-PCI...  Off  | 00000000:AF:00.0 Off |                    0 |
  | N/A   46C    P0    38W / 250W |      0MiB / 32510MiB |      4%      Default |
  |                               |                      |                  N/A |
  +-------------------------------+----------------------+----------------------+

  +-----------------------------------------------------------------------------+
  | Processes:                                                                  |
  |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
  |        ID   ID                                                   Usage      |
  |=============================================================================|
  |  No running processes found                                                 |
  +-----------------------------------------------------------------------------+

同様にして, コンテナをインストールしておく.

  • nvidia/cuda:11.0-base
  • nvidia/cuda:11.0-runtime
  • chainer/chainer (https://github.com/chainer/chainer)

なお, 末尾には以下の意味がある.

  • base : Includes the CUDA runtime (cudart)
  • runtime : Builds on the base and includes the CUDA math libraries, and NCCL. A runtime image that also includes cuDNN is available.
  • devel : Builds on the runtime and includes headers, development tools for building CUDA images. These images are particularly useful for multi-stage builds.

NVIDIA Container Toolkit のバージョン情報は以下で確認できる

$ nvidia-container-cli info

  NVRM version:   460.27.04
  CUDA version:   11.2

  Device Index:   0
  Device Minor:   0
  Model:          Tesla V100S-PCIE-32GB
  Brand:          Tesla
  GPU UUID:       GPU-d19054e2-f863-3da6-c30b-f299bb053a27
  Bus Location:   00000000:3b:00.0
  Architecture:   7.0

  ...(以下, 略)...

docker version のバージョン情報は以下で確認できる

$ docker version

  Client: Docker Engine - Community
   Version:           20.10.0
   API version:       1.41
   Go version:        go1.13.15
   Git commit:        2291f61
   Built:             Mon Dec 28 16:17:34 2020
   OS/Arch:           linux/amd64
   Context:           default
   Experimental:      true

  Server: Docker Engine - Community
   Engine:
    Version:          20.10.2
    API version:      1.41 (minimum version 1.12)
    Go version:       go1.13.15
    Git commit:       8891c58
    Built:            Mon Dec 28 16:15:28 2020
    OS/Arch:          linux/amd64
    Experimental:     false
   containerd:
    Version:          1.4.3
    GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
   runc:
    Version:          1.0.0-rc92
    GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
   docker-init:
    Version:          0.19.0
    GitCommit:        de40ad0

現時点でインストールされている docker イメージは以下のコマンドで取得できる.

$ docker images

  REPOSITORY        TAG            IMAGE ID       CREATED        SIZE
  chainer/chainer   latest         2c0563bd9e2b   3 weeks ago    4.12GB
  nvidia/cuda       11.0-base      2ec708416bb8   4 months ago   122MB
  nvidia/cuda       11.0-runtime   6db6a6e25752   4 months ago   1.95GB

動作テスト: chainer コンテナ

chainer が公式に出しているコンテナ (<URL:https://github.com/chainer/chainer> 参照) を利用してみる.

コンテナのダウンロードも兼ねて,とりあえず実行してみる. コンテナに入って pip3 list すると, chainer 7.7.0, cupy-cuda92 がすでにインストールされていることがわかる. 手元のサンプルを動かすためには matplotlib が必要であるが, それは含まれていなかった. また, コンテナの実態は Debian のようである.

$ docker run -it chainer/chainer /bin/bash

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 を追加する. Dockerfile には RUN 以下に matplotlib などをインストールするという指定を書く. Dockerfile の書式は <URL:https://www.atmarkit.co.jp/ait/articles/1407/08/news031.html> などを参照のこと. なお, docker image コマンドは docker run の前に毎回実行して構わない. Dockerfile の中身が書き換えられた場合には, docker が判断して, コンテナを作り直してくれる. そうでなければ, コンテナは作り直されない.

$ mkdir mydocker
$ cd mydocker

$ vi Dockerfile

  FROM chainer/chainer
  RUN pip3 install matplotlib

$ cd ..

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

$ docker image build -t chainer/sugiyama mydocker  

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

$ docker run --gpus all -v $PWD:/tmp -w /tmp --rm chainer/sugiyama python3 gpu-samples/chainer-sample.py -g 0

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

$ vi docker-test.sh

  docker image build -t chainer/sugiyama mydocker  
  docker run --gpus all -v $PWD:/tmp -w /tmp --rm chainer/sugiyama python3 gpu-samples/chainer-sample.py -g 0

$ bash docker-test.sh

参考