Proxmox VM 에서 NVIDIA GPU 장치 사용하기 (CUDA, cuDNN, TensorFlow 설치 포함)

리눅스/OS 일반|2024. 7. 16. 16:10
반응형

여기에서는 Proxmox VE 8.2.4 환경에서 테스트 하였으며, VM OS 는 Ubuntu 24.04 입니다.

 


1. Proxmox VE 호스트 서버에서 설정

 

grub 파일을 수정하고 업데이트 합니다.

아래에서 AMD CPU 는 amd_iommu=on 으로, INTEL CPU 는 intel_iommu=on 으로 입력하고 나머지는 동일하게 설정해 줍니다.

# vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on amd_iommu=pt pcie_acs_override=downstream,multifunction nofb video=efifb:off vga=off"

 

수정한 내용을 적용합니다.

# update-grub

 

VFIO (Virtual Function I/O) 관련 커널 모듈을 /etc/modules 파일에 추가하여 시스템이 부팅될 때마다 해당 모듈

이 자동으로 로드되도록 설정합니다.

# echo "vfio" >> /etc/modules

# echo "vfio_iommu_type1" >> /etc/modules

# echo "vfio_pci" >> /etc/modules

# echo "vfio_virqfd" >> /etc/modules

 

Proxmox VE 호스트 서버에서 GPU 를 인식하지 않도록 blacklist 에 등록합니다.

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf

echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf

echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf

 

VFIO 정보를 등록해 줍니다.

먼저 NVIDIA 관련 장치 정보를 출력합니다.

# lspci -nn | grep -i nvidia
65:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU104 [GeForce RTX 2080] [10de:1e82] (rev a1)
65:00.1 Audio device [0403]: NVIDIA Corporation TU104 HD Audio Controller [10de:10f8] (rev a1)
65:00.2 USB controller [0c03]: NVIDIA Corporation TU104 USB 3.1 Host Controller [10de:1ad8] (rev a1)
65:00.3 Serial bus controller [0c80]: NVIDIA Corporation TU104 USB Type-C UCSI Controller [10de:1ad9] (rev a1)

 

위 출력 결과를 이용해 설정 파일을 만듭니다.

여기에서는 VM 이 사용할 예정이므로 USB 는 제외하고 GPU 와 Audio Controller 만 추가하겠습니다.

# echo "options vfio-pci ids=10de:1e82,10de:10f8 disable_vga=1" > /etc/modprobe.d/vfio.conf

 

initramfs 를 업데이트하고 재부팅 합니다.

# update-initramfs -u

update-initramfs: Generating /boot/initrd.img-6.8.4-2-pve

Running hook script 'zz-proxmox-boot'..

Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..

No /etc/kernel/proxmox-boot-uuids found, skipping ESP sync.

 

# reboot

 


2. VM 에서 설정

 

1) PCI 드라이버 추가

Proxmox VE 웹 UI 에서 VM 설정을 진행합니다.

- 메뉴 : 하드웨어 > 추가 > 'PCI 디바이스' 를 선택합니다.

0000:65:00.0 / 1 / NVIDIA Corporation / TU104 [GeForce TRX 2080] 

이런 형태의 장치입니다. 선택하고 추가한 후에 VM 을 시작합니다.

 

부팅이 되었으면 로그인하여 장치가 보이는 것을 확인합니다.

# lspci |grep -i nvidia
00:10.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1)

 

2) NVIDIA 드라이버 설치

현재 시스템에서 사용 가능한 NVIDIA 드라이버 버전을 확인합니다.

# apt -y update

# apt -y install ubuntu-drivers-common alsa-utils

# ubuntu-drivers devices

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

udevadm hwdb is deprecated. Use systemd-hwdb instead.

== /sys/devices/pci0000:00/0000:00:10.0 ==

modalias : pci:v000010DEd00001E82sv000010DEsd000012B0bc03sc00i00

vendor   : NVIDIA Corporation

model    : TU104 [GeForce RTX 2080]

driver   : nvidia-driver-535-open - distro non-free

driver   : nvidia-driver-470-server - distro non-free

driver   : nvidia-driver-535 - distro non-free recommended

