Skip to document
pieroot log
Markdown Preview

OpenStack에서 GPU PCI Passthrough 설정: AI 및 고성능 그래픽을 위한 완벽 가이드

Frontmatter

OpenStack에서 GPU를 VM에 직접 제공하기 위한 PCI Passthrough 설정 과정을 단계별로 안내하며, IOMMU와 VFIO‑PCI 활성화, Nova와 Compute 노드의 PCI alias 및 whitelist 구성, Flavor에 GPU 할당 속성 추가, NVIDIA GPU의 Audio Device 포함 설정, 그리고 모든 GPU를 Passthrough하려면 별도 출력용 GPU가 필요함을 설명하고, 주요 트러블슈팅 포인트와 해결 방법을 제공한다.

OpenStack에서 GPU PCI Passthrough 설정: AI 및 고성능 그래픽을 위한 완벽 가이드

서론: GPU가 필요한 VM을 어떻게 제공할까?

OpenStack 환경에서 사용자에게 인스턴스를 제공할 때, GPU가 필요한 경우가 종종 있습니다. 인공지능 모델 학습이나 추론, 고성능 그래픽 처리가 대표적인 예입니다.
이번 글에서는 OpenStack에서 GPU를 제공하는 방법 중 하나인 PCI Passthrough를 설정하는 전체 과정을 다룹니다. 삽질의 역사도 함께 담았으니, 비슷한 환경을 구축하시는 분들께 도움이 되길 바랍니다.
📌
이 글에서 다루는 내용
  • GPU Passthrough와 vGPU의 차이점
  • IOMMU 및 VFIO-PCI 드라이버 설정
  • Nova API, Scheduler, Compute 노드 설정
  • NVIDIA GPU의 Audio Device 처리 방법
  • 모든 GPU 활용을 위한 트러블슈팅

1. GPU 제공 방식 비교: Passthrough vs vGPU

GPU를 VM에 제공하는 방법은 크게 GPU Passthrough(직접 제공)와 vGPU(간접 제공) 두 가지가 있습니다.
OpenStack GPU 제공 방식 비교: Passthrough vs vGPU
OpenStack GPU 제공 방식 비교: Passthrough vs vGPU
구분
GPU Passthrough
vGPU
제공 방식
물리 GPU를 VM에 직접 연결
가상화된 GPU 리소스 분할 제공
성능
네이티브 성능 (100%)
가상화 오버헤드 존재
공유
1 GPU = 1 VM (독점)
1 GPU = N VM (공유 가능)
비용
추가 라이센스 불필요
제조사 라이센스 비용 발생
유연성
낮음
높음 (다양한 프로필 제공)
GPU(PCI) Passthrough는 사용자의 인스턴스(VM)에 GPU가 연결된 PCI-E 라인을 직접 연결하는 방식입니다. 가상화 계층을 거치지 않기 때문에 네이티브에 가까운 성능을 제공할 수 있습니다.
반면 vGPU는 가상화를 통해 하나의 물리 GPU를 여러 VM에서 나눠 쓸 수 있다는 장점이 있지만, NVIDIA GRID 등의 라이센스 비용이 추가로 발생합니다.
💡
언제 어떤 방식을 선택해야 할까요?
  • Passthrough: 딥러닝 학습처럼 GPU 전체 성능이 필요한 경우
  • vGPU: 여러 사용자가 가벼운 추론 작업을 나눠서 할 때
이번 글에서는 라이센스 비용이 들지 않는 GPU Passthrough 방식을 다룹니다.

2. 사전 준비 및 동작 원리

