ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] nvidia-docker 환경 셋업
    개발/Docker 2024. 4. 15. 22:30

    GPU 기반 컨테이너를 사용해야할 일이생겼다. 관련된 환경셋업을 하면서 겪었던 어려움들을 까먹지 않도록 기록하려고한다.

    nvidia-driver 설치

    driver 설치에 앞서 기존에 설치된 nvidia-driver 관련된 패키지들을 제거해주자.

    sudo apt-get --purge remove *nvidia* 
    sudo apt-get autoremove
    sudo apt-get autoclean

    dpkg -l | grep nvidia 커맨드를 이용해서 관련 패키지들이 모두 제거되었는지 확인해보자. 아무것도 뜨지 않아야한다.

    이제 ubuntu-drivers devices 커맨드를 이용해 설치할 수 있는 nvidia-driver 목록을 살펴보자.

    == /sys/devices/pci0000:00/0000:00:03.1/0000:29:00.0 ==
    modalias : pci:v000010DEd00001B80sv00001043sd000085AAbc03sc00i00
    vendor   : NVIDIA Corporation
    model    : GP104 [GeForce GTX 1080]
    driver   : nvidia-driver-390 - distro non-free
    driver   : nvidia-driver-470 - distro non-free
    driver   : nvidia-driver-418-server - distro non-free
    driver   : nvidia-driver-470-server - distro non-free
    driver   : nvidia-driver-450-server - distro non-free
    driver   : nvidia-driver-535-server - distro non-free
    driver   : nvidia-driver-525-server - distro non-free
    driver   : nvidia-driver-525 - distro non-free
    driver   : nvidia-driver-535 - distro non-free recommended
    driver   : xserver-xorg-video-nouveau - distro free builtin

    가장 최신인 nvidia-driver-535 을 설치해주자.

    sudo apt-get install nvidia-driver-535

    driver 적용을 위해 재부팅을 진행해주자.

    sudo shutdown -r now

    nvidia-driver 가 잘 설치되었는지 nvidia-smi 커맨드를 통해 확인해보자.

    Fri Dec 22 00:59:59 2023
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.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  NVIDIA GeForce GTX 1080        Off | 00000000:29:00.0 Off |                  N/A |
    |  0%   34C    P8              13W / 198W |      2MiB /  8192MiB |      0%      Default |
    |                                         |                      |                  N/A |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+

    nvidia-docker2 설치

    nvidia-docker2 는 nvidia-container-toolkit 패키지에 포함되어있다. 설치를 위해 GPG key 등록을 해주자.

    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
      && sudo apt-get update

    nvidia-container-toolkit 패키지를 설치해주자.

    sudo apt-get install -y nvidia-container-toolkit

    Docker daemon 설정

    마지막으로 docker daemon 을 설정해주자. ubuntu 20.04 부터 docker 설치를 snap 을 이용하게 끔 가이드하고 있고, 실제로 설치도 매우 간편해졌다. 그래서 필자의 경우는 snap 으로 docker 를 설치해서 docker daemon config file 의 경로가 /var/snap/docker/current/config/daemon.json 에 위치해있다. 편집기를 이용해서 아래 내용들을 추가해주자.

    {
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "args": [],
                "path": "nvidia-container-runtime"
            }
        }
    }

    docker data root 경로 변경 (optional)

    docker 를 오래 사용해본 사람들은 체감될것 같은데, 생각보다 docker repository image 가 용량을 많이 잡아 먹는다. 필자 시스템의 경우 OS 를 SSD 256G 에 설치했다보니 docker image 들을 보관하기엔 턱없이 부족해서 항상 HDD 경로로 바꿔주곤한다. 아래의 daemon.json 에서 data-root key 값에 경로를 추가해주자.

    {
        "data-root": <docker image directory>,
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "args": [],
                "path": "nvidia-container-runtime"
            }
        }
    }

    설정을 마쳤다면 docker & daemon 을 재시작해주자.

    sudo systemctl stop docker
    sudo systemctl stop docker.socket
    sudo systemctl stop containerd
    sudo systemctl start docker
    sudo systemctl daemon-reload

    docker 가 제대로 nvidia runtime 을 사용하는지 확인해주자. 커맨드는 docker info | grep -i runtime

    Runtimes: runc io.containerd.runc.v2 nvidia
    Default Runtime: nvidia

    마지막으로 cuda docker 이미지를 이용해서 nvidia-smi 가 잘 동작하는지 확인해보자.

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

    여기까지 성공한다면 gpu 기반 컨테이너를 사용할 준비가 완료되었다.

    마치며

    ubuntu 22.04 이전 버전의 ubuntu 기반으로 환경셋업을 하면서 잘 안되는 부분들이 조금 있어서 기록으로 남기고자 하는게 목적이었다. 추가로 환경셋업을 하면서 발생하는 문제점들은 Trouble shooting 에 남겨두고자한다.

    Trouble shooting

    docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' nvidia-container-cli: initialization error: load library failed: libnvidia-ml.so.1: cannot open shared object file: no such file or directory: unknown.

    >> docker daemon.json 설정이 잘되어 있는지 확인해보자. docker 를 snap 을 이용해서 설치하지 않고 apt-get install 로 설치했다면 default docker daemon config file 의 경로는 /etc/docker/daemon.json 이다.

Copyright © Kakao Corp. All rights reserved.