One node, three GPUs, ten guests: building the home Proxmox rack

2026.03.18 · 11 min · proxmox, homelab, gpu, rocm

A Ryzen 7700, an MI50, a 1080 Ti, and a Raphael iGPU walk into a hypervisor. The hardware was not the hard part — deciding which GPU gets which treatment was.

I wanted one box to handle everything — gaming Windows VM, LLM inference, Nextcloud, monitoring stack — without switching between machines. The hardware came together over a few months and was pretty straightforward to plan. Figuring out how to split three GPUs across ten guests without them fighting each other was less straightforward.

Why Proxmox

Type-1 hypervisor, open source, web UI that doesn't require memorizing qemu flags every time I want to resize a disk. The bigger reason was native LXC support alongside full VMs — most of my workloads are Linux services that don't need full hardware emulation, and containers are noticeably lighter and faster to clone than VMs. Running both on the same host without extra tooling was the main draw.

The hardware

Ryzen 7 7700, 8 cores at 3.8GHz base with a 5.4GHz boost. 32GB DDR5, though Proxmox addresses 30GB after hardware reservations. Three GPUs: AMD Instinct MI50 with 32GB HBM2, GTX 1080 Ti, and the Raphael iGPU built into the 7700. Two NVMe drives — 1.9T for Proxmox root and most guest disks, 931GB dedicated to Windows. A 1.8T spinner for Nextcloud bulk storage. There's a second 931GB HDD sitting idle.

:::

The GPU problem

The 1080 Ti went to the Windows VM via PCIe passthrough — exclusive ownership, the card disappears from the host entirely when Windows boots. That left the MI50 and the Raphael iGPU for all the Linux workloads.

Sharing the MI50 between containers is simpler than it sounds. Both ubuntu-llm and ubuntu-ai get it via bind-mount: the host exposes /dev/dri and /dev/kfd directly into each container. ROCm doesn't need kernel modules in the guest — it talks to the host amdgpu driver through those character devices. The Raphael iGPU follows the same pattern.

warn LXC GPU access is not automatic Getting ROCm working inside a privileged LXC container required manually setting cgroup device permissions for /dev/dri/renderD128 and /dev/kfd. Proxmox doesn't configure this automatically. I baked the permissions into a base template — new AI containers clone from it and have GPU access from first boot. :::

The 1080 Ti couldn't go the same route. The NVIDIA driver expects to own the hardware directly and doesn't work through shared device files. Passthrough was the only option, so Windows gets the card exclusively when it's running. It's stopped most of the time anyway, so this works fine in practice.

Storage layout

Most things live on the 1.9T NVMe under the pve LVM group — Proxmox itself, LXC root filesystems, and VM disks for InfluxDB, Grafana, Minecraft, and the rest. Nextcloud gets 256GB of NVMe for its OS and database, then the 1.8T spinning disk for actual file storage. Windows is on a separate 931GB NVMe pool, isolated from pve so nothing on one side can interfere with the other.

Networking

Single Linux bridge (vmbr0) across all guests, DHCP everywhere. Static addresses live at the router rather than in the guest configs — that way I can reconfigure without touching nine separate network files.

Tailscale runs on the host as both an exit node and a subnet router. Every device on my Tailnet can reach any guest without VPN configuration in the guests themselves. The Proxmox web UI is behind Tailscale only, never exposed directly to the home LAN bridge.

What runs on it

- Nextcloud — file storage and sync. 4GB RAM, 1.8T on the spinner. - nginxproxymanager — reverse proxy and TLS for anything with an external hostname. - ubuntu-llm — LLM inference via llama.cpp, shared MI50, 32GB RAM. - influxdb — time series metrics from all guests. - grafana — dashboards watching the whole stack. - ubuntu-ai — AI dev environment, shared MI50 and Raphael iGPU, 8GB RAM. - Windows (stopped) — gaming and Windows-only work, GTX 1080 Ti passthrough, 16GB RAM. Starts on demand.

Current state

39 days uptime at time of writing. The MI50 share between ubuntu-llm and ubuntu-ai hasn't caused any contention — they don't actually run inference at the same time in practice. The 1080 Ti stays idle until Windows boots. Having the monitoring stack in place means I'll see problems before I happen to notice them myself, which was the main thing I wanted.

ubuntu-ai-template-v2 has been cloned twice since I built it. Both times GPU access worked on first boot with no manual config. Ten minutes building the template saved at least thirty minutes of debugging per clone.