Edited at

nvidia-dockerでGPUコンテナの作成

nvidia-dockerはdockerコンテナ内でnvidia gpuを使うためのOSSのこと

これを使って、dockerコンテナ内でgpu資源を使えるようにする

nvidia, docker, docker-composeはインストール済のところから始める

docker 19.03以降で作成する手順を書いた(が、docker-composeは未対応)↓

https://qiita.com/uni-3/items/c9480d7e177e29b1316c


環境

ubuntu: 17.04

docker: 17.12.0-ce

docker-compose: 1.19.0

NVIDIA Docker: 2.0.2


手順

おおむね以下の手順通りに行った

https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)


事前準備

https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)#prerequisites

より、各種バージョンの確認。gpuとdockerについて新しいものを用意しておけば事前準備は問題ないと思われる



  1. GNU/Linux x86_64 with kernel version > 3.10

    $ uname -a
    
    Linux 4.10.0-42-generic #46-Ubuntu SMP Mon Dec 4 14:38:01 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

    バージョン4.10.0でx86_64なので大丈夫




  2. Docker >= 1.12

    $ docker version
    
    Client:
    Version: 17.12.0-ce
    API version: 1.35
    ...

    バージョンは17.12.0-ceなので大丈夫




  3. NVIDIA GPU with Architecture > Fermi (2.1)

    $ lspci | grep NVIDIA
    
    01:00.0 3D controller: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] (rev a1)

    FermiというのはNVIDIA GPUの製品の1種らしい。指定されているのは結構古いタイプのようなので、新しいGPUを使っていれば問題ないと思われる




  4. NVIDIA drivers ~= 361.93 (untested on older versions)

    $ nvidia-smi
    
    Thu Feb 22 01:37:08 2018
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 384.111 Driver Version: 384.111 |
    ...

    バージョンは384.111なので大丈夫




インストール

https://nvidia.github.io/nvidia-docker/

より、GPGキーの登録、リポジトリの追加、nvidia-docker2のインストール、docker daemonの再起動を行う

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \

sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install nvidia-docker2

# reload docker daemon process
$ sudo pkill -SIGHUP dockerd


動作確認

dockerコマンドにて確認

$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

...
Status: Downloaded newer image for nvidia/cuda:latest
Wed Feb 21 17:25:45 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111 Driver Version: 384.111 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1050 Off | 00000000:01:00.0 Off | N/A |
| N/A 59C P0 N/A / N/A | 2159MiB / 4041MiB | 32% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+


docker-composeで使う

https://github.com/docker/compose/issues/5360

によると1.19.0でdocker-compose対応するらしい

releasesを見ると

https://github.com/docker/compose/releases


Compose file version 2.3

Added support for the runtime option in service > definitions


version 2.3にruntimeオプションが追加されている様子


動作確認


docker-compose.yml

version: '2.3'

services:
nvidia:
image: nvidia/cuda
runtime: nvidia
command: nvidia-smi

として試してみると

$ docker-compose up

ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.nvidia: 'runtime'

runtimeオプションがないといわれた

$ docker-compose version

docker-compose version 1.15.0, build e12f3b9

docker-composeのバージョン古かった。更新して

$ sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

$ sudo rm /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose version
docker-compose version 1.19.0, build 9e633ef

試すと、実行できた

$ docker-compose up

Recreating nvidia_1 ... done
Attaching to nvidia_1
nvidia_1 | Wed Feb 21 18:05:29 2018
nvidia_1 | +-----------------------------------------------------------------------------+
nvidia_1 | | NVIDIA-SMI 384.111 Driver Version: 384.111 |
nvidia_1 | |-------------------------------+----------------------+----------------------+
nvidia_1 | | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
nvidia_1 | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
nvidia_1 | |===============================+======================+======================|
nvidia_1 | | 0 GeForce GTX 1050 Off | 00000000:01:00.0 Off | N/A |
nvidia_1 | | N/A 55C P0 N/A / N/A | 2133MiB / 4041MiB | 30% Default |
nvidia_1 | +-------------------------------+----------------------+----------------------+
nvidia_1 |
nvidia_1 | +-----------------------------------------------------------------------------+
nvidia_1 | | Processes: GPU Memory |
nvidia_1 | | GPU PID Type Process name Usage |
nvidia_1 | |=============================================================================|
nvidia_1 | +-----------------------------------------------------------------------------+
nvidia_1 exited with code 0


kerasを実行してみる

gpuコンテナでkerasを使って、gpuを認識するか試す

python3を実行できるコンテナを用意する

dockerイメージはnvidiaのものをベースにする


requirements.txt

Pillow

numpy
tensorflow-gpu==1.4
keras


Dockerfile

FROM nvidia/cuda:8.0-cudnn6-devel

RUN apt-get update -y && \
apt-get install -y --no-install-recommends \
python3-dev \
python3-pip \
python3-setuptools \
python3-wheel

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip3 install --no-cache-dir -r requirements.txt

COPY . /usr/src/app



docker-compose.yml

version: '2.3'

services:
app:
build: .
volumes:
- .:/usr/src/app
runtime: nvidia

コンテナをビルドして、コンテナ内に入る

$ docker-compose build

...

$ docker-compose run --rm app /bin/bash
#

コンテナ内でpythonを実行

# python3 train.py

Using TensorFlow backend.
...
2018-02-22 20:14:13.309056: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.493
pciBusID: 0000:01:00.0
totalMemory: 3.95GiB freeMemory: 2.03GiB
2018-02-22 20:14:13.309092: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)
...

gpuで実行された


参考