driver   : nvidia-driver-535-server-open - distro non-free

driver   : nvidia-driver-470 - distro non-free

driver   : nvidia-driver-535-server - distro non-free

driver   : xserver-xorg-video-nouveau - distro free builtin

 

여기에서는 출력된 목록에서 추천 표시된 버전으로 설치해 보겠습니다.

# apt -y install nvidia-driver-535

설치가 되었으면 리부팅을 합니다.
# reboot

부팅 후 아래 명령으로 설치 여부와 NVIDIA 드라이버 버전에 맞는 CUDA 버전을 확인합니다.

(표시된 CUDA 버전은 설치되어 있는 버전이 아니고, 드라이버에 맞는 추천 버전이란 뜻입니다)

# nvidia-smi
Wed Jul 17 07:56:39 2024       
+---------------------------------------------------------------------------------------+
NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 RTX 2080        Off | 00000000:00:10.0 Off |                  N/A |
| 28%   52C    P8              19W / 215W |      1MiB /  8192MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

 

NVIDIA 커널 모듈도 로드가 잘 되었는지 확인합니다.

# lsmod | grep nvidia
nvidia_uvm           1789952  0
nvidia_drm             90112  0
nvidia_modeset       1314816  1 nvidia_drm
video                  73728  1 nvidia_modeset
nvidia              56827904  2 nvidia_uvm,nvidia_modeset

 

이제 위에서 확인된 CUDA 12.2 를 설치할 차례 입니다.

 

3) CUDA Toolkit 설치

NVIDIA 의 CUDA Toolkit 을 설치합니다.

CUDA Toolkit 에는 TensorFlow 가 GPU 에서 실행되는 데 필요한 모든 라이브러리가 포함되어 있습니다.

아래는 검색을 통해 찾은 URL 인데, 12.2 버전과 드라이버 535 버전이 맞으므로 다운로드를 하였습니다.

# wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run

# chmod +x cuda_12.2.2_535.104.05_linux.run

# ./cuda_12.2.2_535.104.05_linux.run

 

처음 설치 화면이 뜨기까지 시간이 걸릴 수 있으며, 설치 과정은 Continue 선택 > accept 입력 > (미리 설치했으므로) 'Driver' 제외 및 나머지 기본값으로 Install 입니다.

파일 사이즈가 크기 때문에 여기에서도 시간이 다소 소요됩니다.

 

CUDA 설치가 완료되면, ~/.bashrc 파일에 경로를 추가하여 CUDA 바이너리에 접근할 수 있도록 합니다.

# echo 'export PATH=/usr/local/cuda-12.2/bin:$PATH' >> ~/.bashrc

# echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc

# source ~/.bashrc

 

설치된 CUDA 버전을 확인합니다.

# nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0

 

4) cuDNN 설치

cuDNN 은 NVIDIA 의 GPU 가속 라이브러리로, TensorFlow 와 같은 딥러닝 프레임워크의 성능을 높이는 데 사용됩니다.

- 로그인하여 버전별 다운로드 가능 : https://developer.nvidia.com/rdp/cudnn-archive

- 구버전은 로그인 없이 다운로드 가능 : https://developer.download.nvidia.com/compute/redist/cudnn/

작업 PC 에서 파일을 다운로드 받아 서버에 업로드 하고 설치를 이어갑니다.

# dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb

 

설치가 되고 출력 내용에 키를 설치하라고 나옵니다. 명령을 따라 실행합니다.

# sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/

# apt -y update
# apt -y install libcudnn8=8.9.7.29-1+cuda12.2
# apt -y install libcudnn8-samples=8.9.7.29-1+cuda12.2

 

설치된 버전을 확인합니다.

# cat /usr/include/cudnn_version.h |grep CUDNN_MAJOR -A 2

#define CUDNN_MAJOR 8

#define CUDNN_MINOR 9

#define CUDNN_PATCHLEVEL 7

 

5) Anaconda 설치

Anaconda 는 데이터 과학 및 머신 러닝을 위한 종합적인 Python 배포판으로, TensorFlow 와 같은 패키지를 손쉽게 설치하고 관리할 수 있습니다.
# wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh
# chmod +x Anaconda3-2024.06-1-Linux-x86_64.sh 
# ./Anaconda3-2024.06-1-Linux-x86_64.sh 

