GPU Passthrough to a Proxmox VM
By LK Wood IV · 2026-06-13 · ~16 min read · St. Louis County, MO
GPU passthrough gives a Proxmox VM exclusive access to a physical GPU with near-bare-metal performance. The VM gets the full GPU — not a virtual representation, not a shared slice — and runs its own GPU driver. This makes Proxmox viable for gaming VMs, professional GPU workloads, and AI inference VMs where you need the GPU’s full performance and driver stack.
The setup is not trivial. VFIO (Virtual Function I/O) passthrough involves kernel parameters, driver blacklisting, IOMMU group verification, and BIOS settings that vary by platform. This guide covers the full process step by step with the commands you actually run.
What you need
- Proxmox VE 8.x
- CPU and motherboard with IOMMU support (Intel VT-d or AMD-Vi)
- GPU for passthrough (discrete — passthrough does not work with iGPUs as the primary passthrough target)
- A second GPU or iGPU for the Proxmox host display (so you can see the host while the GPU is passed through to a VM)
- Target VM already created (or create it after this setup)
Most modern CPUs and motherboards support IOMMU. The tricky part is IOMMU group isolation — explained below.
Step 1: Enable IOMMU in BIOS
Reboot into your BIOS/UEFI.
Intel: Enable VT-d (usually under Advanced CPU Configuration or an Intel Virtualization Technology menu). Also look for “Intel VT for Directed I/O.”
AMD: Enable AMD-Vi or IOMMU (sometimes labeled “AMD SVM” or under the AMD CBS menu). The Ryzen 7 7800X3D and B650 platform have this under AMD CBS → NBIO → NB Configuration.
Save and boot back into Proxmox.
Step 2: Enable IOMMU in the Linux kernel
Edit the GRUB boot parameters:
nano /etc/default/grub
Find the GRUB_CMDLINE_LINUX_DEFAULT line and add the IOMMU flags:
Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
AMD:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
The iommu=pt flag (passthrough mode) reduces IOMMU overhead for devices not being passed through — recommended for performance.
Update GRUB and reboot:
update-grub
reboot
After reboot, verify IOMMU is active:
dmesg | grep -i iommu | head -10
You should see output like AMD-Vi: AMD IOMMUv2 loaded and initialized or DMAR: IOMMU enabled.
Step 3: Load VFIO kernel modules
Add VFIO modules to load at boot:
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
echo "vfio_virqfd" >> /etc/modules
Update initramfs:
update-initramfs -u
Step 4: Identify your GPU’s IOMMU group
This step is critical. Each device in your system is assigned to an IOMMU group. For passthrough, you need to pass through all devices in the same IOMMU group as your target GPU — or ensure the GPU is the only device in its group.
Run this script to see all IOMMU groups:
#!/bin/bash
for d in /sys/kernel/iommu_groups/*/devices/*; do
n=${d#*/iommu_groups/*}; n=${n%%/*}
printf 'IOMMU Group %s ' "$n"
lspci -nns "${d##*/}"
done | sort -n -t' ' -k3
Look for your GPU in the output. Example:
IOMMU Group 20 0a:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 5080] [10de:2203] (rev a1)
IOMMU Group 20 0a:00.1 Audio device [0403]: NVIDIA Corporation GA102 High Definition Audio Controller [10de:1aef] (rev a1)
In this example, the GPU (0a:00.0) and its HDMI audio controller (0a:00.1) share IOMMU Group 20. Both need to be passed through together — that’s fine and expected. The GPU audio device should always be passed with the GPU.
Problem case: if other unrelated devices (another PCIe card, a USB controller) share the GPU’s IOMMU group, you either need to pass those through too, or use the ACS override patch (not recommended — it’s a security tradeoff, and Proxmox kernels don’t ship it by default).
Note the PCI addresses (e.g., 0a:00.0 and 0a:00.1) and vendor:product IDs (e.g., 10de:2203 and 10de:1aef).
Step 5: Blacklist the GPU driver on the host
The host must NOT load the NVIDIA or AMD driver for the GPU you’re passing through. If the host driver loads first, VFIO can’t bind to the device.
Create a blacklist file:
# /etc/modprobe.d/blacklist-gpu.conf
# Blacklist NVIDIA drivers for passthrough GPU
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist nvidia_drm
# Blacklist AMD drivers if passing through AMD GPU
# blacklist amdgpu
# blacklist radeon
Then bind VFIO to the GPU at boot by setting its PCI IDs:
# /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2203,10de:1aef
Replace 10de:2203,10de:1aef with your GPU’s actual vendor:product IDs from the IOMMU group output.
Update initramfs again:
update-initramfs -u
reboot
After reboot, verify the GPU is bound to vfio-pci and not the NVIDIA driver:
lspci -nnk -d 10de:2203
You should see Kernel driver in use: vfio-pci — not nvidia.
Step 6: Configure the VM
VM hardware settings in Proxmox:
- Machine type:
q35 - BIOS:
OVMF (UEFI)with an EFI disk - CPU type:
host
Add the PCI device:
- VM → Hardware → Add → PCI Device
- Select your GPU from the dropdown (it should show as available now that VFIO owns it)
- Enable All Functions (passes through all functions: GPU + audio)
- Enable Primary GPU if this will be the VM’s only display output
- Enable ROM-Bar (required for most GPUs to initialize properly)
- If you see an option for PCI-Express — enable it
NVIDIA-specific: hide the hypervisor
In the Proxmox shell, edit the VM’s config file:
nano /etc/pve/qemu-server/VMID.conf
Add these lines:
args: -cpu host,kvm=off,hv_vendor_id=GenuineIntel
cpu: host,hidden=1
The kvm=off hides the KVM hypervisor signature from NVIDIA’s driver check. hv_vendor_id=GenuineIntel sets a neutral vendor ID that NVIDIA’s Error 43 check doesn’t flag. Modern NVIDIA drivers (520+) are less strict about this, but adding it doesn’t hurt.
Step 7: Install the VM OS and GPU driver
Start the VM and install your OS (Windows 11 or Linux). During OS install, the GPU may not display anything if you’re relying on it as the primary display — use Proxmox’s VNC console temporarily, then switch to the GPU output after the driver is installed.
Windows 11 VM:
- Install Windows normally via VNC console
- Install VirtIO drivers from the VirtIO ISO for network and storage
- Install NVIDIA drivers from nvidia.com
- Switch display to the GPU’s actual output (HDMI/DisplayPort from the card)
Linux VM (for AI inference):
- Install Debian/Ubuntu normally
- Install CUDA:
apt install nvidia-cuda-toolkitor follow NVIDIA’s CUDA repo instructions for your distro - Verify:
nvidia-smishould show the GPU model and memory
Step 8: Verify passthrough is working
In the VM:
# Linux
nvidia-smi
# Should show: GPU 0: [Your GPU Model], Memory Usage: ...
# Run a quick benchmark
nvidia-smi dmon # real-time GPU monitoring
# Or test with llama.cpp
./build/bin/llama-bench -m model.gguf --n-gpu-layers 999
If nvidia-smi shows the correct GPU and VRAM, passthrough is working. The GPU is running with its native driver inside the VM.
Common issues
VM won’t boot (black screen on GPU output): Check that ROM-Bar is enabled in PCI device settings. Some GPUs also need their vBIOS passed explicitly:
# Dump the GPU vBIOS to a file on the host
cd /sys/bus/pci/devices/0000:0a:00.0/
echo 1 > rom
cat rom > /tmp/gpu.rom
echo 0 > rom
cp /tmp/gpu.rom /var/lib/vz/vgabios/gpu.rom
In the VM’s PCI device config, set ROM file to /var/lib/vz/vgabios/gpu.rom.
Error 43 in Windows: Add the kvm=off and hv_vendor_id args as described above.
IOMMU group contains other devices: If your GPU shares an IOMMU group with a USB controller or another card, you need to pass all those devices through too, or switch the GPU to a different PCIe slot (slots are often in different IOMMU groups).
GPU resets when VM stops: NVIDIA GPUs sometimes require a reset to reinitialize after a VM shutdown. Install the nvidia-vgpu-kvm patcher or use a GPU with good reset support. AMD RX 6000/7000 series generally handles resets better than NVIDIA for passthrough.
Performance expectations
A GPU running via VFIO passthrough performs within 1–3% of bare-metal for sustained workloads. The overhead is in PCIe transaction translation, not in actual GPU compute. For gaming, frame times are indistinguishable from bare metal in nearly all scenarios. For AI inference, throughput matches bare metal.
The main limitation: you lose real-time reprofiling via Afterburner while the GPU is in a VM. For the RTX 5080 undervolt workflow, run Afterburner inside the Windows VM rather than on the host.
GPU passthrough turns Proxmox into a single-machine replacement for dedicated gaming and AI rigs. For the AI inference use case, see the Local AI Workstation guide. For running local LLMs on a dedicated GPU node, the self-host a local LLM guide covers Ollama, llama.cpp, and real throughput numbers.