GPU-unlock 1.0.0 发布:解锁 Nvidia 3000 系显卡的 FP/BF16 指令发射速率
GPU-unlock: FP/BF16 instruction issue rate on Nvidia 3000's cards
GPU-unlock 1.0.0 发布,这是一个 Linux 内核模块,可在未修改的 NVIDIA 驱动绑定显卡前写入速度选择器,把 GA102、GA103、GA104、GA106 显卡的 FP/BF16 FMA 指令发射速率提升一倍。
GPU unlock 1.0.0
将 Nvidia 3000 系列显卡的 FP/BF16 指令发射速率解锁至其专业级对应型号的水平
这个 Linux 内核模块将 CMP 解锁器的 V67/PLM 技术与 UEFI 方案的预驱动时序相结合。它在未经修改的 NVIDIA 驱动绑定显卡之前执行解锁、写入速度选择器(SS0 0x88888888,用于选择完整的 BF16 速率,以及 4 位 SS1 0x8 IMLA4)并执行 FLR。它既不是 UEFI 应用程序,也不是打过补丁的 NVIDIA 驱动。
这种早期 kmod 驱动的优势在于,每当 nvidia 发布新的驱动版本时,它都不需要手动打补丁。
此解锁的效果是,在 GA102、GA103、GA104 和 GA106 显卡上,将 FP/BF16 FMA 到 FP32 运算的指令发射速度翻倍。
3090 Ti 在 450 W 下的稠密 8192³ GEMM,五次采样中位数,FP32 累加:
| 输入 | 之前 | 之后 |
|---|---|---|
| FP16 | 87.46 TFLOPS | 118.39 TFLOPS |
| BF16 | 87.50 TFLOPS | 157.41 TFLOPS |
| TF32 | 42.58 TFLOPS | 82.61 TFLOPS |
已测试的显卡
用户报告的结果。该模块接受
kernel/gpu_unlock/main.c 中列出的所有 GeForce ID,但下表是有人报告过的显卡。请通过
兼容性报告 添加你的显卡,
无论是否成功。
| 芯片 | 显卡 | PCI ID | 结果 | BF16 GEMM 提升 | 报告 |
|---|---|---|---|---|---|
| GA102 | RTX 3090 Ti | 10de:2203 |
已解锁 | +68–80% | #1 |
| GA102 | RTX 3090 | 10de:2204 |
已解锁 | +25–67% | #5, #9, #10, #17, #25, #27, #33 |
| GA102 | RTX 3080 Ti 20 GB(OEM,GA102-250) | 10de:2205 |
解锁完成,BF16 仍为半速 | — | #28 |
| GA102 | RTX 3080 10 GB | 10de:2206 |
已解锁 | +70–73% | #14 |
| GA102 | RTX 3080 20 GB(显存升级版) | 10de:2206 |
已解锁 | +56–59% | #10, #15 |
| GA104 | RTX 3070 | 10de:2484 |
已解锁 | +73–81% | #10, #12 |
| GA104 | RTX 3070 Ti | 10de:2482 |
未用此模块测试(相同的解锁在 Windows 上通过 UEFI 移植版成功) | — | #32 |
| GA106 | RTX 3060 12 GB | 10de:2504 |
已解锁 | 约 +80% | #13, #31 |
| GA103 | 任意 | 10de:2414 |
暂无报告 | — | — |
这些提升来自各报告自身的基准测试中的稠密 GEMM 吞吐量,因此 不能直接比较。功耗限制影响很大:最低的 数值(+25%)来自功耗限制在 225 W 的显卡。
矩阵密集型工作会加速:LLM 预填充(在 #9、 #15、 #25 和 #33 中提升 14–36%)、扩散模型和 FlashAttention。受内存带宽限制的 LLM 解码以及 INT8 工作基本保持不变。比较过输出的报告发现,解锁前后的输出 逐位完全相同。
报告还涵盖单机最多四张显卡、驱动显示器的显卡,以及通过 vfio-pci 直通给虚拟机的显卡 (#17)。
如何安装
首次运行:
git clone https://github.com/Zagitta/gpu-unlock
cd gpu-unlock
make install然后将 gpu_unlock.targets=all 追加到内核命令行,保留
现有选项:
- GRUB(Debian/Ubuntu/Mint): 将其添加到
/etc/default/grub中GRUB_CMDLINE_LINUX_DEFAULT的内部,然后运行sudo update-grub。 - GRUB(Arch/CachyOS): 同样编辑,然后运行
sudo grub-mkconfig -o /boot/grub/grub.cfg。 - Fedora/RHEL: 运行
sudo grubby --update-kernel=ALL --args="gpu_unlock.targets=all"。 - systemd-boot: 将其追加到启动项中的
options行 (bootctl status显示其位置)。 - UKI / 生成的启动项: 将其添加到
/etc/kernel/cmdline并重新生成 你的启动镜像/启动项(例如 mkinitcpio UKI 使用sudo mkinitcpio -P)。
本地构建
每次构建都会通过 HTTPS 下载固定版本的 NVIDIA/CachyOS 输入,校验
其 SHA-256,并仅在构建目录和
二进制包中生成固件。三种格式都通过相同的 make install-*
目标安装。软件包由已提交的 HEAD 构建。
一步完成构建、安装构建依赖并安装软件包 (会要求输入 sudo 密码):
make install # detect the distribution and select an 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 使用 /etc/os-release(先 ID,再 ID_LIKE)来检测 Arch、
Debian/Ubuntu 或 Fedora/RHEL/CentOS 系列。RPM 安装程序需要 DNF。
对于其他发行版,请在上方选择一个兼容的显式目标。
make arch、make deb 和 make rpm 仅用于构建。Debian 和 RPM 软件包会放到 build/deb 和 build/rpm。NVIDIA 输入文件缓存在 ~/.cache/gpu-unlock/inputs(make inputs;可用 INPUTS= 覆盖)。dpkg-buildpackage 本身从不使用网络,因此干净 chroot 构建(sbuild 或 pbuilder)需要将 GPU_UNLOCK_INPUTS 指向该缓存。make dist 归档、Debian 源码包和 .nosrc.rpm 中不包含任何 NVIDIA 归档或生成的固件。
启动流程与启用方式
这些软件包会将 gpu_unlock 及其固件放入 initramfs,并在其中加载,早于 nvidia 绑定显卡:
- mkinitcpio:
/etc/mkinitcpio.conf.d/zz-gpu-unlock.conf会将gpu_unlock插入到MODULES中nvidia之前,从而尽可能缩短显示卡黑屏的时间。如果镜像中没有nvidia,它会排在最后,并且仍会在从根文件系统加载的nvidia之前运行。镜像会在安装时重新构建。对于使用-c <config>或预设_config构建的镜像,mkinitcpio 会忽略 drop-in;请自行将gpu_unlock放到该配置的MODULES中nvidia之前。 - initramfs-tools:
/usr/share/initramfs-tools/modules.d/gpu-unlock.conf。 - dracut:
/usr/lib/dracut/dracut.conf.d/gpu-unlock.conf。
使用 initramfs-tools 和 dracut 时,会为每个已安装且带有头文件的 kernel 构建模块,并且这些 kernel 的镜像会在安装时以及卸载时再次重新构建。之后安装的 kernel 会通过其自身的安装钩子获得该模块和新镜像。
没有 softdep nvidia pre: 规则:kmod 只遵循它读到的第一条 softdep nvidia 行,因此其他软件包的规则(nvidia-utils、gddr6_hwmon)会静默覆盖它,或者它会覆盖其他软件包的规则。
除非内核命令行选择启用,否则该模块不会执行任何操作:
gpu_unlock.targets=all # every unbound GA102/GA103/GA104/GA106 card
gpu_unlock.targets=0000:21:00.0 # only these cards
gpu_unlock.targets=0000:21:00.0,0000:22:00.0 # comma-separated
地址是 lspci -D 打印出的完整 PCI 名称(十六进制数字大小写均可),与 GPU 编号和显示角色无关。不是 GA102/GA103/GA104/GA106 显卡的条目,包括与地址混在一起的 all,会被记录并忽略。这些显卡会并发解锁,无论数量多少总共约一秒,且各自独立:已绑定或已断电的显卡会被跳过。主板固件遗留的总线主控(Supermicro X11 无论其 option ROM 和总线主控设置如何都会如此)会先被清除;已被某个驱动初始化的显卡仍会被拒绝。随后 nvidia 会照常加载并绑定每张显卡。
显示卡也能正常工作。其固件帧缓冲(启动控制台和 Plymouth)会在解锁的固件步骤运行期间继续运行,并在显卡重置前被移除,正如 nvidia-drm 稍后也会做的那样。从该重置开始直到 nvidia-drm 接管之前,其屏幕为空白。
启动后手动加载该模块对 nvidia 已绑定的显卡没有任何作用。
挂起到 RAM 会关闭显卡电源,从而重置速度选择器。恢复后,该模块会在 nvidia 恢复它之前,再次解锁它在启动时解锁过的每张显卡:其挂起通知器会先于 nvidia 恢复其显卡的通知器运行(NVreg_UseKernelSuspendNotifiers=1,当前驱动中的默认值;nvidia-resume.service 运行得更晚)。这会使恢复时间增加约一秒。保持供电的显卡(如挂起到空闲)仍处于解锁状态,只会被读取。已被 nvidia 恢复或已绑定到其他驱动的显卡会保持原样,日志会说明原因。将 gpu_unlock.resume=0 添加到内核命令行,或将 0 写入 /sys/module/gpu_unlock/parameters/resume,即可关闭此功能。休眠不在覆盖范围内。
使用以下命令检查结果:
journalctl -k -b | grep gpu_unlock
lspci -nnk -s 0000:21:00.0要停止解锁,请从内核命令行中移除 gpu_unlock.targets=;对于一次性启动,可在引导程序的编辑界面中删除它。移除软件包也会移除该模块和 initramfs drop-in。
如果某张显卡上的固件始终无法停止,该模块会记录此情况,并保留该固件可能仍在使用的 DMA 缓冲区,直到下次断电。请先断电再重试。
内核模块和本地打包采用 GPL-2.0-only 许可。生成的载荷源自固定版本的 CMP 参考实现;NVIDIA 固件仍受其自身条款约束。署名与声明见 firmware/NOTICE.md 和 licenses/。
支持我
帮我多买些 GPU <3
https://buymeacoffee.com/zagitta
ETH: 0xf4eee937937f92038D70B16AbD7736D8a53a1c5c
BTC: bc1qwpkwp70fn76z3s4kg2l9y3j4kst95twcznuugf
SOL: 8Rih6HY7V4LcdjYHz4iSffT4fTniqw5CACaBigSVxNYu
来源:Hacker News · github.com