GPU Unlock 1.0.0

Ontgrendelen van de FP/BF16-instructiesnelheid op Nvidia 3000-serie kaarten naar professionele equivalenten

Het voordeel van deze vroege kmod-driver is dat handmatige patching niet vereist is telkens wanneer NVIDIA een nieuwe driverversie uitbrengt.

Het effect van deze ontgrendeling is dat de snelheid van het uitgeven van instructies voor FP/BF16 FMA naar FP32-operaties wordt verdubbeld op GA102, GA103, GA104 en GA106 kaarten.

Benchmarkresultaten

3090 Ti dense 8192³ GEMM bij 450 W, medianen van vijf samples met FP32-accumulatie:

InputVoorNa
FP1687.46 TFLOPS118.39 TFLOPS
BF1687.50 TFLOPS157.41 TFLOPS
TF3242.58 TFLOPS82.61 TFLOPS

Geteste kaarten

Onderstaande resultaten zijn gerapporteerd door gebruikers. De module accepteert elke GeForce ID die is vermeld in kernel/gpu_unlock/main.c, maar de onderstaande kaarten zijn de exemplaren waarvoor meldingen zijn binnengekomen.

ChipKaartPCI IDResultaatBF16 GEMM winstRapporten
GA102RTX 3090 Ti10de:2203Ontgrendeld+68–80%#1
GA102RTX 309010de:2204Ontgrendeld+25–67%#5, #9, #10, #17, #25, #27, #33
GA102RTX 3080 Ti 20 GB (OEM, GA102-250)10de:2205Ontgrendeling voltooid, BF16 blijft op halve snelheid—#28
GA102RTX 3080 10 GB10de:2206Ontgrendeld+70–73%#14
GA102RTX 3080 20 GB (geheugenupgrade)10de:2206Ontgrendeld+56–59%#10, #15
GA104RTX 307010de:2484Ontgrendeld+73–81%#10, #12
GA104RTX 3070 Ti10de:2482Niet getest met deze module (dezelfde unlock werkte via een UEFI-port op Windows)—#32
GA106RTX 3060 12 GB10de:2504Ontgrendeldongeveer +80%#13, #31
GA103alle10de:2414Nog geen rapporten——

De winsten betreffen de dense GEMM-doorvoersnelheid uit de benchmark van elk individueel rapport, waardoor ze niet direct vergelijkbaar zijn. De stroomlimiet speelt een grote rol: de laagste waarde (+25%) is afkomstig van kaarten die beperkt zijn tot 225 W.

