AB
AiBoss
チュートリアル

用 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 配置,重启。忘记重新生成配置的话,改动不会生效,看起来像是回滚失败。

版本与兼容性以项目页面为准

这类直接操作内核与驱动的工具,对内核版本、驱动版本都比较敏感。本文涉及的参数名、命令写法、支持范围都可能随项目更新而变化,安装前请以项目页面当前给出的说明为准。涉及具体性能数字的部分,也建议以自己机器上的实测结果为准,不同型号、不同散热条件、不同负载下的表现会有差异。