Proxmox 9.0 + Intel B50 SR-IOV -- finally its almost here! Early Adopter's Guide

Background

thank you to our subscribers! for making this project possible.

Kernel 6.17 is going to be needed (or backported DKMS modules) for B50/B60 SR-IOV. In addition you need specific firmware.

If you’ve been following my other content i.e. Flex 170 then you know a bit about DKMS and the out-of-tree i915 driver. Thankfully you do not need to go this route with the B50/B60.

Setting up Proxmox

It is necessary to download the Proxmox patches to the kernel and make adjustments, including to apparmor, for the newer kernel. As of 2025-10-05 Proxmox 9.x is on Kernel 6.14.8-8-2-PVE and so it isn’t a huge leap.

We also need ZFS patches, remember, for the proxmox kernel and there can be some serious side-effects of jumping the gun on PVE versions of the kernel. As such don’t use this in production until we get a fully-vetted Proxmox 9 official supported kernel.

Update: This guy beat me to it!

this is the general build guide to build your own kernel. There are .debs provided there in release, but this isn’t too hard to build your own kernel and look over the patches there for any changes. It’s a reasonable starting point.

TODO Notes

I have some notes; should submit a Pull Request and/or clone that repo. High-fives jaminmc , nice work.

Ah, he ran into the same app armor issues:
*Ok, I have worked on this for over a week. I kept having Apparmor issues, as the newer kernels changed it, and my podman container was causing it to crash, and made my system unstable. Then today I had the bright idea to just patch it back to the 6.14 apparmor. Well, that didn’t compile, but with the help of Cursor. I was able to make a 2nd patch that fixed the older apparmor to work with 6.17.

GitHub - jaminmc/pve-kernel: Read-Only source code mirror, Proxmox uses mailing list workflow for development. is the git of all the changes I made to make it work. along with GitHub - jaminmc/pve-firmware for the firmware. So you can compile it yourself, if you don’t trust me. (I wouldn’t trust any random person building the kernel)

But if you are willing to risk it, I have my compiled debs here: Release Test Kernel 6.17 · jaminmc/pve-kernel · GitHub*

Neat!

Post-Kernel Install

 uname -a
Linux b50test 6.17.0-5.5-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.0-5.5 (2025-09-25T10:04Z) x86_64 GNU/Linux

That’s looking as it should.

lspci -vvv for the XE device:

03:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics] (prog-if 00 [VGA controller])
        Subsystem: Intel Corporation Device 1114
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin ? routed to IRQ 128
        IOMMU group: 14
        Region 0: Memory at 1a00000000 (64-bit, prefetchable) [size=16M]
        Region 2: Memory at 1c00000000 (64-bit, prefetchable) [size=16G]
        Expansion ROM at fb800000 [disabled] [size=2M]
        Capabilities: [40] Vendor Specific Information: Len=0c <?>
        Capabilities: [70] Express (v2) Endpoint, IntMsgNum 0
                DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
                        ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0W TEE-IO-
                DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-
                        RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset-
                        MaxPayload 256 bytes, MaxReadReq 512 bytes
                DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
                LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <64ns, L1 <1us
                        ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
                LnkCtl: ASPM L1 Enabled; RCB 64 bytes, LnkDisable- CommClk-
                        ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
                LnkSta: Speed 2.5GT/s, Width x1
                        TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
                DevCap2: Completion Timeout: Range B, TimeoutDis+ NROPrPrP- LTR+
                         10BitTagComp+ 10BitTagReq+ OBFF Not Supported, ExtFmt+ EETLPPrefix-
                         EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
                         FRS- TPHComp- ExtTPHComp-
                         AtomicOpsCap: 32bit- 64bit- 128bitCAS-
                DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
                         AtomicOpsCtl: ReqEn-
                         IDOReq- IDOCompl- LTR+ EmergencyPowerReductionReq-
                         10BitTagReq- OBFF Disabled, EETLPPrefixBlk-
                LnkCap2: Supported Link Speeds: 2.5GT/s, Crosslink- Retimer- 2Retimers- DRS-
                LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-
                         Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
                         Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot
                LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
                         EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
                         Retimer- 2Retimers- CrosslinkRes: unsupported
        Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable+ 64bit+
                Address: 00000000fee00000  Data: 0000
                Masking: 00000000  Pending: 00000000
        Capabilities: [d0] Power Management version 3
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold-)
                Status: D3 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [100 v1] Alternative Routing-ID Interpretation (ARI)
                ARICap: MFVC- ACS-, Next Function: 0
                ARICtl: MFVC- ACS-, Function Group: 0
        Capabilities: [110 v1] Null
        Capabilities: [200 v1] Address Translation Service (ATS)
                ATSCap: Invalidate Queue Depth: 00
                ATSCtl: Enable+, Smallest Translation Unit: 00
        Capabilities: [420 v1] Physical Resizable BAR
                BAR 2: current size: 16GB, supported: 256MB 512MB 1GB 2GB 4GB 8GB 16GB
        Capabilities: [220 v1] Virtual Resizable BAR
                BAR 2: current size: 2GB, supported: 256MB 512MB 1GB 2GB 4GB 8GB 16GB
        Capabilities: [320 v1] Single Root I/O Virtualization (SR-IOV)
                IOVCap: Migration- 10BitTagReq+ IntMsgNum 0
                IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ 10BitTagReq-
                IOVSta: Migration-
                Initial VFs: 12, Total VFs: 12, Number of VFs: 0, Function Dependency Link: 00
                VF offset: 1, stride: 1, Device ID: e212
                Supported Page Size: 00000553, System Page Size: 00000001
                Region 0: Memory at 0000001a01000000 (64-bit, prefetchable)
                Region 2: Memory at 0000002000000000 (64-bit, prefetchable)
                VF Migration: offset: 00000000, BIR: 0
        Capabilities: [400 v1] Latency Tolerance Reporting
                Max snoop latency: 1048576ns
                Max no snoop latency: 1048576ns
        Kernel driver in use: xe
        Kernel modules: xe

