[Nvidia][Docker] 컨테이너에서 GPU 돌리기!
아래는 시행착오 글입니다.
https://splendidlolli.tistory.com/648
gpu 세팅하기는 버전호환 문제가 있어 꽤나 까다롭습니다.
tmi를 말하자면 저는 컨테이너에 GPU를 구동하기 위해 필요한 것들을 설치할 때마다 시간을 굉장히 (하루이틀 온종일) 소비했습니다. 그러나 몇달전 도전에서 실패, 몇주전에도 실패했습니다. 그리고 이번에 성공했습니다! 실패의 이유는 잘 이해하지 못한 채로 인터넷에 돌아다니는 것을 복붙하며 진행하다보니 이것저것 꼬였기 때문입니다.
오랜시간 반복하여 시도한 끝에,
이제는 저도 설치과정을 분명하게 정리할 수 있게 되었습니다.
최종으로 여기 다시 정리합니다.
1. 호스트 시스템에 nvidia driver 설치하기
2. GPU 옵션 주고 컨테이너 띄우기
3. cuda와 cudnn 설치하기
4. Tensorflow 설치하기
+. Torch 설치
+. 그리고 제가 설치한 상황 공유
참고) 설치에 앞서
- root계정인 경우 sudo를 빼고 진행합니다.
- 각자의 상황에 맞게 조절해가며 진행합니다.
참고) 혹시 다른 버전을 사용해야 할 경우 호환성을 이 링크에서 확인합시다.
https://www.tensorflow.org/install/source#install_gpu_support_optional_linux_only
(혹시 이전에 설치하다가 꼬였다면, 깨끗하게 제거하고 재설치합니다.)
(찾아서 '더보기'에 모아놓았습니다.)
dpkg -l | grep -i nvidia (현재 설치된 Nvidia 드라이버 패키지를 확인 가능)
저장소 업데이트
sudo apt-get update
sudo apt-get upgrade
기존 NVIDIA 제거
sudo apt-get purge nvidia*
sudo apt-get remove --purge '^nvidia-.'
sudo apt remove --purge nvidia-*
sudo apt-get autoremove
sudo apt-get autoclean
기존 CUDA 제거
sudo rm /etc/apt/sources.list.d/cuda*
sudo rm -rf /usr/local/cuda*
sudo apt-get --purge remove ‘cuda*’ *
sudo apt-get autoremove --purge 'cuda'
sudo apt remove --autoremove nvidia-cuda-toolkit
잔여파일 제거 (뜨는 거 전부 제거해야 함)
sudo dpkg -l | grep nvidia
sudo apt-get remove --purge OOO
sudo dpkg -l | grep cuda
sudo apt-get remove --purge OOO
1. 호스트 시스템에 nvidia driver 설치하기
가장 먼저,
시스템에 GPU 드라이버를 설치하여 GPU를 잡을 수 있어야 합니다.
다음 과정으로 설치할 수 있습니다.
추천 드라이버 확인하기
- ubuntu-drivers devices
* 참고: 컨테이너에서 GPU 돌릴 거면, 컨테이너에서도 권장 드라이버 확인해봐야 할 듯요? (추측)
- 혹시 이런 오류가 뜬다면? ubuntu-drivers: command not found 및 Unable to locate package ubuntu-driver-common
- 어엇 혹시... CUDA 버전과 맞추려면 여기서 호환 참고: https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
추천받은 or 설치할 드라이버 버전 설치
- sudo apt install nvidia-driver-470
시스템 리부트
- sudo reboot
정상 설치 확인
- nvidia-smi
2. gpu 옵션 주고 컨테이너 띄우기
※ docker 19버전 이후일 경우 진행 가능 (웬만하면 가능)
설치하기
apt-get install nvidia-container-runtime
설치 확인
which nvidia-container-runtime-hook
도커 재시작 필요
sudo systemctl restart docker
여기까지 해야 gpu옵션을 주고 up이 가능합니다.
아래 과정 이어서 갑시다!
컨테이너 run으로 띄울때 gpu옵션 주기
이제 gpu를 잘 잡는지 확인하기 위해, 컨테이너 띄울 때 --gpus 옵션 줘서 띄워보면 된다.
그 컨테이너에서 nvidia-smi 명령을 통해 gpu가 인식되는지 확인할 수 있다.
docker run -it --rm --gpus all ubuntu nvidia-smi
* 혹시 docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 가 뜬다면?
음... 저는 위에 언급한 nvidia-container-runtime을 설치했더니 저 에러가 사라졌긴 합니다.
그런데 예전에는 아래와 같은 방법으로 해결했어요!
nvidia-container-toolkit 설치하면 해결된다.
1. nvidia repository 추가하기
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
2. nvidia-container-toolkit 설치하기
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
3. docker service 재시작
sudo systemctl restart docker
docker-compose.yaml에 gpu 지정 방법
* docker-compose v1.28.0 이상 가능 (이것도 현시점 웬만하면 가능)
run으로 띄우지 않고 docker-compose.yaml을 사용한다면, 컨테이너 서비스 아래 다음 설정을 추가한다.
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
3. CUDA와 cudnn 설치하기
이번에는 GPU를 돌릴 대상 컨테이너에 적절한 버전의 CUDA와 cudnn을 설치합니다.
3.1. CUDA
CUDA 설치 링크
설치 진행
(위 설치링크에서 아래와 같은 설치명령이 안내됩니다. 본인 버전에 맞게 링크에서 직접 얻기!)
(아래 명령은 순전히 예시입니다.)
- sudo apt install wget
- wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
- sudo sh cuda_11.1.0_455.23.05_linux.run
- 설치 진행하면 된다 (continue → accept → Install, 이때 driver(nvidia driver)는 이미 설치했으므로 선택해제함)
bashrc 파일 수정
- sudo apt install vim
- vim ~/.bashrc
- PATH 추가 (/usr/local/ 경로에, 예를들면, cuda-11.1 디렉토리 있음. 버전에 맞게 경로 수정.)
## CUDA and cuDNN paths
export PATH=/usr/local/cuda-11.1/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:${LD_LIBRARY_PATH}
수정된 bashrc를 적용하기
- source ~/.bashrc
설치 확인
- nvcc -V
3.2. cudnn
설치 링크: https://developer.nvidia.com/rdp/cudnn-archive
링크에서 설치할 cudnn을 선택한 뒤, 컨테이너의 아키텍처에 맞게 선택하여 진행하시면 됩니다.
아키텍처는 uname -a로 확인할 수 있습니다.
제 컨테이너: Linux 489564e28ecc 5.15.0-83-generic #92~20.04.1-Ubuntu SMP Mon Aug 21 14:00:49 UTC 2023 x86_64 GNU/Linux
그래서 저는 Linux x86_64를 선택하면 되겠습니다.
압축풀기
[예시] (받은 파일 tar... tar.xz... deb 등등.. 에 따라서 tar 또는 dpkg ... 알맞게 압축해제)
- tar -xzvf cudnn-x.x-linux-x64-v8.x.x.x.tgz
- sudo dpkg -i libcudnn8_8.2.1.32-1+cuda11.3_amd64.deb
적절한 위치로 복사하기 및 권한 부여
주의1: 압축푼 경로에 cuda 디렉토리가 생성됨. 꼭 그렇지는 않음. 디렉토리 이름이 cudnn-linux-x86_64-8.6.0.163_cuda11-archive일 수도 있음. "확인 하고" 상황에 맞게 하면 된다.
주의2: lib64일 수도, lib일 수도 있음. 나는 lib에서 lib64로 복사해야하는 상황이었음. 이것도 상황에 맞게 체크해서 진행!
- 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
4. Tensorflow 설치하기
아래 링크에서, cuda와 cudnn, 그리고 python version과 호환되는 tensorflow version을 확인할 수 있습니다.
https://www.tensorflow.org/install/source#install_gpu_support_optional_linux_only
상황에 맞게 설치진행하면 되겠습니다.
이쯤 하고 돌려보니..
컨테이너에서 gpu가 돌아가는 것을 확인했습니다.
+. Torch 설치
torch또한 cuda와 호환을 맞춰야 합니다.
호환 확인하기
https://pytorch.org/get-started/previous-versions/
저의 최종 설치 버전
[결정의 과정]
torch1.8.1+cu111를 설치하려니까 cuda가 11.1이네?
그냥 torch 저거 설치하고 기존의 11.2로 돌려봤는데 음.. 평소랑 똑같았다.
그런데 내가 원래 cuda 문제를 겪던 참이라, 버전 호환성에 예민했다.
어차피 해결 안되면 진행못하는데, 버전 호환 완벽하게 맞춰보자.. 해서 다시 도전!
기존 라이브러리와 호환도 고려하다보니... 버전을 전체적으로 up해 재설치하게 되었습니다.
[라인 확인]
이런 라인업으로 맞추려 합니다.
[Driver 버전업!]
Driver도 버전업해줄 겁니다.
기존 470버전 드라이버가 권장하는 cuda가 11.4인데 저는 11.8을 깔 거라서요..
일단 무작정 Driver 버전업 해보았습니다
(공홈에서 cuda, driver 호환 확인 가능)
recommended된 대로, apt install nvidia-driver-535-server-open이지만 저는 그것을 깔지 않겠습니다.
cuda 호환에 맞추려고 합니다. 음.. 460 이상.. 설치해볼까요..
시스템과 컨테이너의 권장 드라이버를 모두 확인해주었습니다.
원래 535를 깔았는데, 컨테이너에서 드라이버 권장 목록에 없더라고요
그래서 470을 설치해주려 합니다.
잘 설치 완료!
시스템과 컨테이너에서 nvidia-smi를 확인 가능합니다.
이제는 컨테이너에 CUDA, cuDNN, tensorflow, torch를 설치하고...
저희 서비스를 돌려봅시다..
(gpu 사용할 때 cuda error가 안 떴으면 좋겠어요)
[CUDA 11.8]
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
[cuDNN v8.6.0]
cuDNN v8.6.0 (October 3rd, 2022), for CUDA 11.x
[torch 2.0.0+cu118]
# CUDA 11.8
pip install torch==2.0.0+cu118 torchvision==0.15.1+cu118 torchaudio==2.0.1 --index-url https://download.pytorch.org/whl/cu118
[tensorflow 2.12.0]
pip install tensorflow==2.12.0
과연 결과는? (제발)
다 잘 돌아간다! 완성!
spleeter도, whisper도 모두 gpu를 사용해서 돌아간다.