
最近折腾了 RTX 4090 的“2x FP16”,踩了几个坑,这篇把问题说清楚。所谓“2x”确实是真实存在的,但它并不等于训练任务能直接获得 100% 的性能提升。下面结合公开测试结果、实际 GEMM(通用矩阵乘法)表现和安装风险,梳理如何在自己的显卡上安全验证。
gpu-unlock-ada 是一个 Linux 内核模块。它会在系统启动时、官方 NVIDIA 驱动加载之前运行,把支持该功能的 RTX 40 系列显卡切换到全速 FP16(16 位浮点)和 BF16(16 位脑浮点)张量运算,并使用 FP32(32 位浮点)累加。
2 倍提升是真的,但它和训练任务最终看到的结果不是一回事。真正值得关注的是:测试数据到底说明了什么、有哪些风险,以及如何在自己的机器上安装、测量和回退。
README 中报告了两类结果,两者的差异才是关键。
指令基准测试(寄存器级指令发射率)。在 RTX 4090(10de:2684)上:
| 模式 | 解锁前 | 解锁后 |
|---|---|---|
| FP16,FP32 累加 | 165.6 TF/s | 331.6 TF/s |
| BF16,FP32 累加 | 165.5 TF/s | 330.6 TF/s |
另一位用户使用 NVIDIA 615.78.08、保持同样的 450 W 功耗上限独立测试后,FP16 从 160.4 TF/s 提升到 320.4 TF/s,BF16 从 159.7 TF/s 提升到 320.2 TF/s。所有数值校验均通过。
真实 cuBLAS GEMM。在同一组匹配测试中,GEMM 的中位吞吐量会随着矩阵形状变化:
4096³ 下 基本没有变化README 明确说明,这些数据来自一组匹配的测试运行,测试期间桌面环境仍然处于活动状态;它们既不是完整应用的加速结果,也不属于长时间稳定性测试。INT8(8 位整数)、dp4a 和标量 FP32 基本维持在基线水平。在一块 RTX 4070 Ti SUPER 上,经过验证的 E4M3 FP8 CUTLASS GEMM 从 59.326 TF/s 变为 59.495 TF/s,差异只有 0.3%。
因此,比较诚实的总结是:张量指令发射率翻倍,真实矩阵乘法有明显但小得多的提升,而 INT8 和 FP32 基本没有收益。
10de:2705)和 RTX 4060 Ti 16GB(10de:2805)路径仍属实验性质,并且各自只在一块显卡上验证。其他 Ada 架构型号、专业 RTX A 系列以及数据中心显卡均不在支持范围内。如果这些风险对你的机器可以接受,可以继续往下看。
CONFIG_CRYPTO_LIB_SHA256运行 diagnostics/bench 中的 CUDA(Compute Unified Device Architecture,计算统一设备架构)指令基准测试,再加一个自己的真实工作负载。记下内核版本、驱动版本和功耗上限。解锁后的测试必须保持这三项完全一致,否则对比结果没有意义。
git clone https://github.com/JustAResearcher/gpu-unlock-ada.git
cd gpu-unlock-ada
make install
make install 会自动识别发行版类型,也支持显式指定目标:make install-arch、make install-deb、make install-rpm。构建过程会通过 HTTPS 下载固定版本的 NVIDIA 610.43.03 输入文件,校验其 SHA-256 哈希,并在本机生成固件。项目不提供预编译固件。安装包会把模块和固件放入 initramfs,确保它在 NVIDIA 绑定显卡之前完成执行。
模块默认不会启用,必须由用户主动选择目标显卡。先用 lspci -D 查找显卡的完整 PCI 地址,然后添加:
gpu_unlock.targets=0000:03:00.0
这里只是示例,必须替换成你自己的地址。对于实验性显卡,需要添加对应的标志,并指定一个精确地址(targets=all 永远不会选中这些型号):
gpu_unlock.targets=0000:01:00.0 gpu_unlock.ad103_experimental=1
gpu_unlock.targets=0000:01:00.0 gpu_unlock.ad106_experimental=1
第一行用于 RTX 4070 Ti SUPER,第二行用于 RTX 4060 Ti 16GB。
第一次尝试时,请彻底关闭机器电源,然后重新开机。模块需要显卡处于全新的固件状态,才能在 NVIDIA 驱动加载前完成操作,而普通热重启无法保证这一点。在手动进行冷启动验证前,不要运行 nvidia-smi、CUDA、NVML(NVIDIA Management Library,NVIDIA 管理库)或 nvidia-modprobe,因为这些程序可能按名称加载 NVIDIA 驱动。
journalctl -k -b | grep gpu_unlock
检查日志中是否存在对应显卡的 gpu_unlock: unlocked 信息,以及 payload、selector 和 post-FLR 检查结果。仅仅显示模块已加载,或者 modprobe 执行成功,并不能证明解锁已经生效。如果模块报告固件没有停止,并且正在保留它的 DMA 缓冲区,应当先关机,不要尝试强制卸载模块。
保持内核、驱动和功耗上限完全一致。按照 docs/testing.md 中的测试指南,对比 FP16、BF16、INT8 和 FP32 的结果。对于自己的工作负载而言,只有你自己测出的 GEMM 数据才有参考意义。
从内核命令行中删除 gpu_unlock.targets=,也可以在启动加载器的编辑界面中只对本次启动临时删除。删除相关软件包会移除模块以及 initramfs 集成。关机后,显卡会恢复到全新的硬件状态。
每周一封邮件,精选当周最热门的 AI(人工智能)项目,并附上具体使用方法:订阅 dedupedai.com,免费获取。