메뉴 닫기

Proxmox VM 에서 NVIDIA GPU 장치 사용하기 (GPU Passthrough)

Proxmox VE (Virtual Environment) Private Cloud Solution 은 관심 있는 분이라면 익히 들어보았을 것입니다. 저도 최근 WMware 라이센스 비용 상승 이슈에 따라 기업에서도 무료로 사용할 수 있는 클라우드 솔루션이 무엇이 있는지 찾아 보았는데 역시 Proxmox 가 커뮤니티 활성화도 잘 되어있고 꾸준히 기능 업데이트도 되고 있어서 많은 사람들이 찾는구나 생각 들었습니다. 이번 포스팅에서는 일반 서버나 PC 로 노드를 구성하는게 아닌, NVIDIA GPU 서버를 노드로 구성하였을 때를 이점과 방법에 대해 설명 드립니다.

Proxmox VE 노드가 GPU 서버 일때, 해당 노드의 자원을 GPU 서버에 올려진 VM 에서 활용하면 다양한 이점을 제공합니다. 특히, GPU 의 고성능 컴퓨팅 능력을 가상화 환경에서 활용할 수 있게 해줍니다. 다음은 Proxmox VE 에서 GPU 서버를 노드로 사용할 때의 장점입니다.

1) 고성능 컴퓨팅

GPU는 대규모 병렬 연산에 최적화되어 있어, 딥러닝, 머신러닝, 데이터 분석, 과학 계산 등 고성능 컴퓨팅 작업에 유리합니다. Proxmox VE 에서 GPU 를 활용하면 이러한 작업을 가상화 환경에서도 효율적으로 수행할 수 있습니다.

2) 자원 효율성

Proxmox VE 는 여러 가상 머신 (VM) 과 컨테이너를 하나의 물리적 서버에서 실행할 수 있게 해줍니다. GPU 서버를 노드로 추가하면, GPU 리소스를 여러 VM 이나 컨테이너 간에 공유할 수 있어 자원의 효율적인 사용이 가능합니다.

3) 유연한 자원 할당

Proxmox VE 에서는 VM 과 컨테이너에 필요한 만큼의 GPU 리소스를 할당할 수 있습니다. 예를 들어, 특정 VM 에만 GPU 를 할당하거나, 여러 VM 이 GPU 를 공유하도록 설정할 수 있습니다. 이를 통해 사용자의 요구에 맞게 유연하게 자원을 배분할 수 있습니다.

 

그럼 어떻게 사용하는지 확인해 보겠습니다.

아래 내용은 Proxmox VE 8.2.4 환경에서 테스트 하였으며, GeForce RTX 2080 GPU 서버를 노드로 추가하고, 생성한 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

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

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

 

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

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

 

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

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

 

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

(smileserv) root@test:~# conda deactivate

 

6) TensorFlow 설치

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

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

 

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

(smileserv) root@test:~# conda list

 

 

3. 동작 테스트

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

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

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

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

 

1) 버전 출력 테스트

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

(smileserv) root@test:~# python

>>> import tensorflow as tf

print(tf.__version__)

2.12.0

 

2) 행렬 곱셈 테스트

이번에는 파일을 만들어서 실행해 보겠습니다.
(smileserv) 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())

 

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

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

 

3) XOR 게이트 학습 테스트

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

이 예제는 TensorFlow 를 사용하여 신경망을 구축하고 학습시키는 과정을 포함하고 있습니다.
(smileserv) 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)

 

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

 

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

이것으로 GPU 서버의 자원을 여러 VM 이나 컨테이너에서 사용할 수 있음을 확인할 수 있었습니다. GPU 서버가 꼭 단독 서버에서 사용하지 않아도 되므로 다양한 목적이나 환경에 맞추어 Proxmox VE 를 구성한다면 원하는 업무를 진행하는데 도움이 되지 않나 생각합니다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x