GPU Passthrough в Proxmox VE: полное руководство

Зачем нужен GPU Passthrough

GPU Passthrough (проброс видеокарты) позволяет передать физическую видеокарту в эксклюзивное использование виртуальной машине. VM получает прямой доступ к GPU с производительностью 95-99% от bare metal.

Сценарии использования:

  • AI/ML инференс и обучение — TensorFlow, PyTorch в VM с доступом к CUDA
  • 3D-рендеринг — Blender, V-Ray на удалённом сервере
  • Видеонаблюдение — аппаратное декодирование потоков на GPU
  • Терминальные серверы — ускорение графики в RDP-сессиях
  • Стриминг и транскодирование — NVENC/VAAPI для видеопотоков

Требования к оборудованию:

  • CPU с поддержкой IOMMU (Intel VT-d или AMD-Vi)
  • Материнская плата с поддержкой IOMMU и правильными IOMMU-группами
  • Отдельная видеокарта для хоста (встроенная) и отдельная для VM
  • Proxmox VE 7.0+ (рекомендуется 8.x)

Включение IOMMU в BIOS и загрузчике

Первый шаг — включение IOMMU (Input-Output Memory Management Unit) на уровне BIOS и ядра Linux.

В BIOS/UEFI:

  • Intel: включите VT-d (Intel Virtualization Technology for Directed I/O)
  • AMD: включите AMD-Vi или IOMMU
  • Также включите ACS (Access Control Services) если доступно

Настройка загрузчика:

# Для GRUB (стандартная установка):
nano /etc/default/grub

# Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

# AMD:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"

# Применение
update-grub

# Для systemd-boot (ZFS установка):
nano /etc/kernel/cmdline
# Добавить: intel_iommu=on iommu=pt
proxmox-boot-tool refresh

Параметр iommu=pt (passthrough) улучшает производительность устройств, не использующих passthrough, позволяя им обходить IOMMU.

Проверка IOMMU после перезагрузки

После перезагрузки убедитесь, что IOMMU активен:

# Проверка активации IOMMU
dmesg | grep -e DMAR -e IOMMU
# Должно быть: "DMAR: IOMMU enabled" или "AMD-Vi: AMD IOMMUv2"

# Просмотр IOMMU-групп
for d in /sys/kernel/iommu_groups/*/devices/*; do
  n=${d#*/iommu_groups/*}; n=${n%%/*}
  printf 'IOMMU Group %s: ' "$n"
  lspci -nns "${d##*/}"
done

# Найти GPU
lspci -nn | grep -i nvidia
# Пример: 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation ... [10de:2484]
# Пример: 01:00.1 Audio device [0403]: NVIDIA Corporation ... [10de:228b]

Запомните Vendor:Device ID (например, 10de:2484 и 10de:228b) — они понадобятся для настройки VFIO.

Настройка VFIO-драйвера

VFIO (Virtual Function I/O) — драйвер ядра, который «захватывает» устройство до того, как его подхватит обычный драйвер (nvidia, nouveau). Это необходимо для передачи устройства в VM.

# Добавление модулей VFIO
nano /etc/modules
# Добавить строки:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

# Привязка GPU к VFIO по Vendor:Device ID
nano /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2484,10de:228b disable_vga=1

# Блокировка драйверов NVIDIA/Nouveau на хосте
nano /etc/modprobe.d/blacklist.conf
blacklist nvidia
blacklist nouveau
blacklist nvidiafb
blacklist snd_hda_intel  # только если звуковой контроллер GPU

# Обновление initramfs
update-initramfs -u -k all

# Перезагрузка
reboot

После перезагрузки убедитесь, что GPU привязан к VFIO:

# Проверка
lspci -nnk -s 01:00
# Kernel driver in use: vfio-pci  ← должно быть так

# Если драйвер не vfio-pci, проверьте:
dmesg | grep vfio

Создание виртуальной машины

Создайте VM с правильными параметрами для GPU Passthrough:

# Создание VM через CLI
qm create 100 \
  --name gpu-workstation \
  --memory 16384 \
  --cores 8 \
  --sockets 1 \
  --cpu host \
  --bios ovmf \
  --machine q35 \
  --net0 virtio,bridge=vmbr0 \
  --scsihw virtio-scsi-single \
  --scsi0 local-lvm:64,iothread=1,ssd=1 \
  --efidisk0 local-lvm:1 \
  --ostype l26

Обязательные параметры:

  • BIOS: OVMF (UEFI) — SeaBIOS не поддерживает GPU passthrough для современных карт
  • Machine: q35 — поддерживает PCIe (i440fx использует только PCI)
  • CPU: host — пробрасывает все инструкции CPU, необходимые для драйверов GPU

Добавление GPU в виртуальную машину

Добавьте GPU через веб-интерфейс Proxmox или CLI:

# Через CLI
qm set 100 -hostpci0 01:00,pcie=1,x-vga=1

# Или более детально (указывая обе функции GPU)
qm set 100 -hostpci0 0000:01:00.0,pcie=1,x-vga=1
qm set 100 -hostpci1 0000:01:00.1,pcie=1  # Audio controller

Параметры:

  • pcie=1 — проброс через PCIe (не PCI), улучшает производительность
  • x-vga=1 — сообщает VM, что это основной видеоадаптер (необходимо для NVIDIA)

В файле конфигурации VM (/etc/pve/qemu-server/100.conf) должно быть:

bios: ovmf
machine: q35
cpu: host
hostpci0: 0000:01:00.0,pcie=1,x-vga=1
hostpci1: 0000:01:00.1,pcie=1

Обход ограничений NVIDIA (Code 43)

Драйвер NVIDIA для Windows обнаруживает виртуализацию и выдаёт ошибку Code 43 в диспетчере устройств. Для обхода требуется скрыть признаки виртуализации:

# Редактирование конфигурации VM
nano /etc/pve/qemu-server/100.conf

# Добавить в секцию args:
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=proxmox,kvm=off'

# Или более современный подход (Proxmox 8+):
cpu: host,hidden=1,flags=+pcid

# Также в конфигурацию VM:
machine: q35
vga: none  # отключаем виртуальный VGA

Для NVIDIA Geforce (потребительские карты): описанные выше параметры обычно достаточны. Если Code 43 сохраняется, добавьте:

args: -cpu 'host,hv_vendor_id=NV43FIX,kvm=off' -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off

Для NVIDIA Tesla/Quadro (серверные карты): проблемы с Code 43 обычно отсутствуют, так как эти карты официально поддерживают виртуализацию.

Для AMD карт: проблема Code 43 отсутствует, AMD не блокирует работу в VM. GPU Passthrough для AMD обычно проще.

Установка драйверов в виртуальной машине

После запуска VM установите драйверы GPU. Подключитесь через VNC-консоль Proxmox (до установки драйверов GPU вывод идёт через виртуальный VGA) или по RDP/SSH.

Windows VM:

:: Скачайте драйверы с nvidia.com или через winget
winget install NVIDIA.GeForceExperience

:: Проверка через PowerShell
Get-WmiObject Win32_VideoController | Select-Object Name, DriverVersion, Status

:: nvidia-smi должен показать GPU
nvidia-smi

Linux VM:

# Ubuntu/Debian
sudo apt update
sudo apt install nvidia-driver-535  # или актуальная версия
sudo reboot

# Проверка
nvidia-smi
+-----------------------------------------------+
| NVIDIA-SMI 535.xx     Driver Version: 535.xx   |
| CUDA Version: 12.x                             |
|-----------------------------------------------|
| GPU  Name        Persistence-M| Bus-Id         |
| Fan  Temp  Perf  Pwr:Usage/Cap|     Memory-Usage|
|   0  RTX 4070    Off          | 00:01:00.0     |
|  0%   35C    P8    10W / 200W |    256MiB/12288MiB|
+-----------------------------------------------+