Ohhh home drool emojii

 Capabilities: [320 v1] Single Root I/O Virtualization (SR-IOV)
                IOVCap: Migration- 10BitTagReq+ IntMsgNum 0
                IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ 10BitTagReq-
                IOVSta: Migration-
                Initial VFs: 12, Total VFs: 12, Number of VFs: 0, Function Dependency 

Now, we need to enable SR-IOV functions, which involves finding the device under /sys/devices

in my case lspci shows 03:00.0 which was at:
root@b50test:/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:01.0/0000:03:00.0

In this folder is sriov_numvfs so we just echo 4 > sriov_numvfs

running that doesn’t return an error, however the kernel debug log output looks very promising:

[  542.166252] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 1045172224 (997 MiB) GGTT
[  542.167608] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 4234149888 (3.94 GiB) LMEM
[  542.167842] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 16319 GuC context IDs
[  542.168063] xe 0000:03:00.0: [drm] GT0: PF: VF1..VF4 provisioned with 64 GuC doorbell IDs
[  542.168376] xe 0000:03:00.0: [drm] GT1: PF: VF1..VF4 provisioned with 16319 GuC context IDs
[  542.168591] xe 0000:03:00.0: [drm] GT1: PF: VF1..VF4 provisioned with 64 GuC doorbell IDs
[  542.276147] pci 0000:03:00.1: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[  542.276331] pci 0000:03:00.1: Adding to iommu group 33
[  542.276701] pci 0000:03:00.1: vgaarb: no bridge control possible
[  542.276703] pci 0000:03:00.1: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[  542.276705] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[  542.276707] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
[  542.276785] xe 0000:03:00.1: enabling device (0000 -> 0002)
[  542.277423] xe 0000:03:00.1: [drm] Running in SR-IOV VF mode
[  542.279645] xe 0000:03:00.1: [drm] VF: migration not supported by this module version
[  542.285772] xe 0000:03:00.1: [drm] VISIBLE VRAM: 0x0000002000000000, 0x0000000100000000
[  542.285774] xe 0000:03:00.1: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[  542.285776] xe 0000:03:00.1: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002000000000-20fc600000]
[  542.285778] xe 0000:03:00.1: [drm] Total VRAM: 0x0000002000000000, 0x00000000fc600000
[  542.285780] xe 0000:03:00.1: [drm] Available VRAM: 0x0000002000000000, 0x00000000fc600000
[  542.344635] xe 0000:03:00.1: [drm] GT0: ccs1 fused off
[  542.344641] xe 0000:03:00.1: [drm] GT0: ccs2 fused off
[  542.344642] xe 0000:03:00.1: [drm] GT0: ccs3 fused off
[  542.353810] xe 0000:03:00.1: [drm] GT1: vcs1 fused off
[  542.353812] xe 0000:03:00.1: [drm] GT1: vcs3 fused off
[  542.353813] xe 0000:03:00.1: [drm] GT1: vcs4 fused off
[  542.353814] xe 0000:03:00.1: [drm] GT1: vcs5 fused off
[  542.353815] xe 0000:03:00.1: [drm] GT1: vcs6 fused off
[  542.353816] xe 0000:03:00.1: [drm] GT1: vcs7 fused off
[  542.353817] xe 0000:03:00.1: [drm] GT1: vecs2 fused off
[  542.353818] xe 0000:03:00.1: [drm] GT1: vecs3 fused off
[  542.358961] [drm] Initialized xe 1.1.0 for 0000:03:00.1 on minor 3
[  542.359151] pci 0000:03:00.2: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[  542.359310] pci 0000:03:00.2: Adding to iommu group 34
[  542.359422] pci 0000:03:00.2: vgaarb: no bridge control possible
[  542.359424] pci 0000:03:00.2: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[  542.359426] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[  542.359428] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[  542.359490] xe 0000:03:00.2: enabling device (0000 -> 0002)
[  542.359780] xe 0000:03:00.2: [drm] Running in SR-IOV VF mode
[  542.360041] xe 0000:03:00.2: [drm] VF: migration not supported by this module version
[  542.360631] xe 0000:03:00.2: [drm] VISIBLE VRAM: 0x0000002100000000, 0x0000000100000000
[  542.360633] xe 0000:03:00.2: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[  542.360635] xe 0000:03:00.2: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002100000000-21fc600000]
[  542.360637] xe 0000:03:00.2: [drm] Total VRAM: 0x0000002100000000, 0x00000000fc600000
[  542.360638] xe 0000:03:00.2: [drm] Available VRAM: 0x0000002100000000, 0x00000000fc600000
[  542.431217] xe 0000:03:00.2: [drm] GT0: ccs1 fused off
[  542.431221] xe 0000:03:00.2: [drm] GT0: ccs2 fused off
[  542.431222] xe 0000:03:00.2: [drm] GT0: ccs3 fused off
[  542.435802] xe 0000:03:00.2: [drm] GT1: vcs1 fused off
[  542.435805] xe 0000:03:00.2: [drm] GT1: vcs3 fused off
[  542.435806] xe 0000:03:00.2: [drm] GT1: vcs4 fused off
[  542.435807] xe 0000:03:00.2: [drm] GT1: vcs5 fused off
[  542.435808] xe 0000:03:00.2: [drm] GT1: vcs6 fused off
[  542.435809] xe 0000:03:00.2: [drm] GT1: vcs7 fused off
[  542.435810] xe 0000:03:00.2: [drm] GT1: vecs2 fused off
[  542.435811] xe 0000:03:00.2: [drm] GT1: vecs3 fused off
[  542.440128] [drm] Initialized xe 1.1.0 for 0000:03:00.2 on minor 4
[  542.440296] pci 0000:03:00.3: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[  542.440481] pci 0000:03:00.3: Adding to iommu group 35
[  542.440836] pci 0000:03:00.3: vgaarb: no bridge control possible
[  542.440838] pci 0000:03:00.3: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[  542.440840] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[  542.440842] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[  542.440907] xe 0000:03:00.3: enabling device (0000 -> 0002)
[  542.441025] xe 0000:03:00.3: [drm] Running in SR-IOV VF mode
[  542.442089] xe 0000:03:00.3: [drm] VF: migration not supported by this module version
[  542.443881] xe 0000:03:00.3: [drm] VISIBLE VRAM: 0x0000002200000000, 0x0000000100000000
[  542.443883] xe 0000:03:00.3: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[  542.443885] xe 0000:03:00.3: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002200000000-22fc600000]
[  542.443887] xe 0000:03:00.3: [drm] Total VRAM: 0x0000002200000000, 0x00000000fc600000
[  542.443889] xe 0000:03:00.3: [drm] Available VRAM: 0x0000002200000000, 0x00000000fc600000
[  542.514306] xe 0000:03:00.3: [drm] GT0: ccs1 fused off
[  542.514308] xe 0000:03:00.3: [drm] GT0: ccs2 fused off
[  542.514309] xe 0000:03:00.3: [drm] GT0: ccs3 fused off
[  542.520234] xe 0000:03:00.3: [drm] GT1: vcs1 fused off
[  542.520236] xe 0000:03:00.3: [drm] GT1: vcs3 fused off
[  542.520237] xe 0000:03:00.3: [drm] GT1: vcs4 fused off
[  542.520238] xe 0000:03:00.3: [drm] GT1: vcs5 fused off
[  542.520239] xe 0000:03:00.3: [drm] GT1: vcs6 fused off
[  542.520240] xe 0000:03:00.3: [drm] GT1: vcs7 fused off
[  542.520241] xe 0000:03:00.3: [drm] GT1: vecs2 fused off
[  542.520242] xe 0000:03:00.3: [drm] GT1: vecs3 fused off
[  542.524715] [drm] Initialized xe 1.1.0 for 0000:03:00.3 on minor 5
[  542.524886] pci 0000:03:00.4: [8086:e212] type 00 class 0x030000 PCIe Endpoint
[  542.525096] pci 0000:03:00.4: Adding to iommu group 36
[  542.525212] pci 0000:03:00.4: vgaarb: no bridge control possible
[  542.525214] pci 0000:03:00.4: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[  542.525215] xe 0000:03:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io
[  542.525217] amdgpu 0000:10:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[  542.525265] xe 0000:03:00.4: enabling device (0000 -> 0002)
[  542.525488] xe 0000:03:00.4: [drm] Running in SR-IOV VF mode
[  542.525769] xe 0000:03:00.4: [drm] VF: migration not supported by this module version
[  542.526381] xe 0000:03:00.4: [drm] VISIBLE VRAM: 0x0000002300000000, 0x0000000100000000
[  542.526384] xe 0000:03:00.4: [drm] VRAM[0, 0]: Actual physical size 0x00000000fc600000, usable size exclude stolen 0x00000000fc600000, CPU accessible size 0x00000000fc600000
[  542.526387] xe 0000:03:00.4: [drm] VRAM[0, 0]: DPA range: [0x0000000000000000-fc600000], io range: [0x0000002300000000-23fc600000]
[  542.526389] xe 0000:03:00.4: [drm] Total VRAM: 0x0000002300000000, 0x00000000fc600000
[  542.526391] xe 0000:03:00.4: [drm] Available VRAM: 0x0000002300000000, 0x00000000fc600000
[  542.592657] xe 0000:03:00.4: [drm] GT0: ccs1 fused off
[  542.592661] xe 0000:03:00.4: [drm] GT0: ccs2 fused off
[  542.592662] xe 0000:03:00.4: [drm] GT0: ccs3 fused off
[  542.597185] xe 0000:03:00.4: [drm] GT1: vcs1 fused off
[  542.597187] xe 0000:03:00.4: [drm] GT1: vcs3 fused off
[  542.597188] xe 0000:03:00.4: [drm] GT1: vcs4 fused off
[  542.597189] xe 0000:03:00.4: [drm] GT1: vcs5 fused off
[  542.597190] xe 0000:03:00.4: [drm] GT1: vcs6 fused off
[  542.597191] xe 0000:03:00.4: [drm] GT1: vcs7 fused off
[  542.597193] xe 0000:03:00.4: [drm] GT1: vecs2 fused off
[  542.597194] xe 0000:03:00.4: [drm] GT1: vecs3 fused off
[  542.600567] [drm] Initialized xe 1.1.0 for 0000:03:00.4 on minor 6
[  542.600894] xe 0000:03:00.0: [drm] PF: Enabled 4 of 12 VFs

