머신러닝(Machine Learning)과 관련하여 기계학습과정에 GPU카드 및 CUDA설치는 빈번하지만, 그 호환성 이슈로 인해
잘 설치가 되지 않거나, 솔루션 또는 학습기가 수행이 안되는 경우가 빈번하다. 경험을 기반으로 이론을 역순으로 익혀보고자 합니다.
CUDA의 구성은 아래 그림과 같습니다. ( 본 글의 모든 이미지, 그림 요소는 nvidia.com이 출처입니다.)
크게 CUDA는 툴킷(Toolkit)과 드라이버(Driver)로 구성되어져 있습니다. 드라이버는 사용자모드 라이브러리 및 커널모드라이버 등으로 구성되어, 결국 CUDA는 3개로 구성되어져 있습니다.
이 3개를 어떻게 업그레이드하는가에 따라 3개의 방식이 있습니다.
1. Backward Compatibility.
:: 하위 버전의 호환성을 유지하고자 노력하면서 통째로(3가지 모두) 업그레이드. 그림 2 참조.
2. Minor Version Compatibility
:: 유저 드라이버는 유지하면서 툴킷 버전만 업그레이드 하는 것입니다.
( 단, Major 버전은 변함없이, 또한 최소 유저 드라이버 버전은 충족시켜야 합니다.)
3. Forward Compatibility
:: 유저 드라이버 버전과 메이저 툴킷 버전을 동시에 업그레이드 합니다. 그림 3참조.
compat 라는 프로그램을 통해, 점검 후 자동으로 업그레이드하는 방식을 추천하고 있습니다.
각 업그레이드방식마다 필요조건이 있으니, 표나 테이블값 등을 살펴보아야 합니다.
Backward Compatibility
, '편의상' 툴킷에 드라이버가 '함께' 배포(deploy)된다고 합니다.( 따로 따로 하면 충동이나 호환성에 아마 문제점이 덜하겠죠..)
그래서, 툴킷을 업그레이드하면, 툴킷과 드라이버가 동시(both)에 업그레이드 됩니다.
음~~. 보통 툴킷을 SW개발자 측면이 강하고 드라이버는 HW적인 요소가 강한 면이 있는데, 그림2처럼 일반적으로 툴킷과 드라이버가 동시에 업그레이드 되면, 드라이버 이슈가 발생하여 잘보이던 화면이 안 나타나거나, 제대로 훈련기/추론을 수행하던 것이 '동작하지 않게' 되죠. ( 많이 경험하였죠.!!!)
그냥 업그레이드하면 앞에서 언급한 것처럼 되고, 문제가 발생하니, 다른 방안을 Nvidia에서 제공은 하겠죠.
Minor Version Compatibility
이 체계를 Minor Version Compatibility라고 표현하고 있습니다. 각 CUDA XX.X 버전 마다 필요한 최소 Driver 버전은 아래 표와 같습니다.
예를 들어, 드라이버는 그대로 두고(11.0), 툴킷의 버전(11.1)만 업그레이드 한다고 할 때의 결과 화면 예시입니다.
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
...<snip>...
$ samples/bin/x86_64/linux/release/deviceQuery
samples/bin/x86_64/linux/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "Tesla T4"
CUDA Driver Version / Runtime Version 11.0 / 11.1
CUDA Capability Major/Minor version number: 7.5
...<snip>...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.0, CUDA Runtime Version = 11.1, NumDevs = 1
Result = PASS
해석은 기존에 11.0이었고, 드라이버 버전은 450,80.02여서 최소 드라이버 버전 ( 11.x 패밀리 기준)은 충족되었죠.
그 다음, 뭔가를 조회하는 프로그램을 수행시킵니다.
$ samples/bin/x86_64/linux/release/deviceQuery
그러면, 'Tesla T4' GPU카드에 대해, Driver 버전은 11.0 인데, Runtime Version(즉 툴킷)은 11.1로 나타납니다. 제대로 업그레이드 되었네요. 마지막 Result = PASS 쪽에도 요약 정리하여 출력시켜 줍니다.
만약 실패하였다면 아래와 같이 출력된다고 합니다.
$ samples/bin/x86_64/linux/release/deviceQuery
samples/bin/x86_64/linux/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 3
-> initialization error
Result = FAIL
명령어 :
/usr/local/cuda/compat/samples/bin/x_86_64/linux/release/deviceQuery
Forward Compatibilty
Minor Version Compatibility 이외에 Forward Compatibilty가 있습니다.
CUDA 12.0 으로 업그레이드 하는 예시( 네트워크 방식이 있고, 수동으로 파일을 다운로드받아 파일 엎어치기 하는 방식, 2가지가 있습니다.)
$ sudo apt-get install -y cuda-compat-12-0
Selecting previously unselected package cuda-compat-12-0.
(Reading database ... 339974 files and directories currently installed.)
Preparing to unpack .../cuda-compat-12-0_525.49-1_amd64.deb ...
Unpacking cuda-compat-12-0 (525.49-1) ...
Setting up cuda-compat-12-0 (525.49-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
$ ls -l /usr/local/cuda/compat
total 145676
lrwxrwxrwx 1 root root 12 Jun 3 00:45 libcuda.so -> libcuda.so.1
lrwxrwxrwx 1 root root 17 Jun 3 00:45 libcuda.so.1 -> libcuda.so.525.49
-rw-r--r-- 1 root root 26255520 Jun 2 20:55 libcuda.so.525.49
lrwxrwxrwx 1 root root 25 Jun 3 00:45 libcudadebugger.so.1 -> libcudadebugger.so.525.49
-rw-r--r-- 1 root root 10938424 May 27 20:49 libcudadebugger.so.525.49
lrwxrwxrwx 1 root root 19 Jun 3 00:45 libnvidia-nvvm.so -> libnvidia-nvvm.so.4
lrwxrwxrwx 1 root root 24 Jun 3 00:45 libnvidia-nvvm.so.4 -> libnvidia-nvvm.so.525.49
-rw-r--r-- 1 root root 92017376 Jun 2 21:21 libnvidia-nvvm.so.525.49
lrwxrwxrwx 1 root root 34 Jun 3 00:45 libnvidia-ptxjitcompiler.so.1 -> libnvidia-ptxjitcompiler.so.525.49
-rw-r--r-- 1 root root 19951576 Jun 2 20:38 libnvidia-ptxjitcompiler.so.525.49
$ LD_LIBRARY_PATH=/usr/local/cuda/compat:$LD_LIBRARY_PATH samples/bin/x86_64/linux/release/deviceQuery
samples/bin/x86_64/linux/release/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "Tesla T4"
CUDA Driver Version / Runtime Version 12.0 / 12.0
CUDA Capability Major/Minor version number: 9.0
...<snip>...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.0, CUDA Runtime Version = 12.0, NumDevs = 1
Result = PASS
어떤 Compat 파일을 사용할지는 아래 표를 참조하여야 합니다.
NVIDIA Kernel Mode Driver - Production Branch
CUDA Forward Compatible Upgrade | 450.36.06+ (CUDA 11.0) |
470.57.02+ (CUDA 11.4) |
495.29.05+ (CUDA 11.5) |
510.39.01+ (CUDA 11.6) |
515.43.04+ (CUDA 11.7) |
520.61.05 + (CUDA 11.8) |
525.60.04+ (CUDA 12.0) |
12-0 | C | C | X* | C | C | C | Not required |
11-8 | C | C | C | C | Not required | X | |
11-7 | C | C | C | Not Required | X | X | |
11-6 | C | C | Not required | X | X | X | |
11-5 | C | C | X | X | X | X | |
11-4 | C | Not required | X | X | X | X | |
11-3 | C | X | X | X | X | X | |
11-2 | C | X | X | X | X | X | |
11-1 | C | X | X | X | X | X | |
11-0 | Not required | X | X | X | X | X |
R465, R460, R455, R440, R418, R410, R396, R390 는 Forward Compatibility를 지원하지 않는다고 합니다.
2열 우측에 있는 현재의 버전에서, 첫 열의 Target으로 업그레이드하고 자 할 때 사용하는 compat-xx 파일 이름입니다.