
用 gpu-unlock 解除 NVIDIA GeForce 显卡的 Tensor Core 限速
用 gpu-unlock 解除 NVIDIA GeForce 显卡的 Tensor Core 限速
GeForce 显卡的 Tensor Core 在 FP16、BF16、TF32 运算上被限制在半速,gpu-unlock 通过一个 Linux 内核模块在驱动加载前把频率放开。本文讲清它的适用范围、安装步骤、GRUB 配置、验证方法,以及哪些负载能提速、哪些完全无效。
NVIDIA 的 GeForce 显卡在 AI 计算上一直被软件层面压着一档:同一代硅片,专业卡跑满速,消费卡在 FP16、BF16、TF32 这几类张量运算上只给一半吞吐。gpu-unlock 就是针对这个限制的一个开源 Linux 内核模块,它在 NVIDIA 驱动加载之前介入,把 Tensor Core 切到全速,然后把显卡交还给原厂驱动。它不修改驱动、不刷固件,重启后自动生效,想撤销只需删掉一个启动参数。
这篇教程面向已经在 Linux 上跑本地模型、做微调或跑图像生成的用户,尤其是手里有 RTX 20、30、40 系列显卡的人。它不解决游戏帧数问题,对显存带宽瓶颈型的负载也基本无效——这两点后面会详细说明。需要先讲清楚:这个工具只支持 Linux,官方发布没有 Windows 版本;RTX 50 系列不在支持范围内。
准备工作
硬件与系统前提
- 显卡:RTX 20、30、40 系列。其中 RTX 30 系列最稳定,有超过一百份用户报告;RTX 40 与 RTX 20 属于实验性支持,可能遇到问题。RTX 50 系列不支持,且开发者不认为后续会改变。
- 操作系统:Linux。安装过程依赖发行版包管理器自动拉取依赖,脚本会自行识别发行版。
- 引导方式:绝大多数情况是 GRUB。如果你用的是其他引导器,需要把内核参数加到对应引导器的配置里,本文只覆盖 GRUB 的写法。
- 权限:需要 sudo。构建与安装模块、修改 GRUB 配置都要提权。
- NVIDIA 驱动:已正常安装并能驱动显卡。模块的作用是在驱动加载前改状态,驱动本身仍由系统原有方式管理。
先跑一遍基准测试
这一步很容易被跳过,但它是后面判断有没有生效的唯一依据。安装前先用你平时的工作负载记录一组数字:
- 如果用 llama.cpp 或 Ollama,记录 prompt 处理速度(tokens/s)和生成速度。
- 如果做微调,记录每个 step 的耗时或每秒样本数。
- 如果做图像生成,记录固定参数、固定步数下单张图的耗时。
把这些数字记下来,安装完成后用完全相同的命令、相同的模型、相同的参数再跑一遍,才能看出差别。凭感觉判断不可靠,因为这类提速在不同负载上差异很大,有的场景甚至完全没有变化。
确认引导器配置位置
GRUB 的主配置在 /etc/default/grub,里面有一行 GRUB_CMDLINE_LINUX_DEFAULT,引号内的内容就是每次启动传给内核的参数。gpu-unlock 的开关就是往这一行里加一个参数。改完之后必须重新生成 GRUB 配置,否则改动不会生效——这是最常见的失败原因。
操作步骤
第一步:克隆仓库并构建模块
用 Git 把仓库拉到本地,然后进入目录:
git clone <gpu-unlock 仓库地址>
cd gpu-unlock
仓库地址请以项目页面当前给出的为准。进入目录后执行构建与安装:
make install
这一条命令做的事情比看上去多:它会识别你当前的发行版,自动获取构建所需的依赖,下载它需要的 NVIDIA 相关文件,然后在本地编译整个模块。过程中会要求输入 sudo 密码。因为涉及下载和编译,第一次执行会花一些时间,具体取决于网络和机器性能。
如果构建报错,优先检查两件事:一是发行版是否被脚本识别(过于小众的发行版可能没有对应的依赖列表),二是 NVIDIA 驱动是否已正确安装。构建失败时不要反复重试同一条命令,先看错误信息指向哪一步。
第二步:让内核在启动时加载模块
模块装好之后不会自动起作用,必须告诉内核在启动时启用它。编辑 GRUB 配置:
sudo nano /etc/default/grub
在配置文件靠前的位置找到这一行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
在引号内、原有内容之后追加参数,改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash gpu_unlock.targets=all"
保存退出(nano 里是 Ctrl + O 保存、Ctrl + X 退出)。然后重新生成 GRUB 配置:
sudo update-grub
在 Arch 上这条命令不适用,改用:
sudo grub-mkconfig -o /boot/grub/grub.cfg
这一步不能省。只改 /etc/default/grub 而不重新生成配置,启动时内核根本看不到新参数,模块也就不会加载。
第三步:重启并验证
重启机器。如果这块显卡同时负责显示输出,启动过程中屏幕会黑一下,这是预期行为,不是故障。
机器能正常启动、没有报错,本身就是一个好信号。要进一步确认模块确实加载了,查内核日志:
journalctl -k -b | grep gpu_unlock
这条命令只看本次启动(-b)的内核日志,并过滤出与 gpu_unlock 相关的行。能看到对应记录,说明模块在启动阶段已经介入。
最后回到第一步记下的基准测试,用同样的命令重跑一遍,对比数字。
一个完整示例
下面以一台装有 RTX 3090、使用 GRUB 引导的 Linux 机器为例,走一遍完整流程。假设主要用途是用 llama.cpp 跑一个未量化的模型。
1. 记录基线。用固定命令加载模型,跑一段固定长度的 prompt,记下 prompt 处理速度与生成速度。假设 prompt 处理为 800 tokens/s,生成为 45 tokens/s。
2. 拉取并安装模块。
git clone <gpu-unlock 仓库地址>
cd gpu-unlock
make install
过程中输入 sudo 密码,等待依赖下载与本地编译完成。
3. 修改 GRUB 参数。
sudo nano /etc/default/grub
把 GRUB_CMDLINE_LINUX_DEFAULT 改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash gpu_unlock.targets=all"
保存退出后执行:
sudo update-grub
4. 重启。屏幕短暂黑屏后正常进入系统。
5. 验证模块加载。
journalctl -k -b | grep gpu_unlock
日志中出现相关记录。
6. 重跑基准。同样的模型、同样的 prompt 长度、同样的参数。prompt 处理速度提升到约 1000–1240 tokens/s 区间(对应 25%–55% 的提升),生成速度基本不变——因为 token 生成受显存带宽限制,不受 Tensor Core 限速影响。这个对比结果恰好说明了这个工具的作用边界:它加速的是计算密集的部分,不是访存密集的部分。
7. 需要撤销时。把 gpu_unlock.targets=all 从 GRUB 配置里删掉,重新执行 sudo update-grub,重启即可。模块本身留着不影响,因为不加载就不生效。
能提速多少,哪些场景无效
理论值与实测值
纸面上,Tensor Core 的吞吐翻倍。以 RTX 3090 的 BF16 矩阵运算为例,从 75 TFLOPS 提升到 125 TFLOPS。实际工作负载达不到这个比例,因为还有别的瓶颈在起作用。按负载类型分:
| 负载类型 | 实际提升幅度 |
|---|---|
| prompt 处理 | 25%–55% |
| 微调 | 25%–50% |
| 图像生成 | 30%–55% |
| 游戏 | 无提升 |
游戏完全不受影响,这个工具只作用于张量运算路径。
量化模型与 Ollama 用户要注意
如果你主要用 Ollama 或 llama.cpp 跑量化过的 GGUF 模型,收益会小得多,区间在 0 到 15% 之间,而且提升主要集中在长上下文场景。原因很直接:token 生成阶段受显存带宽限制,Tensor Core 快一倍也不会让显存读得更快。所以指望它把对话生成速度翻倍是不现实的。
这个工具真正发挥作用的场景是:跑未量化模型、做微调、生成图像。这三类负载的计算密度足够高,Tensor Core 的吞吐才是瓶颈。
注意事项
笔记本与休眠会悄悄失效
会在空闲时给显卡断电的笔记本,解锁状态会被静默重置——你不会收到任何提示,只是发现速度回到了原来的水平。休眠(hibernation)同样不在覆盖范围内。普通的睡眠(sleep)没有问题。
温度会上升
显卡现在真的在满速工作,所以会比之前热一些。NVIDIA 原有的温度与功耗节流机制仍然有效,不会因此失去保护。但如果你的散热本来就吃紧,值得留意温度变化。
Windows 版本不要随便装
官方发布只有 Linux 版本。另有开发者做过实验性的 Windows 版本,但只支持特定的显卡与主板组合。网络上流传的其他 Windows 安装包来源不明,开发者本人也提醒要格外小心。如果你的主要工作环境是 Windows,这个工具目前不是一个可靠的选择。
支持状态按代际差异很大
RTX 30 系列经过大量用户验证,相对稳定。RTX 40 与 RTX 20 仍处于实验阶段,遇到异常属于预期内的风险。RTX 50 系列明确不支持。在实验性平台上使用前,先确认自己有能力通过删除 GRUB 参数回滚。
回滚很简单,但要记得重新生成配置
撤销只需要两步:从 GRUB_CMDLINE_LINUX_DEFAULT 里删掉 gpu_unlock.targets=all,重新生成 GRUB 配置,重启。忘记重新生成配置的话,改动不会生效,看起来像是回滚失败。
版本与兼容性以项目页面为准
这类直接操作内核与驱动的工具,对内核版本、驱动版本都比较敏感。本文涉及的参数名、命令写法、支持范围都可能随项目更新而变化,安装前请以项目页面当前给出的说明为准。涉及具体性能数字的部分,也建议以自己机器上的实测结果为准,不同型号、不同散热条件、不同负载下的表现会有差异。