Installer GPU Unlock
L'ordre compte : compiler localement, laisser le paquet placer le bon module (gpu_unlock ou turing_unlock) dans l'initramfs avant nvidia, activer via la ligne de commande du noyau, et seulement ensuite rendre l'entrée de démarrage persistante.
À lire avant de commencer
Le module écrit des registres speed-select et effectue un FLR avant que le pilote NVIDIA ne se lie. Conservez une entrée de démarrage d'origine. Validez un démarrage à froid avant de rendre quoi que ce soit persistant. Le chemin AD103 est expérimental et n'a été validé que sur une carte. Le procédé Turing fait de même ; en plus, son README avertit que les cœurs tensoriels consomment énormément et que les débrider à pleine vitesse peut endommager le matériel.
Ce qu'il vous faut
- Linux with kernel headers and a working DKMS toolchain (all three forks).
- GPL-2.0-only source built locally — the pinned NVIDIA firmware is downloaded and generated on your own machine.
- An unmodified stock boot entry kept available, so a failed unlock is recoverable.
- A card whose PCI ID is in the module's accepted list (see the cards index).
1. Pick the fork that matches your card
The Ampere fork (Zagitta/gpu-unlock, v1.0.0) covers GA102, GA103, GA104 and GA106. The Ada fork (JustAResearcher/gpu-unlock-ada, v1.1.1) is that same module with AD102 (RTX 4090) and an experimental AD103 canary added, so it also handles the Ampere device list. The Turing fork (nlzy/turing-unlock, v2.0.0) is a separate module for the RTX 20 series: TU102, TU104 and TU106.
2. Clone and build the packages locally
None of the three forks ships prebuilt binaries: each builds on the target machine, because the firmware generation step is pinned to the NVIDIA firmware you already have installed.
# Ampere or Ada (RTX 30 / 40 series)
git clone https://github.com/Zagitta/gpu-unlock.git
# or: git clone https://github.com/JustAResearcher/gpu-unlock-ada.git
# Turing (RTX 20 series)
git clone https://github.com/nlzy/turing-unlock.git
cd turing-unlock
make install3. Let the package wire the module into the initramfs
The unlock only applies if the module loads before the NVIDIA driver binds the card — `gpu_unlock` on Ampere/Ada, `turing_unlock` on the RTX 20 series. Loading it manually afterwards cannot unlock it, because the module refuses a card that already has a driver bound (`-EBUSY`). Each package therefore puts its module and firmware into the initramfs and loads it there.
# mkinitcpio: /etc/mkinitcpio.conf.d/zz-gpu-unlock.conf
# initramfs-tools: /usr/share/initramfs-tools/modules.d/gpu-unlock.conf
# dracut: /usr/lib/dracut/dracut.conf.d/gpu-unlock.conf4. Opt in on the kernel command line
The module does nothing unless the kernel command line asks for it. Set `gpu_unlock.targets=` to `all` for the Ampere path, or to explicit PCI addresses.
gpu_unlock.targets=all5. Turing uses a different parameter name
The RTX 20 series module is `turing_unlock`, so the option is `turing_unlock.targets=` — not `gpu_unlock.targets=`. It accepts `all` or a comma-separated list of PCI addresses printed by `lspci -D`; case does not matter. Without the option the module loads and returns without touching anything.
# all accepted Turing cards
turing_unlock.targets=all
# one card, by PCI address
turing_unlock.targets=0000:21:00.0
# add it per bootloader
# GRUB (Debian/Ubuntu): edit GRUB_CMDLINE_LINUX_DEFAULT in /etc/default/grub, then sudo update-grub
# GRUB (Arch): same file, then sudo grub-mkconfig -o /boot/grub/grub.cfg
# Fedora/RHEL: sudo grubby --update-kernel=ALL --args="turing_unlock.targets=all"
# systemd-boot / UKI: add it to the boot entry or /etc/kernel/cmdline6. AD103 needs two opt-ins and one exact address
RTX 4070 Ti SUPER (`10de:2705`) is experimental and validated on a single card. It requires both `gpu_unlock.ad103_experimental=1` and `gpu_unlock.targets=` set to that card's single exact PCI address. `targets=all` never selects it.
gpu_unlock.ad103_experimental=1 gpu_unlock.targets=0000:21:00.07. Know what happens across suspend
This applies to `gpu_unlock` (Ampere/Ada) only: it reapplies the override on resume, which can reset a display card. Add `gpu_unlock.resume=0` to the kernel command line — or write `0` to `/sys/module/gpu_unlock/parameters/resume` — to turn that off. Hibernation is not covered either way.
8. Persist the boot entry only after a cold boot works
Validate one cold boot and one warm reboot on the exact card first. Only then make the bootloader entry persistent. Keep an unmodified stock entry available, and re-verify `gpu_unlock: unlocked`, the rate readback and GPU health after each boot.
9. Do not let the driver load early
Avoid `nvidia-smi`, CUDA, NVML and `nvidia-modprobe` before a manual cold-card attempt: they can load NVIDIA by name, and ordinary modprobe blacklist rules do not block explicit named loads. The packaged initramfs flow avoids the need for manual firmware staging.
Vérifier que cela a fonctionné
Le module journalise ses décisions dans le tampon circulaire du noyau. Consultez le journal et confirmez ensuite que le pilote a bien lié la carte.
# Ampere / Ada
journalctl -k -b | grep gpu_unlock
# Turing (RTX 20 series)
journalctl -k -b | grep turing_unlock
lspci -nnk -s 0000:21:00.0Modes de défaillance connus
- Card stays unlocked but tensor throughput is unchanged — Some cards complete the unlock without gaining the rate (RTX 3080 Ti 20 GB OEM reports BF16 staying at half rate). Verify with a same-card stock-vs-unlocked benchmark rather than assuming the unlock implies the speedup.
- Display stays blank after the unlock — Expected during handoff: the firmware framebuffer is removed just before FLR and the display stays blank until `nvidia-drm` takes over. Display handoff was not part of the RTX 4090 validation.
- `gpu_unlock` appears in the log but the card is not unlocked — The module loaded after NVIDIA had already bound the card, or `gpu_unlock.targets=` is missing/wrong. The override must run from the initramfs, before the driver binds.
- `turing_unlock` logs nothing at all on an RTX 20 card — `turing_unlock.targets=` is missing, so the module returned immediately: it does nothing without the option. Using `gpu_unlock.targets=` instead produces exactly this silence, because the Ampere/Ada module never touches TU102/TU104/TU106.
- `turing_unlock` logs `unlock failed (-16)` — EBUSY: a driver had already bound the card when the module ran. The unlock must happen from the initramfs, before `nvidia` binds; check that the package's initramfs drop-in is present and that the image was rebuilt.
- `turing_unlock` reports unlock failed — The module logs the error code and leaves the card alone. A failed step may reset the card, which blanks the display until `nvidia-drm` loads. If the GPU firmware does not stop, the module keeps its DMA buffers until the next power off — power off before retrying.
- Firmware on a card never stops — The module logs it and keeps the DMA buffers that firmware may still use until the next power off. Power off before trying again.
Le désactiver
Retirez gpu_unlock.targets= pour Ampere/Ada, ou turing_unlock.targets= pour la série RTX 20, de la ligne de commande du noyau ; pour un démarrage ponctuel, supprimez-la dans l'écran d'édition du chargeur d'amorçage. La suppression des paquets supprime aussi le module et les drop-ins de l'initramfs.
Quel fork utiliser
- Zagitta/gpu-unlock — Ampere : GA102, GA103, GA104, GA106. Pas de prise en charge d'Ada.
- JustAResearcher/gpu-unlock-ada — Ada : ajoute AD102 RTX 4090 et le canari AD103 expérimental, et conserve la liste de périphériques Ampere.
- nlzy/turing-unlock — Turing : la série RTX 20 (TU102, TU104, TU106) via un module distinct, turing_unlock. Les modules Ampere/Ada n'agissent pas sur ces cartes.