Matrix-intensief werk versnelt, waaronder:

  • LLM prefill (+14–36% in #9, #15, #25 en #33)
  • Diffusion
  • FlashAttention

LLM-decode, dat wordt beperkt door geheugenbandbreedte, en INT8-werk blijven ongeveer gelijk. Rapporten waarin de output werd vergeleken, stelden vast dat deze bit-identiek zijn voor en na de ontgrendeling. Rapporten bestlaan ook configuraties met maximaal vier kaarten in één machine, de kaart die het display aanstuurt, en kaarten die via vfio-pci aan een VM zijn doorgegeven (#17).

Installatie

Eerste keer uitvoeren:

git clone https://github.com/Zagitta/gpu-unlock
cd gpu-unlock
make install

Voeg vervolgens gpu_unlock.targets=all toe aan je kernel-opdrachtregel, waarbij bestaande opties behouden blijven:

  • GRUB (Debian/Ubuntu/Mint): voeg het toe aan GRUBCMDLINELINUX_DEFAULT in /etc/default/grub en voer daarna sudo update-grub uit.
  • GRUB (Arch/CachyOS): dezelfde bewerking, voer daarna sudo grub-mkconfig -o /boot/grub/grub.cfg uit.
  • Fedora/RHEL: voer sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all" uit.
  • systemd-boot: voeg het toe aan de options-regel in je boot-entry (bootctl status toont de locatie).
  • UKI / gegenereerde entries: voeg het toe aan /etc/kernel/cmdline en regenereer je boot-images/entries (bijv. sudo mkinitcpio -P voor mkinitcpio UKI's).

Lokale build

Elke build downloadt de vastgelegde NVIDIA/CachyOS-inputs via HTTPS, controleert hun SHA-256 en genereert firmware uitsluitend in de build-directory en het binaire pakket. Alle drie de formaten installeren via dezelfde make install-* targets. Pakketten worden gebouwd vanaf de committed HEAD.

Bouw, installeer build-afhankelijkheden en installeer de pakketten in één stap (vraagt om sudo-wachtwoord):

  • make install (detecteert de distributie en selecteert een installer)
  • make install-arch (makepkg -sif)
  • make install-deb (apt-get build-dep, dpkg-buildpackage, apt-get install)
  • make install-rpm (dnf builddep, rpmbuild, dnf install)

make install gebruikt /etc/os-release (ID, daarna ID_LIKE) om Arch, Debian/Ubuntu of Fedora/RHEL/CentOS families te detecteren. De RPM-installer vereist DNF. Voor andere distributies kan een expliciet target hierboven worden geselecteerd.

make arch, make deb en make rpm bouwen alleen. Debian- en RPM-pakketten gaan naar build/deb en build/rpm. De NVIDIA-inputs worden gecachet in ~/.cache/gpu-unlock/inputs (make inputs; overschrijf met INPUTS=).

Omdat dpkg-buildpackage zelf nooit het netwerk gebruikt, heeft een clean-chroot build (sbuild of pbuilder) GPUUNLOCKINPUTS nodig die naar die cache wijst. Het make dist archief, het Debian-bronpakket en de .nosrc.rpm bevatten geen NVIDIA-archieven of gegenereerde firmware.

Boot-proces en opt-in

De pakketten plaatsen gpu_unlock en de bijbehorende firmware in de initramfs en laden deze daar, voordat NVIDIA een kaart kan binden:

  • mkinitcpio: /etc/mkinitcpio.conf.d/zz-gpu-unlock.conf voegt gpuunlock direct vóór nvidia in MODULES in, zodat een displaykaart zo kort mogelijk blank blijft. Zonder nvidia in het image wordt het als laatste geladen, maar nog steeds vóór een nvidia die vanaf het root-bestandssysteem wordt geladen. Images worden bij installatie herbouwd. mkinitcpio negeert drop-ins voor een image die is gebouwd met -c <config> of een preset config; plaats gpu_unlock in dat geval zelf direct vóór nvidia in de MODULES van die config.
  • initramfs-tools: /usr/share/initramfs-tools/modules.d/gpu-unlock.conf.
  • dracut: /usr/lib/dracut/dracut.conf.d/gpu-unlock.conf.

Bij initramfs-tools en dracut wordt de module gebouwd voor elke geïnstalleerde kernel die headers heeft; deze images worden herbouwd bij installatie en verwijdering. Later geïnstalleerde kernels krijgen de module en een nieuw image via de eigen install-hooks van de kernel.

Er is geen softdep nvidia pre: regel: kmod respecteert alleen de eerste softdep nvidia regel die het leest, dus regels van andere pakketten (nvidia-utils, gddr6_hwmon) zouden deze stilzwijgend overschrijven, of andersom.

De module doet niets tenzij de kernel-opdrachtregel dit activeert:

  • gpu_unlock.targets=all (elke ongebonden GA102/GA103/GA104/GA106 kaart)
  • gpu_unlock.targets=0000:21:00.0 (alleen deze kaarten)
  • gpu_unlock.targets=0000:21:00.0,0000:22:00.0 (komma-gescheiden)

Adressen zijn volledige PCI-namen zoals lspci -D ze print (hexadecimale cijfers in beide schrijfwijzen), onafhankelijk van GPU-nummering en display-rol. Een vermelding die geen GA102/GA103/GA104/GA106 kaart is, inclusief alle gemengde adressen, wordt gelogd en genegeerd.

De kaarten worden gelijktijdig ontgrendeld (ongeveer een seconde voor alle aanwezige kaarten), en elk afzonderlijk: een kaart die al gebonden is of is uitgeschakeld, wordt overgeslagen. Bus mastering die door de board-firmware is ingeschakeld (Supermicro X11 doet dit ongeacht de option ROM en bus master instellingen) wordt eerst gewist; een kaart die door een andere driver is geïnitialiseerd, wordt nog steeds geweigerd. Daarna laadt nvidia en bindt elke kaart zoals gebruikelijk.

De displaykaart werkt ook. De firmware-framebuffer (de boot-console en Plymouth) blijft draaien terwijl de firmware-stappen van de unlock worden uitgevoerd, en wordt verwijderd vlak voor de reset van de kaart, zoals nvidia-drm een moment later sowieso zou doen. Het scherm is blank vanaf die reset tot nvidia-drm het overneemt.

Het handmatig laden van de module na het opstarten heeft geen effect op een kaart die door nvidia is gebonden.

Slaapstand en hervatten: Suspend to RAM schakelt de kaarten uit, wat de snelheidselectoren reset. Na het hervatten ontgrendelt de module elke kaart die bij het opstarten is ontgrendeld, voordat nvidia deze hervat: de suspend-notifier draait vlak vóór degene waarmee nvidia zijn kaarten hervat (NVregUseKernelSuspendNotifiers=1, de standaard in huidige drivers; nvidia-resume.service draait nog later). Dit voegt ongeveer een seconde toe aan het hervatten. Een kaart die stroom behield, zoals bij suspend-to-idle, blijft ontgrendeld en wordt alleen gelezen. Een kaart die NVIDIA al heeft hervat, of die is gebonden aan een andere driver, blijft zoals hij is, en het logboek vermeldt waarom. Voeg gpuunlock.resume=0 toe aan de kernel-opdrachtregel, of schrijf 0 naar /sys/module/gpu_unlock/parameters/resume, om dit uit te schakelen. Hibernatie wordt niet ondersteund.

Resultaat controleren

Controleer het resultaat met:

journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:21:00.0

Om de ontgrendeling te stoppen, verwijder je gpu_unlock.targets= uit de kernel-opdrachtregel; voor een eenmalige boot verwijder je dit in het bewerkingsscherm van de bootloader. Het verwijderen van de pakketten verwijdert ook de module en de initramfs drop-ins.

Als de firmware op een kaart nooit stopt, logt de module dit en behoudt hij de DMA-buffers die de firmware mogelijk nog gebruikt tot de volgende stroomonderbreking. Schakel de stroom uit voordat je het opnieuw probeert.

Licenties

De kernelmodule en lokale packaging zijn GPL-2.0-only. De gegenereerde payload is afgeleid van de vastgelegde CMP-referentie; NVIDIA-firmware blijft onder haar eigen voorwaarden. Zie firmware/NOTICE.md en licenses/ voor attributie en mededelingen.