GPU Instance 생성을 위한 GPU Passtrough 설정

NOHHYEONGJUN·2025년 3월 31일

OpenStack

목록 보기
22/23
post-thumbnail

0. GPU Passthrough

nvidia driver를 설치하고 진행하려고 해서 애를 먹었다.
인스턴스에 GPU를 사용하게 하고 싶은 것이면, driver 설치 없이 진행하는 것을 추천한다.

GPU Passthrough는 호스트 시스템의 GPU를 가상 머신에 직접 할당하는 기술이다.
이를 통해 게스트 시스템은 GPU에 직접 접근할 수 있어 거의 네이티브에 가까운 성능을 얻을 수 있다.

 

중요 개념

  • VFIO(Virtual Function I/O): 리눅스 커널에서 PCI 장치를 안전하게 VM에 전달하는 프레임워크

  • PCI 패스스루: PCI 장치를 VM에 직접 할당하는 기술

  • 벤더 ID와 장치 ID: 각 PCI 장치를 식별하는 고유 번호 (예: NVIDIA는 10de, RTX A6000은 2230)


 

 


1. VFIO 설정 및 GPU 바인딩

# GPU 정보 조회
lspci -nnk | grep -A 3 -i nvidi

# VFIO 모듈 로드
sudo modprobe vfio
sudo modprobe vfio_pci
sudo modprobe vfio_iommu_type1

# GPU를 VFIO-PCI에 바인딩
echo "10de 2230" > /sys/bus/pci/drivers/vfio-pci/new_id
echo "10de 1aef" > /sys/bus/pci/drivers/vfio-pci/new_id

# 바인딩 확인
lspci -nnk -d 10de:2230
lspci -nnk -d 10de:1aef

 

 


2. VFIO 바인딩 영구 설정

sudo vi /usr/local/bin/vfio-bind.sh
#!/bin/bash

# VFIO 모듈 로드
modprobe vfio
modprobe vfio_pci
modprobe vfio_iommu_type1

# NVIDIA GPU 및 오디오 컴포넌트를 VFIO-PCI에 바인딩
# IDs가 이미 등록되어 있다면 오류가 발생할 수 있지만 무시해도 됨
echo "10de 2230" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null
echo "10de 1aef" > /sys/bus/pci/drivers/vfio-pci/new_id 2>/dev/null

# 직접 바인딩 시도
echo "0000:01:00.0" > /sys/bus/pci/drivers/vfio-pci/bind 2>/dev/null
echo "0000:01:00.1" > /sys/bus/pci/drivers/vfio-pci/bind 2>/dev/null

# 바인딩 상태 기록
echo "VFIO 바인딩 상태 ($(date)):" > /var/log/vfio-bind.log
lspci -nnk -s 01:00.0 >> /var/log/vfio-bind.log
lspci -nnk -s 01:00.1 >> /var/log/vfio-bind.log



sudo chmod +x /usr/local/bin/vfio-bind.sh




sudo vi /etc/systemd/system/vfio-bind.service
[Unit]
Description=NVIDIA GPU VFIO-PCI 바인딩
After=syslog.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/vfio-bind.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target



sudo systemctl enable vfio-bind.service

 

 


3. com02 Nova 설정

sudo vi /etc/nova/nova.conf
[pci]
device_spec = [{"vendor_id":"10de","product_id":"2230"},{"vendor_id":"10de","product_id":"1aef"}]
alias = {"vendor_id":"10de","product_id":"2230","device_type":"type-PCI","name":"a6000"}

[filter_scheduler]
enabled_filters = RetryFilter, AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter

[compute]
pci_passthrough_whitelist = [{"vendor_id":"10de","product_id":"2230"},{"vendor_id":"10de","product_id":"1aef"}]



sudo systemctl restart nova-compute

 

 


4. con01 Nova 설정

sudo vi /etc/nova/nova.conf

[pci]
alias = {"vendor_id":"10de","product_id":"2230","device_type":"type-PCI","name":"a6000"}



sudo systemctl restart nova-api nova-scheduler nova-conductor

 

 


5. GPU Flavor 생성

# 새 flavor 생성
openstack flavor create --ram 16384 --disk 80 --vcpus 8 gpu.a6000

# GPU 패스스루 속성 설정
openstack flavor set --property "pci_passthrough:alias"="a6000:1" gpu.a6000

 

 


6. Test Instance 생성

openstack server create \
  --flavor gpu.a6000 \
  --image <image-id> \
  --nic net-id=<network-id> \
  --availability-zone nova:com02 \
  --key-name <key-name> \
  gpu-instance-test

 

 


7. Instance 접속 및 확인

lspci | grep NVIDIA

# 필요시 드라이버 설치
sudo apt update
sudo apt install -y build-essential linux-headers-$(uname -r)
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install -y nvidia-driver-535
sudo reboot

nvidia-smi

 

 


문제 발생 시

1. PCI alias not defined 오류

컨트롤러 노드와 컴퓨트 노드의 alias 이름이 일치하는지 확인
Nova 서비스 재시작 후 재시도

 

2. GPU가 인스턴스에서 보이지 않는 경우

호스트에서 GPU가 VFIO-PCI에 제대로 바인딩되었는지 확인

lspci -nnk -d 10de:2230

 

3. 드라이버 설치 실패

커널 헤더 패키지가 설치되어 있는지 확인

apt list --installed | grep headers

 

 


추후 정리 예정

profile
Cloud/DevOps & Network Virtualization에 관심 있는 Engineer입니다. 🐳⚓️👨‍✈️

2개의 댓글

comment-user-thumbnail
2025년 6월 19일

안녕하세요. 좋은 자료 감사드립니다. 저 또한 Nvidia Driver를 설치했어서 .. 애를 먹고있는데 - 아예 초기화하고 다음과같이 진행하셨을지 궁금합니다! 아니면... 어떻게 진행하셨는지도 궁금합니다. 감사합니다!

1개의 답글