설치 과정에서 ENTER 누르고 > accept 입력 > yes 입력 > yes 입력하면 설치됩니다.
추가된 명령을 사용하기 위해 환경설정을 다시 로드 합니다.
# source /root/.bashrc

버전을 확인합니다.
(base) root@test:~# python --version
Python 3.12.4

(base) root@test:~# conda --version
conda 24.5.0

sysdocu 라는 가상 환경을 생성합니다.

(base) root@test:~# conda create -n sysdocu

 

가상 환경 목록을 확인합니다.

(base) root@test:~# conda env list

 

생성된 가상 환경을 활성화 합니다.

(base) root@test:~# conda activate sysdocu

 

참고로 비활성화 하는 명령은 다음과 같습니다. (필요시 사용)

(sysdocu) root@test:~# conda deactivate

 

6) TensorFlow 설치

Anaconda 가상 환경에서 TensorFlow 설치를 이어갑니다.

(sysdocu) root@test:~# conda install tensorflow

 

현재 가상 환경에 설치된 패키지 목록을 확인합니다.

(sysdocu) root@test:~# conda list

 

 

3. 동작 테스트

 

코드를 실행할때 INFO 정보가 출력되는데, 결과와 같이 출력되어 보기에 좋지 않습니다.

우선, 기본적으로 오류가 아닐경우 출력하지 않도록 설정해 줍니다.

(0 = 모든 로그, 1 = 정보 로그, 2 = 경고 로그, 3 = 오류 로그)

(sysdocu) root@test:~#  export TF_CPP_MIN_LOG_LEVEL=3

 

1) 버전 출력 테스트

가상 환경 내에 TensorFlow 설치가 완료되면, 가상 환경 내에서 Python 을 실행하고, 아래 명령을 순차적으로 입력하면 버전이 출력되는데, 이와 같이 TensorFlow 가 정상적으로 설치 되었는지 확인 할 수 있습니다.

(sysdocu) root@test:~# python

>>> import tensorflow as tf

print(tf.__version__)

2.12.0

 

2) 행렬 곱셈 테스트

이번에는 파일을 만들어서 실행해 보겠습니다.
(sysdocu) root@test:~# vi test.py

import tensorflow as tf

# 두 개의 상수 행렬 정의
matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2], [2]])

# 행렬 곱셈 수행
product = tf.matmul(matrix1, matrix2)

# 결과 출력
print("Matrix 1:")
print(matrix1.numpy())
print("Matrix 2:")
print(matrix2.numpy())
print("Product:")
print(product.numpy())

 

(sysdocu) root@test:~# python test.py

Matrix 1:
[[3 3]]
Matrix 2:
[[2]
 [2]]
Product:
[[12]]

 

3) XOR 게이트 학습 테스트

아래 예제 파일을 만들어서 실행해 봅니다.

이 예제는 TensorFlow 를 사용하여 신경망을 구축하고 학습시키는 과정을 포함하고 있습니다.
(sysdocu) root@test:~# vi test2.py

import tensorflow as tf
import numpy as np

# XOR 데이터셋 정의
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y = np.array([[0], [1], [1], [0]], dtype=np.float32)

# 신경망 모델 정의
model = tf.keras.Sequential([
    tf.keras.layers.Dense(2, input_dim=2, activation='sigmoid'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

# 모델 컴파일
model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.SGD(learning_rate=0.1),
              metrics=['binary_accuracy'])

# 모델 학습
model.fit(X, y, epochs=1000, verbose=0)

# 결과 예측
predictions = model.predict(X)
print("Predictions:")
print(predictions)

 

(sysdocu) root@test:~# python test2.py
1/1 [==============================] - 0s 128ms/step
Predictions:
[[0.50881463]
 [0.48036876]
 [0.5206941 ]
 [0.49291846]]

 

이렇게 결과가 잘 출력 된 것으로 보아 TensorFlow 가 잘 설치되었음을 알 수 있습니다.

 

반응형

댓글()