and the output of lspci has changed:
03:00.0 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.1 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.2 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.3 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]
03:00.4 VGA compatible controller: Intel Corporation Battlemage G21 [Intel Graphics]

From here we simply pass through a virtual function to a VM and install the XE drivers (which are kinda beta atm!)

It is worth checking also that lspci shows the Xe graphics device bound to vfio-pci instead of xe:

        Kernel driver in use: vfio-pci
        Kernel modules: xe

… you can resort to manual blacklisting but so far modern Proxmox is pretty good about Doing The Right Thing without resorting to blacklisting.

Set up the VM

Do the normal windows install, with something like these settings. We do not map the GPU yet!

Note I recommend mapping TWO isos to the vm, one that is your windows install ISO and one that contains the VirtIO drivers:
https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers
(download from proxmox or IBM)

Disk setup (oh no, there is no disk!)

just hit browse, and go to vioscsi
image

and install those drivers. then the disk will show up:

image

… this driver has much less overhead and performs well vs alternatives.

From there, that will get you to a “normal” windows desktop. It is now that I would suggest enabling remote desktop and making sure you can RDP into this VM from another machine.

To attach the SR-IOV virtual funciton, that is done in the datacenter area of proxmox:

Datacenter > resource mappings > add the .1 .2 .3 .4 (etc) virtual functions that showed up in lspci earlier.

