NVIDIA 核试验(Linux)


Linux 的 NVIDIA 超频工具可没有 Windows 的那么多,看了一圈好像也只有官方提供的 nvidia-settings。然而这玩意用 X11 扩展协议和显卡 DDX 驱动通信,而服务器没有图形界面,根本届不到。

所以想用官方工具超频,估计还得装个 Xorg 和虚拟显示器。

Explosion

环境准备

  • 显卡:RTX 2080Ti / RTX 3080
  • 系统:Ubuntu 18.04.5 / CentOS 7.6
  • 驱动:apt install nvidia-utils-460-server

安装 Xorg。

# ubuntuapt updateapt install xorg# centosyum install xorg-x11-server-Xorg

生成 Xorg 配置。

sudo nvidia-xconfig -a --allow-empty-initial-configuration --cool-bits=28

选项 --allow-empty-initial-configuration 用来允许 Nvidia 驱动在没有连接任何显示设备的情况下工作(460.32.03 及以上版本默认为 True)。

选项 --cool-bits 是超频功能开关,其值为各配置项组成二进制数字再转十进制数字。

  • 1   (bit 0) - 在 nvidia-settings 的 Clock Frequencies 参数上启用旧版 (pre-Fermi) 核心的超频。
  • 2   (bit 1) - 设置该位时,驱动程序将在使用具有不同数量显存的 GPU 时尝试初始化 SLI。
  • 4   (bit 2) - 在 nvidia-settings 的 Thermal Monitor 参数上启用手动配置 GPU 风扇速度。
  • 8   (bit 3) - 在 nvidia-settings 的 PowerMizer 参数上启用超频。自 337.12 版本起适用于 Fermi 架构及更高版本。
  • 16 (bit 4) - 使用 nvidia-settings CLI 选项启用过电压。自 346.16 版起适用于 Fermi 架构及更高版本。

举个栗子,修改 RTX 3080(Ampere 架构)的核心频率,电压和风扇转速,需要将 Coolbits 值设置为 28(二进制 11100 转十进制为 28)。

后台启动 Xorg。

nohup sudo /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch &

运行 nvidia-smi,此时能看到 Xorg 在使用 GPU。

如何食用

本文的主角 nvidia-settings 依赖 X11 协议和显卡通信。所以在运行前要加上 DISPLAY 环境变量。

由于 X11 不是完全体,执行后还是会报错。没关系,看到修改成功的提示就行。

为防止不可控核事故,先给风扇拉满(

DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:0]/GPUFanControlState=1DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [fan:0]/GPUTargetFanSpeed=100

核心降频,显存超频。

DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:0]/GPUMemoryTransferRateOffset[4]=1400DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:0]/GPUGraphicsClockOffset[4]=-200

gpu:0 是显卡序号,多显卡可以修改序号分别执行。后面的 4 适用于 20 系及 30 系显卡,如果你是 10 系卡改成 3 就好(再不行改成 2,不会炸,大概)。超频用正值,降频用负值,请小心往上加,因为超多了真的会炸(一般重启能恢复)。显卡序号可用 nvidia-smi 查看。

$ nvidia-smi -LGPU 0: GeForce RTX 3080 (UUID: GPU-6f62e1a5-2d7b-31a5-aa25-628d349e0235)GPU 1: GeForce RTX 3080 (UUID: GPU-06f427c3-4a75-9ad0-5c0f-06a9acaadfa5)GPU 2: GeForce RTX 3080 (UUID: GPU-891c2e2f-9a93-04c1-323b-95d5f41c37te)GPU 3: GeForce RTX 3080 (UUID: GPU-98e4d489-71ae-c6ef-b80c-93bebe1f7f5e)

多张显卡可以这么整。

for i in `nvidia-smi -L | awk -F: '{print $1}' | awk '{print $2}'`; do    DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:$i]/GPUFanControlState=1 -a [fan:$i]/GPUTargetFanSpeed=100    DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:$i]/GPUMemoryTransferRateOffset[4]=2000 -a [gpu:$i]/GPUGraphicsClockOffset[4]=-600    echo GPU $i is ready.done

返回的信息如下。

ERROR: libXv setup error : libXv.so.1: cannot open shared object file: No such file or directory  Attribute 'GPUFanControlState' (meow:0[gpu:0]) assigned value 1.ERROR: libXv setup error : libXv.so.1: cannot open shared object file: No such file or directory  Attribute 'GPUTargetFanSpeed' (meow:0[fan:0]) assigned value 99.ERROR: libXv setup error : libXv.so.1: cannot open shared object file: No such file or directory  Attribute 'GPUMemoryTransferRateOffset' (meow:0[gpu:0]) assigned value 1400.ERROR: libXv setup error : libXv.so.1: cannot open shared object file: No such file or directory  Attribute 'GPUGraphicsClockOffset' (meow:0[gpu:0]) assigned value -200.

执行后实时生效,前后数据可通过 nvidia-smi -q | grep MHz 对比。

清理环境

Xorg 可以关掉。

$ ps -ef | grep xorgroot      9816 33061  0 04:55 pts/0    00:00:00 grep --color=auto xorgroot     47705 33061  0 03:38 tty7     00:00:14 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch$ kill 47705

Tips

不想在后台跑个 Xorg?可以用 xini 执行 nvidia-settings,配合 ansible 更优雅。

#ubuntuapt install xinit#centosyum install xorg-x11-xinitxinit /usr/bin/nvidia-settings -a [gpu:0]/GPUGraphicsClockOffset[4]=600 --  :0 -once

当然也可以给服务器接上显示器,再安装一个小巧的桌面环境,比如 Xfce,该有的依赖就都有了。

sudo apt updatesudo apt install xfce4 xfce4-goodies

此外,显示器一般都有 EDID 信息,包括显示器的分辨率、厂商名称与序号等,保存在显示器的 PROM 或 EEPROM 中。我们也可以给虚拟显示器整一个(强迫症必备

这里有整理好的 EDID 文件,随便找一个,比如 Nvidia Defaul,分辨率 1920x1080。

$ sudo vim /etc/X11/edid.txt00 ff ff ff ff ff ff 00 3a c4 00 00 00 00 00 002d 0c 01 03 80 20 12 00 ea a8 e0 99 57 4b 92 251c 50 54 00 00 00 01 01 01 01 01 01 01 01 01 0101 01 01 01 01 01 02 3a 80 18 71 38 2d 40 30 2035 00 42 b5 10 01 00 18 00 00 00 fc 00 4e 76 6964 69 61 20 44 65 66 61 75 6c 00 00 00 fc 00 7420 46 6c 61 74 20 50 61 6e 65 6c 00 00 00 00 fd00 00 3d 1d 44 0f 00 00 20 20 20 20 20 00 00 1d

在 nvidia-xconfig 生成 Xorg 配置时添加自定义参数。

sudo nvidia-xconfig -a --allow-empty-initial-configuration \--use-display-device=None --virtual=1920x1080 \--use-display-device="DFP-0" --connected-monitor="DFP-0" \--custom-edid="DFP-0:/etc/X11/edid.txt" --cool-bits=28

此时可以安装 VNC 来使用 nvidia-settings 的图形界面,但都到这一步了为何不直接装桌面版 Ubuntu 呢 (ーー゛)