2021. 2. 10. 06:25ㆍ설치법/시스템
시작하면서
향후 CUDA와 cuDNN을 사용할 기회가 있을 것 같아, 기록으로 남겨둡니다.
설치법은 NVIDIA 공식 문서를 참고하였고 그래픽카드는 NVIDIA gtx 1650 super, 운영체제는 Ubuntu 20.04 LTS 입니다.
~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
CUDA와 cuDNN이란?
CUDA는 GPU를 활용한 병렬 컴퓨팅 플랫폼이자 컴퓨팅 모델입니다.
즉, 복잡한 병렬 연산 처리 코딩을 할 필요가 없이 CUDA 내 API 함수를 하나 사용하면 우리에게 매우 빠른 결과를 가져다줍니다.
CUDA is a parallel computing platform and programming model that makes using a GPU for general purpose computing simple and elegant.
예로 아래 두 코드를 볼까요?
Non-CUDA
void saxpy(int n, float a, float *x, float *y)
{
for (int i = 0; i < n; ++i)
y[i] = a*x[i] + y[i];
}
int N = 1<<20;
// ax+y를 계산하고 싶다.
saxpy(N, 2.0, x, y)
CUDA
void saxpy(int n, float a, float *x, float *y)
{
int i = blockIdx.x*blockDim.x + threadIdx.x;
if (i<n) y[i] = a*x[i] + y[i];
}
int N = 1<<20;
cudaMemcpy(x, d_x, N, cudaMemcpyHostToDevice);
cudaMemcpy(y, d_y, N, cudaMemcpyHostToDevice);
// ax+y를 계산하고 싶다.
saxpy<<<4096,256>>>(N, 2.0, x, y)
cudaMemcpy(d_y, y, N, cudaMemcpyDeviceToHost);
Non-CUDA 버전의 C코드는 x와 y 내 원소를 하나씩 가져와 연산을 수행합니다. 반면에 CUDA 버전의 C 코드는 x와 y를 CUDA 메모리에 적재하면(CUDA 행렬로 변환하면) 한 번에 4096번의 계산을 할 수 있는 스레드를 256개 만듭니다.
연산 속도가 체감이 될까요?
cuDNN은 CUDA 플랫폼을 위에서 동작하는 딥러닝에 특화된 라이브러리입니다.
The NVIDIA CUDA® Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers.
우리가 잘 알고있는 Keras나 PyTorch, TensorFlow 패키지는 cuDNN 위에서 매우 효과적으로 동작합니다.
그럼 이제 설치를 시작해볼까요?
그래픽카드 드라이버 설치
NVIDIA 드라이버 다운로드 사이트에 방문해서 아래와 같이 본인의 그래픽 카드 정보를 작성하고 다운로드해줍니다.
그다음 다운로드 폴더로 가서 다음과 같이 작성하여 드라이버를 설치합니다.
~$ cd Downloads
~/Downloads$ chmod a+x NVIDIA-Linux-x86_64-460.39.run
~/Downloads$ sudo ./NVIDIA-Linux-x86_64-460.39.run
[sudo] password for - :
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 460.39.....................................
저의 경우에는 이미 설치가 되어 있어 아래와 같이 떴네요.
어쨌든 아래 명령어를 실행하면 드라이버가 제대로 설치되어 있음을 확인할 수 있습니다.
$ nvidia-detector
nvidia-driver-460
CUDA 설치하기
엄밀히 말하면 CUDA Toolkit을 설치하면 됩니다. 여기서는 공식 설치 문서를 참조하여 진행하겠습니다.
가장 중요한 것은 본인의 그래픽카드가 CUDA를 사용할 수 있는지 알아보는 것이 필요합니다.
먼저 아래 명령어를 통해 정확히 본인의 그래픽카드가 무엇인지 알아봅니다.
~$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation TU116 [GeForce GTX 1650 SUPER] (rev a1)
01:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU116 [GeForce GTX 1650 SUPER] (rev a1)
그리고 CUDA 가능 GPU 목록에 방문하여 본인의 그래픽카드가 있는지 알아보면 됩니다.
제 경우에는 GeForce GTX 1650 SUPER인데... 없네요?
당황하지 말고 아래 사이트에 방문합니다.
비교적 최근에 나온 그래픽카드들은 사실 모두 쿠다 코어를 가지고 있습니다.
저 또한 위 그래픽카드를 구매할 때 쿠다 코어가 증가했다는 글을 보았었는데, 역시나 아래처럼 쿠다를 지원합니다.
주의할 점! 쿠다 버전을 꼭 확인하세요.
우선 그래픽카드 드라이버에 해당하는 nvidia utils를 설치해줍니다.
~/Downloads/nanum$ nvidia-detector
nvidia-driver-460
~/Downloads/nanum$ sudo apt-get install nvidia-utils-460
그리고 툴킷을 설치해줍니다. 참고로 위에서 CUDA가 7.5였는데 이는 수행 능력(capability)을 의미합니다.
위키피디아를 참고하면 CUDA 10.0 ~ 10.2까지 설치 가능하다는 것을 알 수 있습니다.
이제 설치해봅니다.
~/Downloads/nanum$ sudo apt install nvidia-cuda-toolkit
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
cpp-8 g++-8 gcc-8 gcc-8-base javascript-common libaccinj64-10.1 libcublas10
libcublaslt10 libcudart10.1 libcufft10 libcufftw10 libcuinj64-10.1 libcupti-dev
libcupti-doc libcupti10.1 libcurand10 libcusolver10 libcusolvermg10 libcusparse10
libegl-dev libgcc-8-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libglvnd-dev
libglx-dev libjs-jquery libjs-underscore libmpx2 libncurses5 libnppc10 libnppial10
libnppicc10 libnppicom10 libnppidei10 libnppif10 libnppig10 libnppim10 libnppist10
libnppisu10 libnppitc10 libnpps10 libnvblas10 libnvgraph10 libnvidia-ml-dev
libnvjpeg10 libnvrtc10.1 libnvtoolsext1 libnvvm3 libopengl-dev libopengl0
libstdc++-8-dev libthrust-dev libtinfo5 libvdpau-dev libvdpau1 mesa-vdpau-drivers
node-html5shiv nsight-compute nsight-systems nvidia-cuda-dev nvidia-cuda-doc
nvidia-cuda-gdb nvidia-opencl-dev nvidia-profiler nvidia-visual-profiler
ocl-icd-libopencl1 ocl-icd-opencl-dev opencl-c-headers vdpau-driver-all
Suggested packages:
gcc-8-locales g++-8-multilib gcc-8-doc gcc-8-multilib apache2 | lighttpd | httpd
libstdc++-8-doc libvdpau-doc nodejs nvidia-driver | nvidia-tesla-440-driver
| nvidia-tesla-418-driver libpoclu-dev libvdpau-va-gl1 nvidia-vdpau-driver
nvidia-legacy-340xx-vdpau-driver nvidia-legacy-304xx-vdpau-driver
Recommended packages:
libnvcuvid1
The following NEW packages will be installed:
cpp-8 g++-8 gcc-8 gcc-8-base javascript-common libaccinj64-10.1 libcublas10
libcublaslt10 libcudart10.1 libcufft10 libcufftw10 libcuinj64-10.1 libcupti-dev
libcupti-doc libcupti10.1 libcurand10 libcusolver10 libcusolvermg10 libcusparse10
libegl-dev libgcc-8-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libglvnd-dev
libglx-dev libjs-jquery libjs-underscore libmpx2 libncurses5 libnppc10 libnppial10
libnppicc10 libnppicom10 libnppidei10 libnppif10 libnppig10 libnppim10 libnppist10
libnppisu10 libnppitc10 libnpps10 libnvblas10 libnvgraph10 libnvidia-ml-dev
libnvjpeg10 libnvrtc10.1 libnvtoolsext1 libnvvm3 libopengl-dev libopengl0
libstdc++-8-dev libthrust-dev libtinfo5 libvdpau-dev libvdpau1 mesa-vdpau-drivers
node-html5shiv nsight-compute nsight-systems nvidia-cuda-dev nvidia-cuda-doc
nvidia-cuda-gdb nvidia-cuda-toolkit nvidia-opencl-dev nvidia-profiler
nvidia-visual-profiler ocl-icd-libopencl1 ocl-icd-opencl-dev opencl-c-headers
vdpau-driver-all
...
끝나면 재부팅을 해줍니다.
$ reboot
이후 아래 명령어를 실행하면 정상적으로 설치가 되었음을 알 수 있습니다. 저는 10.1 버전이 설치되었네요.
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
이제 테스트를 진행해봅니다.
cuda-samples git 페이지를 방문하면 NVIDIA에서 배포한 CUDA 샘플 코드들을 만날 수 있습니다.
~$ git clone https://github.com/NVIDIA/cuda-samples.git
Cloning into 'cuda-samples'...
remote: Enumerating objects: 1634, done.
remote: Counting objects: 100% (1634/1634), done.
remote: Compressing objects: 100% (329/329), done.
remote: Total 3080 (delta 1444), reused 1425 (delta 1301), pack-reused 1446
Receiving objects: 100% (3080/3080), 30.13 MiB | 873.00 KiB/s, done.
Resolving deltas: 100% (2640/2640), done.
$
저는 CUDA 10.1 버전이므로 해당 버전에 대한 업데이트가 담긴 커밋을 추적했습니다.
$ cd cuda-samples/
~/cuda-samples$ ls
bin Common LICENSE Makefile README.md Samples
~/cuda-samples$ git reset --hard b458dafcd620d73e67a6fa2f67c336e3a8d301c7
HEAD is now at b458daf Add and update samples with CUDA 10.1 support
이때, make 하기 전 CUDA의 경로를 환경 변수에 등록해야 됩니다. (기본은 /usr/local/cuda입니다.)
$ gedit ~/.bashrc
export CUDA_PATH=CUDA의 경로
export CUDA_SEARCH_PATH=libcuda.so의 경로
(저장 후 종료)
$ source ~/.bashrc
경로를 찾기 어려우면 sudo find /usr/ -name *찾고자 하는 이름\ 을 실행해보세요.*
이제 make 해서 컴파일해줍니다.
$ cd ~/cuda-samples
~/cuda-samples$ make
...
make[1]: Leaving directory '/home/park/mySystem/cuda-samples/Samples/simpleCUFFT'
make[1]: Entering directory '/home/park/mySystem/cuda-samples/Samples/vectorAdd_nvrtc'
g++ -I../../Common -I/usr/lib/nvidia-cuda-toolkit/include -o vectorAdd.o -c vectorAdd.cpp
g++ -o vectorAdd_nvrtc vectorAdd.o -L/usr/lib/x86_64-linux-gnu -lcuda -lnvrtc
mkdir -p ../../bin/x86_64/linux/release
cp vectorAdd_nvrtc ../../bin/x86_64/linux/release
make[1]: Leaving directory '/home/park/mySystem/cuda-samples/Samples/vectorAdd_nvrtc'
Finished building CUDA samples
위처럼 오류 없이 잘 되어야 합니다!
이제 아래처럼 쉘 스크립트 파일을 만들고 테스트해봅니다.
~/cuda-samples$ gedit cudaTest.sh
#!/bin/sh
executables=( $(find ./Samples -perm -u+x -type f) )
for ((i=0; i<${#executables[@]}; i++))
do
if [[ ${executables[i]} != *".h"* && ${executables[i]} != *".cpp"* ]]; then
${executables[i]}
fi
done
echo "Test done."
(작성 후 저장)
~/cuda-samples$ bash cudaTest.sh
좌르르륵 문제가 없이 잘 결과가 나오면 성공입니다!
cuDNN 설치하기
Tensorflow를 예로 들면, 아래에서 CUDA 10.1을 지원하는 cuDNN은 7.6 버전임을 알 수 있습니다. Ubuntu 20.04 LTS는 기본으로 python 3.8이 설치되므로 tensorflow-2.3.0을 타겟으로 하겠습니다.
cuDNN 아카이브에 방문하면 cuDNN을 얻을 수 있습니다.
위 그림에서 밑줄 친 cuDNN Librariy for Linux를 눌러 다운로드해주세요. 그리고 아래처럼 파일들을 옮겨줍니다.
$ cd $CUDA_SEARCH_PATH
/usr/lib/x86_64-linux-gnu$ sudo cp -r ~/Downloads/cuda/include/* .
/usr/lib/x86_64-linux-gnu$ sudo cp -r ~/Downloads/cuda/lib64/* .
Tensorflow GPU 실행해보기
아래 명령어를 실행하면 tensorflow 2.3.0 버전이 설치됩니다.
$ pip3 install tensorflow==2.3.0
만약 아래와 같은 경고문이 뜬다면 환경 변수를 추가해주세요.
WARNING: The script markdown_py is installed in '/home/park/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
이제 예제 코드를 실행해봅니다. 아래 코드는 GPU가 가능한 tensorflow인지와 사용 가능한 gpu 장치 목록을 보여줍니다.
import tensorflow as tf
is_cuda = tf.test.is_built_with_cuda()
gpu_devices = tf.config.list_physical_devices('GPU')
print("Tensorflow built with {}, This GPU device are ready for computing : {}".format(
is_cuda, gpu_devices
))
실행 결과가 아래와 같다면 성공입니다!
...
Tensorflow built with True, This GPU device are ready for computing : [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
끝내면서
이상으로 모든 설치를 마쳤습니다.
역시 정리하면서 하니까 몸도 힘들고 시간이 정말 많이 소요되었네요.
그래도 다음번에 다시 설치할 기회가 있을 때, 매우 유용할 것 같습니다!
'설치법 > 시스템' 카테고리의 다른 글
Ubuntu 22.04 블루투스 동글 설치법 (0) | 2024.04.08 |
---|---|
Ubuntu Python 설치법 (0) | 2024.04.08 |
rclone으로 리눅스(우분투)와 구글드라이브 연동하기 (0) | 2021.03.01 |