NVIDIA DRIVER, CUDA, CUDNN 설치

Published: Apr 23, 2021 by Dev-hwon

딥러닝 모델 학습을 위해 GPU를 사용하려다 보면 nvidia 드라이버나 cuda, cudnn 문제를 많이 겪곤 한다. 따라서 설치 및 제거 에러 수정 등에 대해 정리하고자 하였습니다.

설치전 NVIDIA 및 CUDA 와 관련된 파일을 삭제

$ sudo rm /etc/apt/sources.list.d/cuda*
$ sudo apt --purge autoremove nvidia*
$ sudo apt remove --autoremove nvidia-cuda-toolkit

nvidia driver 설치

추천 driver 확인

$ ubuntu-drivers devices

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001E04sv000010DEsd000012AEbc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-418-server - distro non-free
driver   : nvidia-driver-460 - third-party free
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-465 - third-party free recommended
driver   : nvidia-driver-450 - third-party free
driver   : nvidia-driver-460-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

보시면 recommended라고 표시되어있는 driver가 있습니다. 그 버전 기억해주세요.

driver 설치

  • repository 추가
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
  • driver 설치
$ sudo apt-get install nvidia-driver-[recommended 버전]
  • 재부팅
$ sudo reboot now
  • 드라이버 설치 확인
$ nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.56       Driver Version: 460.56       CUDA Version: 11.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  GeForce RTX 208...  Off  | 00000000:01:00.0 Off |                  N/A |
| 62%   72C    P2   177W / 250W |   1309MiB / 11016MiB |     69%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1037      G   /usr/lib/xorg/Xorg                106MiB |
|    0   N/A  N/A      1173      G   /usr/bin/gnome-shell               81MiB |
|    0   N/A  N/A     32551      C   python                           1117MiB |
+-----------------------------------------------------------------------------+

이런식으로 나오면 성공입니다.

CUDA 설치

Nvidia driver에 맞는 cuda를 설치해줍니다.

https://docs.nvidia.com/deploy/cuda-compatibility/index.html

여기 documentation을 읽어보면 driver version에 맞는 cuda 버전을 알려줍니다.

쉬운 방법으로는 위에 nvidia-smi에서 우측 상단에 나오는 CUDA Version과 동일한 버전 설치하시면 됩니다.

개발 환경에 따라 필요한 버전이 다를 수 있으니 참고바랍니다.

https://developer.nvidia.com/cuda-toolkit-archive

위 링크를 타고 들어가면 필요한 버전을 다운 받을 수 있습니다.

저의 경우는 11.2 version을 다운 받았습니다.

자신의 환경에 맞게 선택해주세요.

다른 블로그들 보면 설치 코드까지 적어주시던데 다들 환경이 다르고 필요한 버전이 다른데 그것을 확인하지 않고 블로그에 나와있는 코드 그대로 실행하시는 분들이 있어서 코드를 직접 올리진 않겠습니다.

웹페이지에 설치 코드까지 자세하게 올려져있으니까 그대로 잘 따라하시면 됩니다.

이렇게 명시되어있습니다. 한줄 한줄 따라 진행하시면 됩니다.

  • Library Path 추가

설치까지 완료하셨으면 library path까지 추가하셔야 합니다.

$ vim ~/.bashrc

위 코드로 .bashrc 파일을 열고 가장 밑에 코드를 수정해주시면 됩니다.

## CUDA and cuDNN paths
export PATH=/usr/local/cuda-[VERSION]/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-[VERSION]/lib64:${LD_LIBRARY_PATH}

[VERSION]안에 설치한 버전을 입력하시면 됩니다.

정확히 하기 위해서는 /usr/local 폴더로 이동해서 cuda폴더가 어떻게 생성되어있는지 확인해주세요.

  • CUDA 설치 확인
$ nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Jan_28_19:32:09_PST_2021
Cuda compilation tools, release 11.2, V11.2.142
Build cuda_11.2.r11.2/compiler.29558016_0

이처럼 뜨면 성공입니다.

CUDNN 설치

https://developer.nvidia.com/rdp/cudnn-archive

위 링크로 가면 설치한 CUDA 버전에 맞는 cuDNN이 명시되어있습니다.

버전을 선택하시고 자신의 환경에 맞는 파일을 다운받으시면 됩니다.

cudnn은 로그인을 하셔야 다운 받으실 수 있습니다.

다운을 받고 나면 tgz파일 압축을 풀어줍니다.

$ tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz

압축을 푼 파일을 복사해서 cuda 폴더에 붙여 넣기 하고 파일 권한을 변경해줍니다.

$ sudo cp cuda/include/cudnn*.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

마지막으로 버전 확인을 해줍니다.

$ cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

