
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)
# 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
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
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
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
# 새 flavor 생성
openstack flavor create --ram 16384 --disk 80 --vcpus 8 gpu.a6000
# GPU 패스스루 속성 설정
openstack flavor set --property "pci_passthrough:alias"="a6000:1" gpu.a6000
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
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
컨트롤러 노드와 컴퓨트 노드의 alias 이름이 일치하는지 확인
Nova 서비스 재시작 후 재시도
호스트에서 GPU가 VFIO-PCI에 제대로 바인딩되었는지 확인
lspci -nnk -d 10de:2230
커널 헤더 패키지가 설치되어 있는지 확인
apt list --installed | grep headers
추후 정리 예정
안녕하세요. 좋은 자료 감사드립니다. 저 또한 Nvidia Driver를 설치했어서 .. 애를 먹고있는데 - 아예 초기화하고 다음과같이 진행하셨을지 궁금합니다! 아니면... 어떻게 진행하셨는지도 궁금합니다. 감사합니다!