OpenStack 구성이 모두 완료된 상태에서 진행해야 합니다. 위 공식 문서들을 참고하면 자세한 내용을 확인할 수 있습니다.
OpenStack GPU PCI Passthrough 동작 원리
OpenStack GPU PCI Passthrough 동작 원리
⚙️
PCI Passthrough 동작 원리
PCI Passthrough는 호스트의 하이퍼바이저를 우회하여 게스트 VM이 물리적 PCI 장치에 직접 접근할 수 있게 합니다. 이를 위해 두 가지 핵심 기술이 필요합니다:
  1. IOMMU (Input-Output Memory Management Unit): CPU가 제공하는 하드웨어 가상화 기술로, 장치별로 메모리 영역을 격리하여 VM이 안전하게 PCI 장치에 접근할 수 있게 합니다. Intel에서는 VT-d, AMD에서는 AMD-Vi라고 부릅니다.
  1. VFIO (Virtual Function I/O): 리눅스 커널의 프레임워크로, 사용자 공간 프로그램(예: QEMU)이 하드웨어 장치를 안전하고 효율적으로 제어할 수 있게 해줍니다.

2.1 하드웨어 상태 확인

현재 컴퓨트 노드에 어떤 GPU가 연결되어 있는지 먼저 확인합니다.
notion image
다음 명령어로 GPU의 vendor_id와 product_id를 확인할 수 있습니다:
bash
# PCI 장치 목록 확인
lspci -nn | grep -i nvidia

# 상세 정보 확인
lspci -vnn -d 10de:
notion image
위 환경에서는 GTX 1080 Ti 2장이 연결되어 있습니다. 각각의 정보는 다음과 같습니다:
  • Vendor ID: 10de (NVIDIA)
  • Product ID: 1b06 (GTX 1080 Ti)
이 정보를 기록해두고 아래 설정에서 사용합니다.

3. IOMMU 설정 (Compute 노드)

IOMMU는 시스템의 컴퓨팅 자원(GPU, NIC 등)을 가상 머신에 직접 매핑하기 위해 필요한 기술입니다.
notion image

3.1 GRUB 설정

/etc/default/grub 파일을 수정하여 IOMMU를 활성화합니다:
bash
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt vfio-pci.ids=10de:1b06,10de:10ef vfio_iommu_type1.allow_unsafe_interrupts=1 modprobe.blacklist=nvidiafb,nouveau"
📚
GRUB 옵션 상세 설명
  • intel_iommu=on: Intel VT-d 활성화 (AMD의 경우 amd_iommu=on)
  • iommu=pt: IOMMU Pass-Through 모드 활성화 (성능 향상)
  • vfio-pci.ids=10de:1b06,10de:10ef: VFIO 드라이버에 바인딩할 장치 ID
  • vfio_iommu_type1.allow_unsafe_interrupts=1: 인터럽트 리매핑이 없는 시스템에서 필요
  • modprobe.blacklist=nvidiafb,nouveau: 호스트에서 NVIDIA 드라이버 로드 방지

3.2 설정 적용 및 재부팅

bash
# GRUB 설정 업데이트
sudo update-grub

# 시스템 재부팅
sudo reboot

3.3 설정 확인

재부팅 후 VFIO-PCI 드라이버가 정상적으로 바인딩되었는지 확인합니다:
bash
lspci -nnk -d 10de:
notion image
Kernel driver in use: vfio-pci가 표시되면 정상적으로 설정된 것입니다.
💡
Tip: VFIO-PCI가 활성화되지 않은 경우, 다음 사항을 점검해보세요:
  • BIOS에서 VT-d (Intel) 또는 AMD-Vi (AMD) 활성화 여부
  • Secure Boot 비활성화 필요 여부
  • dmesg | grep -i iommu 로 IOMMU 활성화 로그 확인

4. Nova 설정

이제 OpenStack Nova 컴포넌트들을 설정해야 합니다. Controller 노드와 Compute 노드 양쪽에서 설정이 필요합니다.

4.1 Nova API 설정 (Controller 노드)

