머신러닝AI2024. 4. 27. 16:46

AI로 무엇을 하다보면 linux에 GPU로 환경을 구성하는데, 도대체 잘 이해가 가지 않는 것이 이 버전 관계다.

Ubuntu 버전, GPU 버전, NVidia driver버전, cuda 버전, cudnn 버전... 등등 헷갈린다. 이제 그 관계를 이해해보자.

 

결론은 지금 '24년초 시점에서는 Ubuntu 22.10, NVidia driver는 GPU버전에 맞는것(홈페이지 참조), CUDA는 11.8을 중심으로 설치하자. cudnn은 8.7 정도를 선택하면 되고 쉽게 바꿀 수 있다. 각각의 버전을 바꾸고 싶은데 다시 깔아야 할지 고민인가? 아래를 따라가보자.

 

 

0. 요약해보면 아래와 같다

  A. NVidia driver는 여러개를 설치할 수 없고 내 GPU, 원하는 CUDA버전에 맞는 가장 최근의 driver를 설치한다

  B. CUDA는 여러개의 버전을 설치해서 LD_LIBARY_PATH만 잘 바꾸면 그때그때 바꾸어 쓸 수 있다

  C. cudnn은 CUDA안에 library만 교체하면 되므로 역시 필요할때마다 특정 CUDA버전의 버전을 덮어쓸 수 있다.

       만약에 cudnn도 같은 CUDA에 여러가지 버전을 쓰려면 똑같은 CUDA를 여러개 복사해서 설치 한후, 그 각각에 cudnn을 설치하고 LD_LIBARY_PATH를 변경해서 쓰는 신공도 가능하다. cuda-11.8.A, cuda-11.8.B 식으로 설치하는 식이겠다

 

 다만 버전 결정 순서는, 내가 쓸 프레임웍이 지원한는 CUDA 버전은? 그에 맞는 내 GPU에 호환되는 NVidia driver 버전은? 그에 맞는 cudnn버전은? 그리고 python 버전은? 식으로 결정되어 간다. cuda, cudnn, python은 여러개의 버전을 설치해놓고 번갈아가면서 쓸 수 있다.

 

1. 먼저 필요한 CUDA 버전이 중요하다. CUDA 11.8이 가장 많이 호환되는 CUDA 버전이다.

 

 판단기준 : 내가 쓰는 프레임웍(pytorch, tensorflow?)이 지원하는 CUDA는 무엇인가? 대개 11.8이다

 

 CUDA는 최근에 11, 12시리즈가 시장에서 주력으로 사용되는데, 많은 오픈소스 ML 프레임웍이 11버전을 지원한다.

 특히 우리의 가장 중요한 친구 pytorch 2.1 미만 버전들이 CUDA 11에 의존한다. tensorflow나 주력으로 쓰는 framework들이 지원하는 버전을 확인해서 만약에 CUDA 12를 지원한다면 12버전을 쓸 수도 있겠다. 하지만 아직은 최신 프레임웍의 버전들만 간신히 지원하는 CUDA12를 쓸 용기는 없다. 우리는 가져다 쓰는 기존 소스코드들은 예전 버전인 경우가 더 많기 때문이다. 물론 CUDA12에 최신 버전 프레임웍을 설치해서 새로 소스코드를 짤 수도 있겠지만 그런 경우는 흔하지 않겠다.

 

 그러니 CUDA 11.8을 설치하자. 참고로 아래는 tensorflow의 버전별 CUDA + cudnn 버전이다. 각 프레임웍들이 각각 이런 정보를 공개한다.

https://www.tensorflow.org/install/source?hl=ko#gpu

 

 그리고 CUDA를 여러가지 버전으로 설치할 수 있을까? 정답은 Yes이다. 원하는 CUDA버전을 설치하면

 /usr/local/cuda-x-x/ 식으로 설치되고 이 디렉토리가 /usr/local/cuda로 심볼릭 링크가 걸린다(어떤 패키지들은 이 /usr/local/cuda를 참조하기 때문이다)

 

여러개의 cuda버전을 어떻게 참조할까? 바로 LD_LIBRARY_PATH라는 lib파일 참조 경로를 바꾸면 된다. 이 설정을 각 계정의 .bashrc에 반영하면 기 계정으로 로그인하면 해당 환경을 자동으로 사용하게 된다. 계정마다 별도의 설정으로 진행하자.

 

$ export PATH=/usr/local/cuda-x-x/bin:${PATH}

$ export LD_LIBRARY_PATH=/usr/local/cuda-x-x/lib64:${PATH}

 

 심볼릭 링크를 바꾸어 주어야 하는 상황이면 아래처럼 한다

 

$ cd /usr/local/

$ ls -al cuda          #해당 명령으로 지금은 어느 버전으로 연결되었는지 확인하자

 cuda -> cuda-y-y

$ rm cuda

$ ln -s /usr/local/cuda-x-x cuda

 

