[Ubuntu20.04][WSL] CUDA 그래픽카드 잡기
WSL에서 그래픽카드 자원을 이용하여 텐서플로우를 이용하려면 WSL에서 그래픽 카드를 잡아줘야 한다.
우선 아래와 같은 조건이 충족해야 한다.
- WSL이 설치됨
- WSL에 Python이 설치됨 (버전 3.7)
- WSL에 venv 가상환경이 설치됨
- WSL에 텐서플로우가 설치됨 (버전 2.8)
- WSL 버전이 5.10.43.3 보다 높아야 함
- Windows에 그래픽 카드가 잡혀 있어야 함
- 그래픽 카드가 cuda를 지원해야 함
- NVIDIA Developer 계정이 있어야 함
WSL, Python, venv 설치법은 내 블로그에 작성되어 있음.
2022년 12월 이전의 자료입니다.
현재 버전과 맞지 않을 수 있고 기존 메모앱에 정리된 내용을 티스토리에 옮겨적었습니다.
전문가 수준의 내용이 아닙니다.
WSL 버전 확인 및 업데이트 방법
PowerShell을 실행하여 아래 명령어를 입력해보면 알 수 있다.
wsl cat /proc/version
만약 5.10.43.3보다 낮을 경우 아래 절차를 따릅니다.
- Windows 설정앱에서
- Windows 업데이트
- 고급옵션
- 기타 Microsoft 제품에 대한 업데이트 받기 (켬)
- 윈도우 재부팅
CUDA Toolkit 다운로드
우선 아래 사이트에서 텐서플로우 버전에 맞는 CUDA 버전을 확인합니다.
GPU 카테고리 쪽을 살펴보아야 합니다.
텐서플로우 2.8.0 버전은 쿠다 11.2버전을 지원합니다.
그 다음 아래 링크에서 CUDA 버전에 맞는 CUDA Toolkit를 다운로드 합니다.
저는 11.2.2를 다운받았습니다.
CUDA와 CUDAToolkit 버전이 같아야 하는지는 정확히 모르겠으나 삽질한 결과 해당 버전으로 성공을 하였습니다.
'CUDA Toolkit 11.2.2' 를 클릭하면 옵션들이 나오는데 아래 항목으로 선택합니다.
- Operation System → Linux
- Architecture → x86_64
- Distribution → WSL-Ubuntu
- Version → 2.0
- Installer Type → runfile (local)
해당 항목들을 선택하면 명령어 2줄이 나옵니다.
한줄 한줄 복사하여 WSL venv 환경에서 붙여넣어줍니다.
wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
sudo sh cuda_11.2.2_460.32.03_linux.run
아래 `sudo sh cuda_11.2.2_460.32.03_linux.run` 명령어를 실행한 다음 CUDA Toolkit 설치 절차를 따릅니다.
설치 절차를 따르다가 gcc 오류가 발생하면 바로 아래 내용을 참고해 볼것
혹시 gcc오류가 발생하나요?
보통 우분투 버전이 높아서 발생하는 문제라고 합니다.
아래 명령어로 해결이 가능할 수도 있다고 합니다.
sudo apt-get install build-essential
CUDA Toolkit 설치
방금 다운로드한 CUDA Toolkit을 설치해 보겠습니다.
아래 그림처럼 나오면 accept를 입력후 엔터
아래 그림처럼 나오면 Install을 방향키로 선택하고 Enter (캡처 누락으로 웹에서 가져온 사진)
아래 그림처럼 나오면 성공입니다.
PATH를 설정해 달라고 나와있습니다.
`sudo vi /etc/profile` 명령어로 아래처럼 PATH 설정 후 `:wq` (저장후 나가기) 입력 합니다.
export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/extras/CUPTI/lib64:$LD_LIBRARY_PATH
`source /etc/profile` 명령어로 적용시킵니다.
`nvcc -V` 명령어로 확인해 봅니다.
구동 확인
작업 디렉토리에서 test.py 파일을 생성해 주고 아래 내용을 넣어줍니다.
#Python
import sys
import numpy as np
import tensorflow as tf
from datetime import datetime
shape = (int(10000), int(10000))
with tf.device("/gpu:0"):
random_matrix = tf.random.uniform(shape=shape, minval=0, maxval=1)
dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
sum_operation = tf.reduce_sum(dot_operation)
startTime = datetime.now()
print("\n" * 2)
print("Time taken:", datetime.now() - startTime)
print("\n" * 2)
아래 명령어로 구동합니다.
python3.7 test.py
정상동작할 경우 걸린 시간과 어디에서 연산이 되었는지 나옵니다.
혹은 작업관리자를 옆에 켜두고 코드를 실행시키면 갑자기 그래픽 점유율이 수직상승하는 것을 확인할 수 있습니다.
혹시 NUMA 경고가 나오나요?
NUMA 오류는 WSL 세션의 부작용으로 텐서플로우를 사용하는것에 대해서는 지장이 없으니 무시해도 됩니다.
라이브러리 오류가 발생했을 경우
저는 여기서 삽질을 많이 했습니다.
여기에도 없는 라이브러리 오류, 버전 의존 오류 등등.. 제가 머리가 안좋은지.. 정말 많이 venv를 지우고 만들고를 반복했습니다.
libcudnn.so.8 오류 해결 방법
오류 내용
Could not load dynamic library 'libcudnn.so.8'; dlerror: libcudnn.so.8: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-11.2/extras/CUPTI/lib64:/usr/local/cuda-11.2/lib64:
여기서 부턴 NVIDIA Developer 계정이 있어야 합니다.
계정을 생성하고 간단한 설문조사만 하면 사용할 수 있으니 이참에 만들어 두세요.
아래 링크에 접속후 로그인 합니다.
아래 사진에서 체크 후 아래 절차를 따르세요.
- ‘ I Agree To the Terms of the cuDNN Software License Agreement ‘ 선택
- ‘ Download cuDNN v8.7.0 (November 28th, 2022), for CUDA 11.x ‘
- ‘ Local Installer for Linux x86_64 (Tar) '
해당 파일을 WSL에 집어넣어 줘야 한다.
만약 WSL 이 정상 설치되었으면 윈도우 탐색기 왼쪽 사이드바 맨 아래 Linux 라는 카테고리가 생겼을 것이다.
해당 Linux카테고리에 접속하면 현재 설치된 리눅스 버전(Ubuntu-20.04) 폴더가 있고 해당 폴더 내에 리눅스 디렉토리들이 있다.
편한 디렉토리에 넣은 후 `cd` 명령어로 방금 넣은 디렉토리로 이동 후 압축을 풀어준다.
tar Jxvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz
압축을 풀면 "cudnn-linux-x86_64-8.7.0.84_cuda11-archivecudnn-linux-x86_64-8.7.0.84_cuda11-archive" 디렉토리가 생성됐을 것이다.
`cd cudnn-linux-x86_64-8.7.0.84_cuda11-archivecudnn-linux-x86_64-8.7.0.84_cuda11-archive/bin' 명령어로 디렉토리 내부/bin 디렉토리로 이동한다.
디렉토리 이동 후 `ls`명령어를 입력하면 libcudnn.so.8 을 찾을 수 있다.
아래 내용은 lib 디렉토리에 있는 내용들이다.
libcudnn.so libcudnn_adv_infer_static.a libcudnn_adv_train_static_v8.a libcudnn_cnn_train.so libcudnn_ops_infer.so.8 libcudnn_ops_train.so.8.7.0
libcudnn.so.8 libcudnn_adv_infer_static_v8.a libcudnn_cnn_infer.so libcudnn_cnn_train.so.8 libcudnn_ops_infer.so.8.7.0 libcudnn_ops_train_static.a
libcudnn.so.8.7.0 libcudnn_adv_train.so libcudnn_cnn_infer.so.8 libcudnn_cnn_train.so.8.7.0 libcudnn_ops_infer_static.a libcudnn_ops_train_static_v8.a
libcudnn_adv_infer.so libcudnn_adv_train.so.8 libcudnn_cnn_infer.so.8.7.0 libcudnn_cnn_train_static.a libcudnn_ops_infer_static_v8.a
libcudnn_adv_infer.so.8 libcudnn_adv_train.so.8.7.0 libcudnn_cnn_infer_static.a libcudnn_cnn_train_static_v8.a libcudnn_ops_train.so
libcudnn_adv_infer.so.8.7.0 libcudnn_adv_train_static.a libcudnn_cnn_infer_static_v8.a libcudnn_ops_infer.so libcudnn_ops_train.so.8
여기서 오류 내용을 다시한번 보자
Could not load dynamic library 'libcudnn.so.8'; dlerror: libcudnn.so.8: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-11.2/extras/CUPTI/lib64:/usr/local/cuda-11.2/lib64:
오류 내용을 읽어보면
- /usr/local/cuda-11.2/extras/CUPTI/lib64
- /usr/local/cuda-11.2/lib64
디렉토리에서 libcudnn.so.8 을 찾을 수 없다고 나왔다.
그러므로 cudnn-linux-x86_64-8.7.0.84_cuda11-archivecudnn-linux-x86_64-8.7.0.84_cuda11-archive/bin 디렉토리에서 libcudnn.so.8 파일을 해당 디렉토리들에게 복사해주자
cp libcudnn.so.8 /usr/local/cuda-11.2/extras/CUPTI/lib64
cp libcudnn.so.8 /usr/local/cuda-11.2/lib64
다시 위의 내용 `구동확인` 절차를 따른다.
꼭 libcudnn.so.8 오류 말고도 다양한 오류들이 생길 수 있다.
cuDNN/lib 디렉토리에 없는 라이브러리 오류도 많았다.
머리가 안좋았던 것인지, 검색 능력이 없었던 것인지.. 엄청 많이 삽질을 했었다.
만약 오류를 해결하다 뭔가가 꼬여서 다시 지워야 할 상황이 온다면 생성해줬던 venv를 지우고 다시 venv를 만들어줘 반복하면 된다.
'Linux | PowerShell > [WSL][CUDA] TensorFlow 설치 과정' 카테고리의 다른 글
[Ubuntu20.04][WSL] Tensorflow2.8 & Keras2.6설치 (0) | 2023.05.26 |
---|---|
[Ubuntu20.04][WSL] 파이썬의 venv 모듈 설치 (0) | 2023.05.26 |
[Ubuntu20.04][WSL] Python3.7 설치 (0) | 2023.05.26 |