then, in the VM you created, it is possible to add a pcie device:


image

Note: Be sure to select advanced and then pcie=1

It is possible to add it as the primary gpu device but generally I don’t do that until 1) it is on the network and RDP is working and 2) the drivers are installed. So it can be a bit of a two step process here.

It can also solve some weird bugs in this beta state to remove the spice/vnc display adapter once you have this one working. Hence why it is a good idea to setup RDP ahead of time.

The 2025-10-1 drivers seem to have some bug that causes windows 11 to crash before login and RDP not to work (immediate log out/explorer crashes).

… so you need to start with this older driver and see how it goes.

https://www.intel.com/content/www/us/en/download/741626/intel-arc-pro-graphics-windows.html

These drivers are confirmed working (albeit … somewhat beta). Note I recommend you setup your B50 in a stand-alone windows machine and install this driver. It has a firmware update bundled in the driver. Firmware can’t update on vfio stubs:

image

and then finally check out that sweet tasty gpu accelerated RDP session:

all gpu utilization, no cpu utilization dragging around the virtual earth thingie.

heaven: at ~~150+ fps

the performance can be very inconsistent running heaven, for example. from 20 to 150fps, especially when running lots of copies of heaven at once.

but this is quite promising.

Note: Still Writing this up this very minute…

13 Likes