# Тест производительности
sudo apt install glmark2
glmark2 --off-screen

Если nvidia-smi показывает GPU с правильным именем и характеристиками — passthrough настроен успешно.

Удалённый доступ к VM с GPU

После проброса GPU виртуальный VGA обычно отключается. Для доступа к VM используйте:

Для Windows: RDP (встроен в Windows), Parsec (низкая задержка для графики), Moonlight + Sunshine (стриминг через NVENC).

Для Linux: SSH + X11 forwarding, VNC-сервер (TigerVNC), или Sunshine для стриминга.

# Установка Sunshine на Linux VM для стриминга
wget https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-ubuntu-22.04-amd64.deb
sudo apt install ./sunshine-ubuntu-22.04-amd64.deb

# Запуск
sunshine
# Откройте https://VM_IP:47990 для настройки

# На клиенте установите Moonlight
# https://moonlight-stream.org/

Parsec и Moonlight обеспечивают задержку менее 10 мс в локальной сети — комфортно даже для интерактивной работы с 3D.

Troubleshooting и советы

Типичные проблемы и их решения:

VM не запускается с ошибкой «IOMMU group is not viable»:

# Проблема: GPU находится в одной IOMMU-группе с другими устройствами
# Решение: ACS Override Patch (только для тестирования, не для продуктива)
nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"
update-grub && reboot

Чёрный экран при запуске VM:

  • Проверьте, что vga: none установлен в конфигурации VM
  • Убедитесь, что GPU-ROM (VBIOS) совместим. Некоторые карты требуют дампа ROM:
# Дамп ROM видеокарты (выполняется до привязки к VFIO)
cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /usr/share/kvm/gpu.rom
echo 0 > rom

# Указание ROM в конфигурации VM
hostpci0: 0000:01:00.0,pcie=1,x-vga=1,romfile=gpu.rom

Низкая производительность: убедитесь, что CPU pinning настроен правильно, hugepages включены и NUMA-топология учтена:

# CPU pinning (в конфигурации VM)
cpus: 8
cpuunits: 1024
numa: 1

# Hugepages (в /etc/sysctl.conf)
vm.nr_hugepages = 8192  # 16 ГБ (8192 * 2 МБ)

Часто задаваемые вопросы

Нет, стандартный passthrough — это эксклюзивный доступ одной VM к GPU. Для разделения GPU между VM используйте NVIDIA vGPU (требует лицензию и карты Tesla/A-серии) или SR-IOV (поддерживается на Intel и некоторых AMD серверных GPU). Для потребительских карт — только одна VM на GPU.

AMD карты проще в настройке — нет проблемы Code 43 и поддержки сброса GPU. NVIDIA серверные карты (Tesla, A-серия, L-серия) поддерживаются официально. NVIDIA GeForce работают с обходными путями. Избегайте карт без собственного VBIOS ROM (некоторые OEM-карты ноутбуков).

Да, полностью. VM видит GPU как «родной» — все CUDA-ядра, тензорные ядра и NVENC/NVDEC доступны. PyTorch, TensorFlow, RAPIDS работают с полной производительностью. Это основной сценарий использования GPU passthrough для AI-задач на виртуализированных серверах.

VM с GPU passthrough не поддерживают live migration между хостами. При перезагрузке хоста VM будет корректно остановлена (если настроен shutdown policy) и запущена после загрузки хоста. GPU автоматически привяжется к VFIO и будет проброшен обратно в VM.

Proxmox управляется через веб-интерфейс и не требует GPU для хоста. Используйте встроенную графику процессора (Intel UHD, AMD APU) для консоли хоста, а дискретную карту полностью отдайте под passthrough. Если встроенной графики нет — установите дешёвую карту (GT 710) для хоста.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#GPU Passthrough#Proxmox#IOMMU#VFIO#проброс видеокарты#PCI Passthrough#NVIDIA Proxmox#виртуализация GPU
Комментарии 0

Оставить комментарий

загрузка...