개요

회사에서 nvidia-docker를 장비에 설치할 일이 있어 찾아보고 정리해둔다. centos에서의 설치법은 링크를 참고한다. (개인적인 의견이지만 tensorflow를 동작시킬 것이면 우분투로 진행하는게 검증된 레퍼런스가 많으니 좋지 않을까 한다.)

사전설치

nvidia-docker 설치전 아래의 사항들이 설치되어 있어야 한다.

설치방법

아래 패키지 설치방법은 편의상 nvidia-docker github의 내용을 발췌한것으로 시간이 지남에 따라 변동될 수 있으니 항상 원본을 참고하자.

# nvidia-docker 1.0을 설치한 적이 있으면 아래 스크립트를 실행해준다.
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

# 레파지토리 추가
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 -y nvidia-docker2

# docker 데몬 내림
sudo pkill -SIGHUP dockerd

daemon.json 설정

nvidia-docker를 쓸 때 /etc/docker/daemon.json를 설정해 두어야 한다. nvidia-docker 설치 시 overwrite할 것인지 물어보는데 기존에 따로 설정해둔 내역이 daemon.json에 있다면 기존 설정파일에 아래의 내용을 추가하면 된다.

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

예를 들어 필자는 아래와 같은 구성을 사용하고 있다.

{
      "allow-nondistributable-artifacts": ["docker-registry.kwangsiklee.com:5000"],
      "registry-mirrors": ["http://docker-registry.kwangsiklee.com:5555"],
      "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": []
            }
        }
}

검증하기

아래와 같은 방법으로 정상적으로 nvidia-docker가 설치되었는지 확인해보자.

# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

아래와 같은 화면이 나오면 정상적으로 동작하는 것이다.

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26                 Driver Version: 387.26                    |
|-------------------------------+----------------------+----------------------+
| 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 V100-PCIE...  Off  | 00000000:04:00.0 Off |                    0 |
| N/A   41C    P0    38W / 250W |      0MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-PCIE...  Off  | 00000000:06:00.0 Off |                    0 |
| N/A   42C    P0    38W / 250W |      0MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-PCIE...  Off  | 00000000:07:00.0 Off |                    0 |
| N/A   44C    P0    37W / 250W |      0MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-PCIE...  Off  | 00000000:08:00.0 Off |                    0 |
| N/A   42C    P0    35W / 250W |      0MiB / 16152MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

GPU 제한하기

아래와 같은 명령으로 복수의 GPU 환경에서 docker 내의 GPU를 제한 시킬 수 있다.

$ NV_GPU=0,1 nvidia-docker run --rm -ti nvidia/cuda nvidia-smi    

텐서플로우 실행

nvidia-docker를 이용해서 텐서플로우를 아래와 같이 실행 할 수 있다.

$ nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-devel-gpu