The wait for no-bullshit dGPU SR-IOV is finally over. :face_holding_back_tears:

TY

4 Likes

F* me :smiley: going an a B50 Hunt right away

it isn’t the case here, but i probably would at the very least trust it a little if there was a paper trail for the build, in other words, a public CI job’s build log and workflow.

this is all very neat, I’d love to test it out too if I had the hardware :sweat_smile:

I tried this on my Linux Mint machine. I compiled a new 6.17 kernel and tried the echo 4> sriov_numvfs thing. Yes, it works :slight_smile:
However I could not get it to do anything much useful. I started a Windows VM. The VM sees the GPU as a 4 GB card and I installed the B50 Pro drivers. But I was unable to get GPU acceleration to really work in RDP. I can see that it uses the GPU, but the performance is very low. Probably not a GPU issue but rather a RDP issue I would imagine.
I also tried LookingGlass, but I cannot get it to work at all. Will do some more research, I probably need a dummy HDMI dongle to make that work.

Also tried some LLMs using Vulcan in LM studio, but the performance is about half that of what I get for the CPU inferencing (a 4B LLM model). 44 tokens per second on the CPU (AMD 9950X, 64 GB RAM). The Intel GPU gave me about 20 tokens per second.
Tried to load gpt-oss-20b to the GPU but it cannot handle it. Probably a driver related issue.
Would love to read more about what experience other people have

this will sound insane, but download the heaven benchmark and run it (not full screen mode) in RDP.

then drag it halfway off the viewport. see if htat dramatically improves the frame rate.

then drag it back. And see if the framerate stays improved.

gdb seems to show this switches from unaligned memory copies to… aligned memory copies. its the difference between 20 and 140 fps.

if you run two instances instead of 4 you should get 8gb per instance. How that’s working is a bit weird. On the flex170 cards you had to explicitly specify ahead of time how you wanted to do things in order to get consistent behavior.

Even then it was possible for one VM doing bad things to crash the gpus in the other VMs.

The output of nvtop with 4 instances is also… not correct looking

1 Like

Hell yeah, i have been waiting for this for so long. I already have Pro B50 waiting for the weekend so i can play with it.

