OS/Linux

Ubuntu 20.04 RTX 2080 Ti RTX 3090 Docker GPU 세팅

김개발^^ 2023. 7. 6. 20:04
반응형

이 이야기는 졸업을 한달 남짓밖에 남지 않았던 나에게 닥친 GPU 세팅에 관한 대서사시이다.

 

우리 랩실에는 여러 대의 서버가 있지만 그 중 한대가 말썽을 일으켰다.

 

그 서버의 OS는 Ubuntu 20.04.6 LTS 를 사용 중이고

GPU는 아래와 같이 세개를 사용 중이다.

NVIDIA GeForce RTX 2080 Ti
NVIDIA GeForce RTX 3090
NVIDIA GeForce RTX 3090

 

지금 하고 있는 프로젝트를 도커 이미지로 배포하기 위해서 Docker도 사용 중인데,

시스템 재부팅 이후로 docker run이 되지 않는 것이다!!! 

근데 docker run이 아니라 docker run --gpus 옵션이 안먹는 거였음 ㅋ

 

하지만 난 딥러닝 모델을 써야하는걸? GPU를 써야하는걸?

결국 난 (속으로만)울부짖으면서 처음부터 다시 세팅하기에 이르른다...

목마른 사슴이 우물을 파..나..? 아무튼 우물 팠음

 

docker가 작동 안하던 시점을 복기해보면,

nvidia-driver: 535 (CUDA 12.2까지 지원)

CUDA: 10.1

이었던 듯.. 확실치는 않음

 

근데 내 docker 이미지는 CUDA 11.3을 쓰는 이미지임

상관이 있는지는 모르겠지만 암튼, 에러가 났었음.

에러 메시지는 아래와 같음

$ sudo docker run -it --rm --gpus all --name 컨테이너명 -v ${PWD}:${PWD} 도커이미지명
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.

 

 

NVIDIA GeForce RTX 2080 Ti
NVIDIA GeForce RTX 3090

 

난 이 두가지의 GPU를 모두 만족하는 nvidia-driver 버전을 찾아야 했음

그래서 출력을 봤는데 음... ^^...

그냥 470 설치하기로 함 ^^!

 

근데 설치를 할 때마다 535 블라블라 나오는 것이다.

뭐지? 했는데 535가 안지워진 것이었음 ㅡㅡ

 

그래서

$ sudo apt search nvidia-driver

이걸로 조회해보면 installed 된걸로 뜨더라 ㅡㅡ 

 

$ sudo dpkg -l | grep nvidia

그래서 이 명령어로 찾고 상위버전을 싹 지우고도 우여곡절을 겪으며 470은 수동설치까지 하게 되지만 어떻게든 성공은 했음

 

 

~~시작~~

 

설치 전 준비(기존 설치 파일들 삭제)

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

이렇게 해도 제대로 안지워진다면... 

# Nvidia driver 완전 삭제
$ sudo apt-get autoremove
$ sudo apt-get autoclean

# CUDA 완전 삭제
$ sudo rm -rf /usr/local/cuda*
$ sudo apt-get --purge remove 'cuda*'
$ sudo apt-get autoremove --purge 'cuda*'

# 삭제 여부 확인
$ sudo dpkg -l | grep 확인대상

# 삭제
$ sudo apt-get remove --purge 삭제대상

이렇게도 해보기를 추천..

 

 

Nvidia driver 설치

$ ubuntu-drivers devices


vendor   : NVIDIA Corporation
driver   : nvidia-driver-525-open - distro non-free
driver   : nvidia-driver-470 - 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
driver   : nvidia-driver-535-server-open - distro non-free recommended
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-535-open - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

vendor   : NVIDIA Corporation
model    : TU102 [GeForce RTX 2080 Ti Rev. A]
manual_install: True
driver   : nvidia-driver-450-server - distro non-free
driver   : nvidia-driver-418-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

추천 driver 확인을 했지만.. 나는 공통으로 추천되는게 없었으므로 위에서 서술했듯이 그냥 470으로 설치하기로 결정

 

