728x90

머신러닝(Machine Learning)과 관련하여 기계학습과정에 GPU카드 및 CUDA설치는 빈번하지만, 그 호환성 이슈로 인해

잘 설치가 되지 않거나, 솔루션 또는 학습기가 수행이 안되는 경우가 빈번하다. 경험을 기반으로 이론을 역순으로 익혀보고자 합니다.

 

CUDA의 구성은 아래 그림과 같습니다. ( 본 글의 모든 이미지, 그림 요소는 nvidia.com이 출처입니다.)

그림 1. CUDA의 구성요소, 출처) docs.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)에 업그레이드 됩니다.

 

그림 2. 툴킷을 업그레이드하면, 드라이버도 '기본적'으로 함께 업그레이드 됩니다.  Naming은 툴킷보다는 그냥 CUDA 뒤에 버전입니다. 실질적으로는 툴킷버전이죠.

 

음~~. 보통 툴킷을 SW개발자 측면이 강하고 드라이버는 HW적인 요소가 강한 면이 있는데, 그림2처럼 일반적으로 툴킷과 드라이버가 동시에 업그레이드 되면,  드라이버 이슈가 발생하여   잘보이던 화면이 안 나타나거나,  제대로 훈련기/추론을 수행하던 것이 '동작하지 않게' 되죠. ( 많이 경험하였죠.!!!)

 

그냥 업그레이드하면  앞에서 언급한 것처럼 되고, 문제가 발생하니, 다른 방안을 Nvidia에서 제공은 하겠죠.

 

 

 

Minor Version Compatibility

이 체계를 Minor Version Compatibility라고 표현하고 있습니다.  각 CUDA XX.X 버전 마다 필요한 최소 Driver 버전은 아래 표와 같습니다.

 

표 1.

 

표 2.

 

 예를 들어,   드라이버는 그대로 두고(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가 있습니다.

 

그림 3.&nbsp; Forward 호환성에서&nbsp; Major 툴킷 버전업이라고 설명하고 있습니다.&nbsp; Application을 위해 CUDA 10.1에서 CUDA 11.0으로 업그레이드하는데,&nbsp; 최소 Drivier버전인 450.x로 드라이버 중 사용자 모드만 업그레이드합니다.

 

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 파일 이름입니다.

 

 

 

 

728x90
반응형

+ Recent posts