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

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

GPU Passthrough — это когда физическая видеокарта передаётся в эксклюзивное распоряжение виртуальной машины. Никакого шаринга, никаких прослоек: VM работает с железом напрямую. На практике это даёт 95–99% производительности от bare metal — разница почти неощутима даже в нагруженных сценариях.

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

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

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

  • 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) — обычно прячется в разделе Advanced или CPU Configuration
  • AMD: включите AMD-Vi или просто IOMMU — у разных производителей плат называется по-разному
  • Если в BIOS есть 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 mode) — небольшой, но важный трюк. Устройства, которые не участвуют в 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 для NVIDIA RTX 3070. Они понадобятся на следующем шаге при настройке VFIO.

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

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

# Добавление модулей 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. Здесь важно не схалтурить с параметрами — неправильные настройки на этом этапе убьют половину рабочего времени на отладку.

# Создание 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 — только q35 умеет в PCIe, i440fx застрял в эпохе обычного PCI
  • CPU: host — пробрасывает все инструкции процессора напрямую, драйверы 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 в диспетчере устройств. Драйвер обнаруживает, что работает внутри виртуальной машины, и отказывается запускаться. Лечится сокрытием признаков виртуализации — благо, Proxmox это умеет.

# Редактирование конфигурации 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. Если честно, AMD passthrough настраивается заметно проще и нервов тратит меньше.

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

VM запущена — ставим драйверы. Подключайтесь через 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, Parsec для минимальной задержки, или связка Moonlight + Sunshine для стриминга через NVENC.

Для Linux: SSH с X11 forwarding, 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 — без этого виртуальный VGA конфликтует с пробрасываемым GPU
  • Проверьте совместимость GPU-ROM (VBIOS). Часть карт без дампа родного ROM вообще не стартует в VM:
# Дамп 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

Низкая производительность: если VM с проброшенной картой тормозит, первым делом смотрим на CPU pinning — ядра должны быть жёстко закреплены, а не «плавать» между физическими CPU. Hugepages должны быть включены, и обязательно учитывайте NUMA: GPU и vCPU должны находиться в одном NUMA-узле, иначе потеряете 20–30% пропускной способности на пустом месте:

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

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

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

Нет. Стандартный passthrough — это эксклюзив: одна карта, одна VM, точка. Хотите делить GPU между несколькими VM — смотрите в сторону NVIDIA vGPU, но там нужна лицензия и карты серии Tesla или A. Либо SR-IOV — работает на Intel и отдельных серверных AMD. Потребительские GeForce и Radeon так не умеют: одна карта, одна VM, никаких вариантов.

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

Да, полностью. VM видит GPU как физически установленный — все CUDA-ядра, тензорные ядра, NVENC и NVDEC доступны без ограничений. PyTorch, TensorFlow, RAPIDS показывают такую же производительность, как на bare metal. Если честно, именно ради этого GPU passthrough и используют на виртуализированных AI-серверах — потери практически нулевые.

Live migration с проброшенным GPU невозможна — это нужно принять как данность. При перезагрузке хоста VM корректно остановится, если настроена shutdown policy, а после загрузки поднимется сама: GPU уйдёт под VFIO и автоматически пробросится обратно. На практике это работает стабильно — главное не забыть про политику завершения работы при первоначальной настройке.

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

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

Если где-то на этом пути что-то пошло не так — обращайтесь. Специалисты АйТи Фреш занимаются такими задачами больше 15 лет, и GPU passthrough в нашей практике давно не экзотика. Обслуживание от 15 000 ₽/мес.

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

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

загрузка...