,

Del ett GPU til flere Proxmox-LXC-er uten VFIO

Del ett GPU til flere Proxmox-LXC-er uten VFIO

Du har ett GPU og flere lette tjenester som gjerne vil ha en bit av det: en transkoder, en inferensserver, litt ML-fikling på si. VFIO gir hele kortet til én virtuell maskin og låser det der. Det blir fort sløsing når kortet står og ruller tomgang mesteparten av døgnet. Alternativet er å dele det ut til flere uprivilegerte LXC-containere, uten VFIO, og likevel få tilnærmet native ytelse.

Prinsippet

Skjematisk arkitektur der ett fysisk GPU på Proxmox-verten deles til flere uprivilegerte LXC-containere via bind-mount, med kjernemodulen kun på verten

Kjernemodulen bor kun på verten. Hver container får tak i GPU-enhetene gjennom bind-mount og kjører en brukerromsdriver uten egen kjernemodul. Dermed deler alle containerne det samme fysiske kortet samtidig. Ingen dedikert VM, ingen som sitter på enerett.

Steg 1: Driver på verten

Start med å installere NVIDIA-driveren på selve Proxmox-verten. Så sjekker du at enhetene faktisk dukket opp:

nvidia-smi
ls -l /dev/nvidia*

Du skal se /dev/nvidia0, /dev/nvidiactl, /dev/nvidia-uvm og gjerne /dev/nvidia-modeset. Noter deg major-numrene fra ls -l. De trenger du om litt, til cgroup-reglene.

Steg 2: Bind-mount og cgroup i containeren

Nå redigerer du containerkonfigurasjonen, og det gjør du på verten. Du legger inn enhetene og åpner for cgroup-tilgang. Husk å bytte ut major-numrene med dine egne:

# /etc/pve/lxc/<CTID>.conf
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 234:* rwm
lxc.cgroup2.devices.allow: c 511:* rwm

lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file

Containeren skal være uprivilegert, og det er nettopp derfor cgroup-reglene betyr så mye: det er de som avgjør om enhetene faktisk lar seg bruke. Dropper du dem, får du permission denied selv om mount-punktet ligger pent på plass.

Steg 3: Brukerromsdriver i containeren

Flytdiagram som viser at kjernemodulen ligger på verten mens hver container kjører en brukerromsdriver uten kjernemodul, koblet via device-noder og cgroup-regler

Inne i containeren installerer du nøyaktig samme driverversjon, bare uten kjernemodulen. Den kommer nemlig fra verten:

./NVIDIA-Linux-x86_64-<versjon>.run --no-kernel-module

Så starter du containeren og sjekker at det virker:

pct start <CTID>
pct exec <CTID> -- nvidia-smi

Dukker GPU-et opp i tabellen, er delingen på plass. Så er det bare å gjenta steg 2 og 3 for hver container som skal ha tilgang.

Forbehold

  • Versjonene må matche. Brukerromsdriveren i containeren må ha helt samme versjon som kjernemodulen på verten. Oppgraderer du verten, må hver container oppdateres i samme slengen, ellers slutter nvidia-smi brått å svare inne i containeren.
  • Cgroups må stemme. Major-numrene er ikke like fra system til system. Sjekk dem med ls -l /dev/nvidia* før du skriver reglene, ikke etterpå.
  • Dette er deling, ikke isolasjon. Alle containerne ser samme minne og kan slåss om ressursene.

Konklusjon

Skal flere lette tjenester dele ett kort, slår dette VFIO ganske klart: samtidig tilgang, ingen ekstra VM å dra på, native ytelse. Trenger du derimot hard isolasjon, eller hele kortet til én tung jobb, er VFIO fremdeles rett verktøy. For alt det andre holder det lenge med bind-mount og cgroup-regler som stemmer.


Trenger du hjelp med dette?

Ta kontakt for en uforpliktende prat om hvordan jeg kan hjelpe deg.

Navn