nvidia-docker2를 사용해보십시오.

nvidia-docker가 공식적으로 출시된 것은 2017년 1월. 컨테이너에 GPU를 쉽게 이용할 수 있는 것은 그 장점 중 하나. 다른 하나는 호스트에 복수의 GPU를 탑재했을 때에, 특정수 또는 단독의 GPU를 컨테이너내에 이용 가능하게 됩니다. 그러나 이 plug-in와 docker daemon는 따로따로 임하는, 사용에 조금 제한되고 있다.
2017년 연말에 가까운 11월 nvidia-docker2가 마침내 출시되었습니다.
설명 에 의하면, 요점이 3개가 있다고 생각한다.
1. docker에 nvidia-docker를 통합한, 별도의 데몬은 필요하지 않다.
2. 기존 버전과의 호환성.
3. 이미지는 CUDA 없어도, 컨테이너내에 GPU도 이용할 수 있습니다.

우선 설치의 흐름을 메모해, 덧붙여 신경이 쓰이는 기능을 시험해 봅시다.

시스템 배치


  • ubuntu 16.04
  • docker 설치됨
  • nvidia 드라이버 설치

  • nvidia-docker2 도입



    리포지토리 추가


    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
    

    nvidia-docker2 설치



    nvidia-docker2는 현재 모든 docker 버전에서 지원되지 않으므로 nvidia-docker2를 설치하기 전에 먼저 docker 버전을 확인하고 필요한 경우 해당 버전으로 업데이트합니다.

    docker 버전 확인
    ishouyou@emerald:~$ docker --version
    Docker version 1.12.5, build 7392c3b
    

    서포트 버전 확인
    ishouyou@emerald:~$ sudo apt-cache madison nvidia-docker2 nvidia-container-runtime
    ...
    nvidia-docker2 | 2.0.1+docker1.12.6-1 | https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64  Packages
    ...
    nvidia-container-runtime | 1.1.0+docker1.12.6-1 | https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64  Packages
    ...
    

    지원 docker 버전으로 업데이트
    ishouyou@emerald:~$ sudo apt-cache madison docker-engine
    ishouyou@emerald:~$ sudo apt-get install docker-engine=1.12.6-0~ubuntu-xenial
    ishouyou@emerald:~$ sudo pkill -SIGHUP dockerd
    

    호스트에 nvidia-docker v1.0이 설치되어 있거나 nvidia-docker daemon으로 추가 된 컨테이너가있는 경우 해당 컨테이너를 지우고 nvidai-docker 1.0을 제거하십시오.

    nvidai-docker 제거
    ishouyou@emerald:~$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
    ishouyou@emerald:~$ sudo apt-get purge nvidia-docker
    

    nvidia-docker2 및 nvidia-container-runtime 설치
    ishouyou@emerald:~$ sudo apt-get install -y nvidia-docker2=2.0.1+docker1.12.6-1 nvidia-container-runtime=1.1.0+docker1.12.6-1
    ishouyou@emerald:~$ sudo pkill -SIGHUP dockerd
    

    이제 nvidia-docker2 설치가 완료되었습니다.

    nvidia-docker2를 사용하는 방법



    사용법은 바뀌지 만 호환성은 확실하기 때문에 v1.0에 익숙한 사람에게 동일한 사용 방법도 통합니다.

    기존 nvidia-docker 사용 예
    NV_GPU='0' nvidia-docker run --rm nvidia/cuda nvidia-smi
    

    nvidia-docker2는 위의 코멘드를 자동 전환하여 아래와 같이 됩니다.

    nvidia-docker2 사용 예
    docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 --rm nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04 nvidia-smi
    

    CUDA가없는 이미지에서도 사용할 수 있습니다.



    호스트에 설치된 CUDA 버전을 컨테이너에 액세스할 수 있습니다.

    GPU 사용 가능한 컨테이너 작성 예
    docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 --rm busybox:latest nvidia-smi
    

    nvidia-docker2와 rancher의 조합





    도커 데몬 설치



    docker daemon 디버그 모드로 시도

    docker 디버그 모드 활성화
    sudo systemctl stop docker
    sudo dockerd -D --default-runtime=nvidia
    

    dockerd
    ...
    DEBU[0004] attach: stdout: end
    DEBU[0004] attach: stderr: end
    DEBU[0004] Calling POST /v1.22/containers/91af6039e0ab33376fb04a16a5743f75957
    66ff2e06a923f0d4454c954032328/wait
    DEBU[0004] Calling GET /v1.22/containers/91af6039e0ab33376fb04a16a5743f759576
    6ff2e06a923f0d4454c954032328/json
    DEBU[0004] Calling DELETE /v1.22/containers/91af6039e0ab33376fb04a16a5743f759
    5766ff2e06a923f0d4454c954032328?v=1
    DEBU[0004] Calling GET /v1.22/containers/rancher-agent/json
    DEBU[0006] Calling GET /v1.22/info
    DEBU[0006] Calling GET /v1.22/version
    DEBU[0006] Calling GET /v1.22/info
    DEBU[0006] Calling GET /v1.22/containers/json?all=1&filters=%7B%22status%22%3
    A%7B%22paused%22%3Atrue%2C%22running%22%3Atrue%7D%7D&limit=0
    DEBU[0006] Calling GET /v1.22/events
    DEBU[0007] Calling GET /v1.22/containers/json?all=1&limit=0
    DEBU[0013] Calling GET /v1.22/containers/json?all=1&limit=0
    DEBU[0013] Calling GET /v1.22/containers/a108a5f2c630df4ec6644d4eeae10834612c
    15a6a2780b6c9cc7513955eee905/json
    DEBU[0013] Calling GET /v1.22/containers/json?all=1&limit=0
    DEBU[0013] Calling POST /v1.22/containers/a108a5f2c630df4ec6644d4eeae10834612
    c15a6a2780b6c9cc7513955eee905/start
    ...
    

    컨테이너 추가



    Rancher Web UI에서 보면 호스트 배치는 거의 원형입니다. (IP 주소 부분은 숨깁니다.)


    호스트측에서
    ishouyou@ubuntu:~$ nvidia-smi
    Thu Dec  7 18:54:30 2017
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 384.66                 Driver Version: 384.66                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla P4            Off  | 00000000:04:00.0 Off |                    0 |
    | N/A   28C    P0    23W /  75W |      0MiB /  7606MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   1  Tesla P4            Off  | 00000000:83:00.0 Off |                    0 |
    | N/A   30C    P0    23W /  75W |      0MiB /  7606MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID  Type  Process name                               Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    

    웹 UI에서 컨테이너를 추가하는 것은 이런 느낌입니다.


    특히 주의해야 할 것은 그 변수입니다. NVIDIA_VISIBLE_DEVICES는 GPU를 설치하는 nvidia-docker2의 변수입니다.

    NVIDIA_VISIBLE_DEVICES의 변수에, 값의 부분은 0이 쓰고 있는 것은 GPU 0을 이용한다. 만약 전부의 GPU가 사용하고 싶을 때, all에 기입합니다.
    작성 버튼을 눌러 GPU 사용 가능한 컨테이너를 작성하기 시작합니다.
    컨테이너 작성 완료 후 콘솔에서 확인.

    컨테이너 안으로 들어가다
    ishouyou@ubuntu:~$ docker exec -it r-hoge_gpu_0-7e8ff0a0 bash
    root@c3a336340dad:/# nvidia-smi
    Thu Dec  7 19:01:25 2017
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 384.66                 Driver Version: 384.66                    |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla P4            Off  | 00000000:04:00.0 Off |                    0 |
    | N/A   28C    P0    23W /  75W |      0MiB /  7606MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID  Type  Process name                               Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    

    docker 디버그 모드에서 시도가 끝나면 디버그 모드를 종료하고 docker daemon 설정에 씁니다.

    도커 데몬에 설치



    daemon.json
    {
        "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": []
            }
        },
        "default-runtime": "nvidia"
    }
    

    dockerd 재부팅
    sudo pkill -SIGHUP dockerd
    

    좋은 웹페이지 즐겨찾기