#define CUDNN_MAJOR 8
#define CUDNN_MINOR 1
#define CUDNN_PATCHLEVEL 1
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#endif /* CUDNN_VERSION_H */

이렇게 출력되면 성공입니다.

Nvidia-docker2 설치

추가적으로 nvidia-docker2 설치에 대해 소개하겠습니다.

nvidia-docker2 설치는 tensorflow docker gpu 설치할 때 소개했었는데 다시 알려드리겠습니다.

  • nvidia-docker1이 이미 설치되어 있다면 제거
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker

$ sudo apt-get purge -y nvidia-docker
  • repo 설정
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
  • apt list update
$ sudo apt-get update
  • nvidia-docker2 설치
$ sudo apt-get install -y nvidia-docker2

$ sudo pkill -SIGHUP dockerd
  • 버전 확인
$ nvidia-docker --version

Docker version 20.10.5, build 55c4c88

이렇게 뜨면 성공입니다.

NVIDIA NVML Driver/library version mismatch 해결방법

Failed to initialize NVML: Driver/library version mismatch

GPU 사용하던 도중 위와 같은 문제가 발생 할 경우 종종 있습니다.

이런 경우 nvidia driver를 unload 하고 관련 모듈을 삭제하면 됩니다.

아래 명령어로 nvidia 관련 사용중인 드라이버 리스트를 불러옵니다.

$ lsmod | grep nvidia

nvidia_uvm            983040  2
nvidia_drm             57344  3
nvidia_modeset       1224704  7 nvidia_drm
nvidia              34037760  444 nvidia_uvm,nvidia_modeset
drm_kms_helper        188416  1 nvidia_drm
drm                   491520  6 drm_kms_helper,nvidia_drm
i2c_nvidia_gpu         16384  0

nvidia 드라이버 unload를 위하여 nvidia 항목 오른쪽에 있는 종속성 항목을 unload 해줍니다.

$ sudo rmmod nvidia_drm
$ sudo rmmod nvidia_modeset
$ sudo rmmod nvidia_uvm
$ sudo rmmod nvidia

위 코드를 입력하였을 때, 아래와 같은 에러를 종종 만나게 될겁니다.

rmmod: ERROR: Module nvidia is in use

이럴때에는, 아래 코드를 입력하여 사용되는 프로세스를 확인해줍니다.

sudo lsof /dev/nvidia*

COMMAND    PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
Xorg      2084    root  mem    CHR 195,255           556 /dev/nvidiactl
Xorg      2084    root  mem    CHR   195,0           557 /dev/nvidia0
Xorg      2084    root   12u   CHR 195,255      0t0  556 /dev/nvidiactl
Xorg      2084    root   16u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   17u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   18u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   19u   CHR 195,254      0t0  560 /dev/nvidia-modeset
Xorg      2084    root   23u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   24u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   27u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   28u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   29u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   30u   CHR 195,255      0t0  556 /dev/nvidiactl
Xorg      2084    root   31u   CHR 195,254      0t0  560 /dev/nvidia-modeset
Xorg      2084    root   32u   CHR   195,0      0t0  557 /dev/nvidia0
Xorg      2084    root   33u   CHR   195,0      0t0  557 /dev/nvidia0

위와 비슷하게 뜰겁니다.

관련된 프로세스 id(PID)를 확인해주시고 kill 해주세요.

$ sudo kill -9 [PID]

프로세스를 모두 kill해주셨으면 다시 unload 해줍니다.

$ sudo rmmod nvidia_drm
$ sudo rmmod nvidia_modeset
$ sudo rmmod nvidia_uvm
$ sudo rmmod nvidia

그리고 다시 nvidia-smi를 실행해주시면 정상적으로 작동할겁니다.

$ nvidia-smi

Unknown runtime specified nvidia 에러 (nvidia-docker2)

nvidia-docker2를 사용하다보면 위와 같은 에러를 만날 수 있습니다.

저의 경우에는 docker compose runtime을 nvidia로 놓고 사용하였을 때 에러가 발생하였습니다.

이 경우에는 docker를 재실행하였더니 해결되었습니다.

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

정리하며

딥러닝 모델을 학습하기 위해 GPU를 사용하다보면 NVIDIA 관련된 에러를 자주 접하게 되는 것 같습니다.

잘 사용하다가도 갑자기 에러가 뜨는 경우가 있고 버전 하나 안맞으면 바로 응 나 안해 해버리는거 같습니다.

에러때문에 nvidia driver, cuda, cudnn을 삭제하고 다시 설치하는 경우도 다반사인 것 같아서 위 내용을 정리해보았습니다.

도움이 되었으면 좋겠습니다.

감사합니다.

nvidia NVIDIA driver Graphic Driver CUDA CUDNN nvidia-smi nvcc -V error Unknown runtime specified nvidia NVIDIA NVML Driver/library version mismatch