notion image
Controller 노드(또는 nova-api가 실행되는 노드)에서 PCI alias를 설정합니다.
bash
[pci]
alias = { "vendor_id": "제조사 아이디", "product_id": "제품 아이디", "device_type": "제품 제공 방법", "name": "라벨링할 이름" }
이런 형태로 설정을 해주면 된다.
bash
[pci]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
/etc/nova/nova.conf
⚠️
alias 설정 시 주의사항
공식 문서에는 alias를 리스트 형태로 입력할 수 있다고 나와 있지만, 실제로는 개별 항목으로 여러 줄 작성해야 합니다. 리스트로 묶어서 입력하면 파싱 에러가 발생합니다. 이 부분에서 꽤 삽질했습니다... 😅

4.2 Nova Scheduler 설정 (Controller 노드)

notion image
스케줄러 설정을 해줘야 Controller에서 GPU가 있는 Compute 노드를 찾을 수 있습니다.
bash
[filter_scheduler]
enabled_filters = PciPassthroughFilter
available_filters = nova.scheduler.filters.all_filters
/etc/nova/nova.conf
📝
기존에 다른 필터가 설정되어 있다면?
기존 필터 목록에 PciPassthroughFilter를 추가하면 됩니다:
javascript
enabled_filters = AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,PciPassthroughFilter

4.3 Flavor 설정 (Controller 노드)

notion image
사용자가 GPU가 포함된 인스턴스를 생성할 수 있도록 Flavor에 PCI Passthrough 속성을 추가합니다.
bash
openstack flavor set g1 --property "pci_passthrough:alias"="GTX-1080ti:1"
💡
GPU 여러 개를 할당하려면?
숫자를 늘려주면 됩니다:
bash
# GPU 2개 할당
openstack flavor set g2 --property "pci_passthrough:alias"="GTX-1080ti:2"

4.4 Nova Compute 설정 (Compute 노드)

notion image
Compute 노드에서는 passthrough_whitelist와 alias 두 가지를 모두 설정해야 합니다.
bash
[pci]
passthrough_whitelist = { "vendor_id": "10de", "product_id": "1b06" }
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
/etc/nova/nova.conf
⚠️
중요: Controller와 Compute의 alias 설정이 동일해야 합니다!
alias 이름(GTX-1080ti)이 Controller와 Compute에서 다르면 스케줄링이 제대로 되지 않습니다. 복사-붙여넣기로 동일하게 유지하세요.

4.5 서비스 재시작

설정을 적용하려면 Nova 서비스를 재시작해야 합니다.
bash
# Controller 노드
sudo systemctl restart nova-api nova-scheduler

# Compute 노드
sudo systemctl restart nova-compute

이론적으로는 여기까지 설정하면 정상 동작해야 합니다. 하지만 현실은 그렇지 않죠... 😭 이제 어떤 문제가 있었고 어떻게 해결했는지 살펴보겠습니다.

5. 트러블슈팅

여기서부터는 실제로 겪었던 문제들과 해결 방법을 공유합니다. 비슷한 환경을 구축하시는 분들은 이 부분을 주의 깊게 봐주세요!

5.1 NVIDIA GPU의 Audio Device 문제

NVIDIA GPU는 하나의 물리 장치에 VGA controller와 Audio device 두 개가 함께 잡힙니다.
notion image
❗
핵심 포인트: PCI Passthrough를 할 때는 VGA만 제공해서는 안 되고, Audio device까지 함께 제공해야 합니다!
Compute 노드와 Controller 노드의 passthrough_whitelist와 alias를 수정해야 합니다.
bash
[pci]
passthrough_whitelist = [{ "vendor_id": "10de", "product_id": "1b06" },{ "vendor_id": "10de", "product_id": "10ef" }]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
alias = { "vendor_id": "10de", "product_id": "10ef", "device_type": "type-PCI", "name": "GTX-1080ti-audio" }
/etc/nova/nova.conf - compute
passthrough_whitelist는 리스트 형태로 입력이 가능합니다.
공식 문서에는 alias 또한 리스트로 입력할 수 있다고 나와 있지만...
notion image
위 예시처럼 필요한 만큼 alias를 개별 항목으로 추가해야 합니다.
notion image
alias를 리스트로 묶어서 넣으면 위와 같은 파싱 에러가 발생합니다. 이거 찾는데 시간 좀 들었습니다... 😢
bash
[pci]
alias = { "vendor_id": "10de", "product_id": "1b06", "device_type": "type-PCI", "name": "GTX-1080ti" }
alias = { "vendor_id": "10de", "product_id": "10ef", "device_type": "type-PCI", "name": "GTX-1080ti-audio" }
/etc/nova/nova.conf - controller
Controller 노드도 동일하게 alias를 설정해야 합니다.
그다음 Flavor 설정도 수정해야 합니다. Audio device를 Flavor에 추가하지 않으면 GPU만 패스스루되고 Audio는 연결되지 않습니다.
shell
openstack flavor set g1 --property "pci_passthrough:alias"="GTX-1080ti:1,GTX-1080ti-audio:1"
✅
완료! 이렇게 설정하면 GPU와 Audio device가 함께 VM에 할당됩니다.

