-
[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 이다.