# repository 추가
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update

# driver 설치
$ sudo apt-get install nvidia-driver-470

# 시스템 재시작
$ sudo reboot now

# nvidia-driver 설치 확인
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.199.02   Driver Version: 470.199.02   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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 ...  Off  | 00000000:5E:00.0 Off |                  N/A |
| 27%   27C    P8     1W / 250W |      7MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:B1:00.0 Off |                  N/A |
| 80%   72C    P2   253W / 350W |   5568MiB / 24268MiB |     46%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA GeForce ...  Off  | 00000000:D9:00.0 Off |                  N/A |
| 37%   46C    P8    10W / 350W |      3MiB / 24268MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

이렇게 한번에 됐으면 너무 좋았겠지만 나는 명령어로는 설치에 실패했다. 

그래서

https://www.nvidia.com/Download/Find.aspx?lang=en-us 

여기서 두개의 GPU모델에 공통으로 제공되는 드라이버가 470임을 다시 한번 확인한 뒤에,

https://www.nvidia.com/download/driverResults.aspx/205995/en-us/

Linux X64 (AMD64/EM64T) Display Driver
Version: 470.199.02
Release Date: 2023.6.26
Operating System: Linux 64-bit
Language: English (US)
File Size: 260.6 MB

이 드라이버를 선택해서 다운로드 후 설치해줬다.

$ sudo ./NVIDIA-Linux-x86_64-470.199.02.run

다운로드 파일 실행은 이렇게 해주면 된다.

 

그 다음에 reboot 후 nvidia-smi 명령어를 확인했더니 성공했다.

 

다음은,

 

CUDA 설치

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

Nvidia driver에 맞는 cuda를 설치한다.

 

참고로 nvidia-smi에 나오는 cuda버전은 실제 버전이 아니라 여기까지 설치가 가능하다는 것을 알려주는 것..

 

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

나는 여기에 접속해서 내 환경에 맞게 11.4를 선택하여 local로 설치했다. 

명령줄만 차례로 잘 따라가면서 설치하면 되서 어렵지 않다.

 

그 다음엔 path에 추가를 해줘야한다.

$ vim ~/.bashrc

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

$ source ~/.bashrc

이렇게 path에 추가를 해주고,

 

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Wed_Jun__2_19:15:15_PDT_2021
Cuda compilation tools, release 11.4, V11.4.48
Build cuda_11.4.r11.4/compiler.30033411_0

마지막으로 위와 같이 나오면 성공이다!

만약에 조회가 되지 않는다면 터미널을 재시작해서 다시 버전을 조회해보자

 

CUDNN 설치

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

마지막으로 cudnn을 설치해줘야 하는데 위 링크에서 내 버전에 맞는 cudnn을 선택해서 설치해야 한다.

나는 8.2.4를 선택했고 주황색으로 표시된 저 파일을 다운 받아서 설치했다.

tgz 파일이 다운받아지고,

$ tar -xzvf cudnn-11.4-linux-x64-v8.2.4.15.tgz

$ 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 2
#define CUDNN_PATCHLEVEL 4
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

#endif /* CUDNN_VERSION_H */

버전 확인이 제대로 된다면 성공이다!

 

Docker 설치

docker에서 gpus 옵션을 사용하기 위해 nvidia-docker2를 설치해줬다.

 

$ 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

먼저 기존 docker 를 제거해주고,

 

$ 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

$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2

위 순서대로 설치해준다.

$ docker --version
Docker version 24.0.2, build cb74dfc

이런 식으로 버전이 나온다면 성공이다!

 

최종적으로 내가 세팅한 버전 정보는 아래와 같다.

nvidia-driver: 470.199.02
CUDA: V11.4.48
cudnn: 8.2.4
docker: 24.0.2

 

 

참고: 

https://hwk0702.github.io/python/tips/2021/04/23/NVIDEA/

https://settembre.tistory.com/447

 

반응형