CUDA를 설치할때는 linux의 경우 아래와 같이 run local을 다운로드 받은 후 아래 driver를 먼저 설치한 후, 실제 CUDA설치시에는 해당 driver를 skip하고 설치하여 혼란을 방지한다.

NVidia에서 다운로드 받을때 예시(runfile로 받아서 driver는 아래 먼저 깔고, 여기서는 skip한다)

 

아래 드라이버와 CUDA설치가 같이 이루어지게 되는데, 잘 맞지 않는다면 언제나 아래 명령으로 처음부터 다시 설치할 수 있다.

 

$ sudo apt install -y ubuntu-drivers-common   #맨처음이라면

 

$ sudo apt-get purge nvidia*

$ sudo apt-get autoremove

$ sudo apt-get autoclean

$ sudo rm -rf /usr/local/cuda*

 

$ sudo apt install build-essential      #gcc가 없는 경우

$ sudo ubuntu-drivers devices     #추천 nvidia drivers를 찾을 수 있다(recommended)

$ sudo apt install nvidia-driver-535  #추천받은버전

$ reboot

 

이후 cuda를 다시 설치하되, nvidia driver만 skip하고 설치한다.

(ex> $ sudo sh cuda_11.8.0_520.61.05_linux.run  / nvidia driver는 uncheck하고 진행)

 

2. NVidia driver는 아래와 같은 CUDA와의 호환 관계를 갖는다. 최신 CUDA는 최신 NVidia driver가 필요하다.

 

 판단기준 : 내가 쓰는 CUDA 버전이 최신일수록, 최신의 NVidia driver를 가져다 설치해야 하는데, 내가 가진 GPU카드별로 지원하는 Driver 버전이 다르다. 오래되거나 어떤 GPU는 Driver 버전 지원도 나쁘다. 거꾸로 내가 써야할 CUDA 버전을 지원하는 NVidia driver를 지원하는 GPU를 사야할 수도 있다. 

 

 즉 어느정도 Driver 버전 이상이 되어야, 최근의 CUDA 버전이 지원된다. Linux와 Windows가 조금 다른 것에 주의하자.

아래가 대략의 정보이고 세부 정보는 이 링크를 확인해보자. https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

 

 그리고 언급했듯이, 유의할 것은 해당 Driver 버전 중 일부는 특정 GPU 카드를 지원하지 않을 수 있다. 따라서 내가 가진 GPU 카드가 지원되는 드라이버 버전을 선택하자. 각 지원 버전은 NVidia 사이트에서 역시 확인이 가능하다. 신기하게도 GPU마다 지원되는 버전이 들쑥날쑥하니 꼭 내 GPU카드가 지원하는 버전을 확인해두어야 한다.

 

 혹시 내가 설치해서 쓸 OS Linux Package들이 이 드라이버 버전을 띄엄띄엄 지원할 수도 있으니, 아예 Linux에서 배포판 별로(ubuntu?) 지원되는 버전별로 찾아봐서 내 GPU를 지원하는지 확인할 수도 있다.

 

https://www.nvidia.co.kr/Download/index.aspx?lang=kr

 

대략 NVidia driver 525나 520, 515버전 등을 많이 설치하긴 한다. 여기서는 CUDA 11.8을 추천하려고 하므로 520이상 버전을 설치하려고 노력해보자.

 

참고로 아래 명령을 통해 linux에 설치된 GPU정보나, 추천 드라이버를 제공받을 수 있다

 

$ lshw -C display           #RTX4080예시이다

  *-display                 
       description: VGA compatible controller
       product: NVIDIA Corporation
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:01:00.0
       version: a1
       width: 64 bits
       clock: 33MHz

$ sudo ubuntu-drivers devices          #RTX4080예시이다

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002704sv00001462sd00005111bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-545-open - third-party non-free
driver   : nvidia-driver-535 - third-party non-free
driver   : nvidia-driver-535-server - distro non-free
driver   : nvidia-driver-525-server - distro non-free
driver   : nvidia-driver-550-open - third-party non-free
driver   : nvidia-driver-550 - third-party non-free recommended
driver   : nvidia-driver-525 - third-party non-free
driver   : nvidia-driver-535-server-open - distro non-free
driver   : nvidia-driver-525-open - distro non-free
driver   : nvidia-driver-545 - third-party non-free
driver   : nvidia-driver-535-open - distro non-free

 

 불행히도 nvidia driver는 multi로 쓸 수는 없고, 다시 설치하고 reboot해야한다. (다만 recommended가 너무 낮지 않으면 그것을 선택하면 좋다)

 

 

3. Ubuntu 버전과는 어떻게 되는가? 23.10보다는 22.04가 더 유리하다.

 

 판단기준 : Ubuntu 배포판 버전이 아니라, 설치된 gcc 버전이 중요하다. CUDA 11을 컴파일하기 위해 구 버전인 gcc 10이 필요하기 때문이다.

 

 Ubuntu 23.10은 GCC 13버전 컴파일러를 디폴트로 사용하는 반면, CUDA 11/cudnn 등 컴파일에 GCC 10가 필요다. 그래서 사실은 Ubuntu 23.10을 사용해도 GCC 10버전 컴파일러를 디폴트로 정하면 CUDA 11을 쓸 수 있다! 그런데 이 Ubuntu에서 GCC 버전을 왔다갔다 설정하면서 설치할 배짱이 없다면 그냥 Ubuntu 22.04을 설치하자. 

 