5.2 설치된 GPU 전체를 Passthrough할 수 없는 경우

이 문제는 예상보다 많은 분들이 겪는 상황입니다.
Ubuntu에는 Server(CLI)와 Desktop(GUI) 두 가지 버전이 있습니다. Server 버전은 Desktop Manager가 없으니 GPU가 필요 없을 것 같지만... 실제로는 모든 서버가 부팅하려면 최소한 하나의 GPU가 필요합니다.
저희 환경에서는:
  • 온보드/온칩 GPU가 없음
  • 외장 GPU만 있는 상태
  • 모든 GPU를 Passthrough로 제공하고 싶음
Ubuntu를 Headless 모드로 부팅하면 이론상 모든 GPU를 Passthrough할 수 있습니다. 하지만 실제로 해보면 하나는 정상 동작하지 않습니다.
🔍
원인 분석
여러 사이트와 GPT를 열심히 갈구며 확인한 결과... 😅
VFIO-PCI로 GPU를 VM에 넘기더라도, 호스트 머신이 CLI 렌더링을 위해 계속 GPU 드라이버를 사용하고 있었습니다.
해결 방법은 두 가지입니다:
  1. 여분의 화면 출력용 GPU 사용 ← 저희가 선택한 방법
  1. 시리얼 콘솔로 리다이렉션 (보드에 콘솔 포트가 있어야 함)
저희 환경에는 콘솔 포트가 없어서 저렴한 GPU를 화면 출력용으로 추가하기로 했습니다.
notion image
구성이 다소 바뀌어 RTX-2000 Ada 2개 있던 서버에 쓸팡에서 저렴한 가격에 GT 625를 구매하여 추가로 장착했습니다.
  • 1슬롯, 1팬 켤팩트한 제품
  • 역할: 부팅 시 CLI 출력 담당
  • 설정: 위와 동일 (별도 설정 불필요)
🎉
최종 결과
  • RTX-2000 Ada 2장: PCI Passthrough로 VM에서 온전히 활용
  • GT 625: 호스트 CLI 렌더링 전담
추후 콘솔용 시리얼 포트를 설치하고 GPU를 대체할 수 있을지 테스트해보려 합니다.

6. 마무리

OpenStack에서 GPU PCI Passthrough를 구성하는 전체 과정을 살펴봤습니다. 정리하면:
📝
핵심 설정 체크리스트
  1. IOMMU 활성화: GRUB에서 intel_iommu=on (AMD는 amd_iommu=on) 설정
  1. VFIO-PCI 바인딩: GPU를 vfio-pci 드라이버에 연결
  1. Nova 설정: Controller와 Compute 모두 alias 동일하게 설정
  1. Audio Device 포함: NVIDIA GPU는 VGA + Audio 모두 Passthrough
  1. 화면 출력용 GPU: 모든 GPU를 Passthrough하려면 별도 GPU 필요
삽질의 연속이었지만, 성공적으로 구성을 마쳤습니다. 비슷한 환경을 구축하시는 분들에게 도움이 되었으면 좋겠습니다! 🚀

참고 자료