Lol, that’s specifically insane enough I can fully believe it’s a thing.

This does look amazing, and Europe pricing is not (going to be) insane!

If I got this correctly, you can use SR-IOV to accelerate graphics in VMs, but you can’t use individual video out per VM - you still need to use SPICE/VNC/Whatever client?

Basically - no 4 PCs in 1 (since B50 has 4 mini DPs).

I tried what you suggested, the FPS counter in the heaven benchmark shows between 60-100 fps or so, but the RDP graphics is slow and choppy. Even if I move the window half way outside the viewport. I tried this with the full GPU forwarded, not using SR-IOV.
My RDP client is Remmina, maybe a real Windows RDP client would be better, but I don’t have any WIndows machine in the office right now.

Also there is some funny business going on with the GPU fan. When the GPU is connected to the VM it increases to 100% speed This is without any GPU load (or like 1% load). Temp is 30 degrees. When I start some graphics load, the fan slows down to a more realistic level. 100% load at about 70 degrees. Fan speed unknown, but almost inaudible.

This is huuuuuuuugeeeee ! Only bummer is that a bunch of applications (e.g. Plex) still don’t seem to support the xe driver ;( But we’re getting there. For now I’m still running my B50 Pro on a dedicated VM with Ubuntu 25.10 just to play around.

wrt DKMS backports, looks like the xe module was added to GitHub - strongtz/i915-sriov-dkms: dkms module of Linux i915 driver with SR-IOV support 2 days ago? Shouldn’t this be easier/more streamlined?

1 Like

I’ve got a bunch of flex 140 gpus, what are the chances that they will work with this stuff? I’d love for it to be less of a hassle

should work great! but with the out of tree dkms driver, not this, probably. got an extra one or two you could send I could poke at? :slight_smile:

Mildly possible, I will have to get that approved and make sure it’s ok, and I unfortunately couldn’t let you keep them forever, but I don’t think there would be an issue sending one or two your way for a few months

Just weighing in, I set this up tonight on a test box and I am blown away by how dead simple this is and how well it works. I Installed Windows, updated to the September Arc Pro driver to get the firmware, erased that and installed Proxmox 9, installed the required kernel and patches, rebooted, then located the device using lspci -t, poked the appropriate sriov_numvfs , and immediately the functions were enabled and visible in the Proxmox gui. I created a mapping for them called “b50-pro” then I pulled four VM images from my PBS server, including two prod jellyfin servers, assigned the b50-pro pcie device to all four machines and let it rip.

No crashes, which was a great sign, I then installed the same September Arc pro driver in all four machines, and it didn’t even require a reboot to start working. Jellyfin media transcoding is just… working perfectly out of the box and providing H.264 40mbit → AV1 20mbit encoding at 250fps. This is better than the A310 or the A380, at half the power consumption. Under SR-IOV!

This is astoundingly good. The entire process took less than an hour, including the 300gb worth of VM backups I had to pull. I did not have to change any system settings, I didn’t have to fiddle with VFIO, override kernel parameters, I didn’t even need to stub out the xe driver, proxmox just, as Wendell puts it, “Does The Right Thing”.

This truly is a game changer. I’ll be buying two more of these cards to go in my cluster just as soon as they come back in stock. I might have to loan one to the VDI admin where I work and see if I can convert him because paying licensing fees in the 5-6 figure range monthly for SR-IOV is beyond silly when this exists.

3 Likes

Do any of you know if a B50 will fit and run well in a minisforum ms-a2? Hoping to eventually use this for transcoding in a Kubernetes cluster running on VMs in proxmox for my homelab.

This sounds great!

How do the video outs work in this setup (assuming the rendered images on the web are correct and there are 4 video outs)? Can each be allocated to a VM/virtual card? Or does one virtual card own them all? I’m hoping video out is possible for at least one VM… :crossed_fingers:

wont fit, B50 is a double height card. could do oculink external enclosure though.

no video outs for sr-iov, network/rdp only.

2 Likes

@alxandr Well, not without some aftermarket assistance.

We saw this for the A2000, why not B50? Coming December/January, assuming it works, this would allow it to fit physically in the minisforum MS series. I’m personally using that slot for dual 25g in my MS-A2 systems, but a tiny 10 inch rack full of MS’s equipped with these would really be something else.

2 Likes