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을 삭제하고 다시 설치하는 경우도 다반사인 것 같아서 위 내용을 정리해보았습니다.
도움이 되었으면 좋겠습니다.
감사합니다.