在 Linux Server 上进行核试验

Linux 的显卡超频工具可没有 Windows 的那么多,找来找去也只有官方的 nvidia-settings。由于 nvidia-settings 使用 X11 扩展协议和 DDX 显卡驱动通信,大多数桌面版系统使用 Xorg 提供图形界面,该软件实现了 X11 的接口和标准,用起来自然没什么问题。而服务器版系统就没有图形界面,完全听不懂 nvidia-settings 在说什么,根本届不到。

那是不是必须安装图形界面,连接显示器了呢?这个反问放在这里好蠢啊。

Explosion

# 环境准备

文中使用 RTX 2080Ti / RTX 3080,Ubuntu 18.04 / CentOS 7.6 系统,驱动是 APT 安装的 nvidia-utils-460-server。

系统已预装 Xorg,没有的话请自行安装。

# ubuntu
apt update
apt install Xorg

# centos
yum install xorg-x11-server-Xorg

安装 Nvidia 官方驱动(官方二进制或 apt 的都可以),然后用 nvidia-xconfig 生成一个 Xorg 配置。

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

说明一下,设置 --allow-empty-initial-configuration 选项(460.32.03 版本开始默认为 True),这样即使没有连接任何显示设备,X Server 启动后 NVIDIA 驱动也能正常工作。

后面的 --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 架构及更高版本。

要启用多个功能,需要将 Coolbits 值加在一起。例如,要修改 RTX 3080(Ampere 架构)的核心频率,电压和风扇转速,将选项 Coolbits 设置为 28(二进制 11100 转十进制即为 28)。

在后台启动 X Server。

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

用 nvidia-smi 可以看 Xorg 有没有工作。

# 如何食用

本文的主角是 nvidia-settings,依赖 X11 协议和显卡通信。所以先指定显示器,再执行超频指令。

执行过程中会有报错信息(因为是不完整的 X11,没关系,只要提示修改成功就行。

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

DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings -c :0 -a [gpu:0]/GPUFanControlState=1
DISPLAY=: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]=1400
DISPLAY=: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 -L

GPU 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

返回的日志长这样,不想看错误信息可以加上 2>/dev/null

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 对比。

# 清理环境

Xorg 此时已经没用了,可以拔掉。

$ ps -ef | grep xorg
root      9816 33061  0 04:55 pts/0    00:00:00 grep --color=auto xorg
root     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,看起来确实优雅,适合批量部署。

#ubuntu
apt install xinit

#centos
yum install xorg-x11-xinit

xinit /usr/bin/nvidia-settings -a [gpu:0]/GPUGraphicsClockOffset[4]=600 --  :0 -once

如果你就想用图形界面超频,那也不是没办法。

安装一个小巧的桌面环境,比如 Xfce,该有的依赖差不多都有了。

sudo apt update
sudo apt install xfce4 xfce4-goodies

此外,显示器一般都有 EDID 信息,包含显示器的分辨率、厂商名称与序号等信息,一般存在于显示器的 PROM 或 EEPROM 内。我们整的虚拟显示器也可以有。

这里 (opens new window)寻找合适的 EDID 文件,比如 Nvidia Defaul,分辨率 1920x1080。

$ sudo vim /etc/X11/edid.txt

00 ff ff ff ff ff ff 00 3a c4 00 00 00 00 00 00
2d 0c 01 03 80 20 12 00 ea a8 e0 99 57 4b 92 25
1c 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 30 20
35 00 42 b5 10 01 00 18 00 00 00 fc 00 4e 76 69
64 69 61 20 44 65 66 61 75 6c 00 00 00 fc 00 74
20 46 6c 61 74 20 50 61 6e 65 6c 00 00 00 00 fd
00 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,不会真有人想用图形界面管理服务器吧?

最后,呼吁大家不进行、导致、鼓励或以任何方式参与进行任何核武器试验爆炸或任何其他核爆炸,并进一步承诺在其管辖或控制下的任何地方,禁止和防止任何此种核爆炸。

环境准备
如何食用
清理环境
Tips