혹시 Ubuntu 23.10을 써야한다면 아래 가이드를 참고하자. gcc 버전을 바꾸어 설치하는 방법과 다시 gcc 버전을 원복하는 방법이 나와있다.

https://www.yodiw.com/install-cuda-11-on-ubuntu-23-10/

 

그래서 이러한 번거로움 때문에 Ubuntu 22.04을 설치해서 운영하도록 추천하게 된다.

 

 

4. cudnn은 어떻게 할까?

 판단기준 : CUDA 처럼 사용하는 프레임웍별로 필요한 버전을 설치해줘야한다. 대략 8.7 버전 정도가 현재는 제일 무난하다.

 

 cudnn의 8.7.0버전은 CUDA 11과 12모두 각각에 개별 버전별로 따로 있다(즉 cudnn 8.7 버전이 CUDA 11, 12에 각각 별개의 배포판이 있다). 다행히 이 cudnn은 설치 후에도 쉽게 교체 및 추가 할 수 있다. 여러개를 설치하고 전환도 가능하다. 그저 배포하는 압축파일을 풀어서 폴더 그대로 기존의 설치된 cuda폴더의 include/lib 파일만 교체해주면 그만이기 때문이다.

 

예를 들면 CUDA가 /usr/local/cuda-11.8로 설치되어 있고 /usr/local/cuda -> /usr/local/cuda-11.8로 링크가 걸려있다고 치자. 그러면 cudnn은 해당 버전 압축 파일을 받아, 파일의 압축을 적절한 곳에 푼 다음에 아래처럼 복사해 덮어 씌우면 된다.

물론 버전이 바뀔때마다 같은 작업을 하면 된다. 그러니까 여러 버전의 압축을 풀고, 쓸때마다 버전을 바꾸어 복사한 후 필요한 프로그램을 실행하면 된다.

 

아래를 통해 cudnn 배포판 다운로드 (로그인이 필요하다) 하고 그 이하의 절차로 include/lib파일을 복사해버리자.

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

 

$ tar -xvf ${CUDNN_TAR_FILE}
$ sudo cp -P cuda/include/cudnn*.h /usr/local/cuda-11.8/include/
$ sudo cp -P cuda/lib/libcudnn* /usr/local/cuda-11.8/lib64/
$ sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

 

간단하게 버전을 어떻게 잡으면 될지 잡아보았다. 상기 모두 정상 설치되면 아래 명령을 통해 설치 정보를 알 수 있다.

 

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0

$ nvidia-smi

Sat Apr 27 16:54:09 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0  On |                  N/A |
|  0%   39C    P8    25W / 320W |    592MiB / 16376MiB |      0%      Default |

 

흥미로운 것은 위 nvidia-smi의 CUDA은 추천 cuda 버전이다.

 

실제 설치 cuda 버전은 nvcc 명령으로 확인하자.

 

 

5. python 버전은 어떻게 할까?

 

 이것이야말로 실행할 프로젝트에 따라 다른데 대략 3.9~3.11정도가 추천되고 있다. 각 프로젝트별로 매우 세분화된 python버전을 요구할 수 있다(3.10.8이상 등). 따라서 설치할 프로젝트를 유심히 보는 수 밖에 없다. 하지만 우리는 여러개의 프로젝트를 실행하게 되기 때문에, 이 문제를 해결하기 위해 Anaconda(conda)를 사용하게 된다. 각 환경 별로 서로 다른 python과 package를 설정해 다중으로 사용하게 할 수 있는 합리적인 방법이다. Anaconda설치는 간단히 웹서핑해서 최근의 버전을 설치하면 된다. 서로 다른 버전으로 서로 다른 패키지 환경을 구성해 실행하는 것이 Anaconda의 마법같은 장점이다.

 

 Anaconda를 설치한 후 아래와 같은 형태로 이 python 버전에서 자유로워지자. 꼭 미리 conda create 명령으로 전용 환경을 구성한 후 conda activate를 통해 해당 환경을 활성화하고 실행하는 것이다. 디스크 용량을 필요로 하긴 하지만, 이보다 더 편안한 방법도 드물다. 적극 활용하도록 하자. (설치 경험이 없으신 분은 https://jongsky.tistory.com/21 를 참조하자) 아래는 대표적인 환경 구성 및 활성화, 설치 명령이다.

 

$ conda create -n llama2 python=3.9 -y

$ conda activate llama2

(llama2) $ pip install ...

$ ..

$ exit

 

 

이제 이 글을 몇번 앞뒤로 왔다갔다 하면서 설치해서 사용해보면, 여러분은 이제 어떤 버전이든 대응할 수 있게된다.

 

반응형
Posted by 작동미학