機械学習のための GPU 関連ライブラリの設定 (docker 利用)
<URL:https://medium.com/nvidiajapan/nvidia-docker-って今どうなってるの-20-09-版-558fae883f44> に従って NVIDIA-Docker の導入を行う. 以下の 3 ステップで実行する.
- NVIDIA ドライバのインストール
- Docker のインストール
- 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