如何在无头服务器上关闭Nvidia GPU?

我正在运行一个带有Nvidia GPU的无头服务器。即使GPU没有执行任何任务,也会消耗约25瓦的功率:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 950     Off  | 00000000:01:00.0 Off |                  N/A |
|  0%   61C    P0    26W / 110W |      0MiB /  2001MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+


有没有办法在GPU不使用时完全关闭电源供应?
我尝试了 sudo prime-select intel 这确实导致nvidia-smi停止工作,但是连接到墙上的功率计显示,无论选择intel还是nvidia,功耗都完全相同。
完全移除GPU的话,功耗如预期地减少了约30瓦。
主要目的是在空闲操作期间节省电力和成本,并且可以通过ssh远程启动GPU。

1这是台式机还是笔记本电脑?您使用的命令适用于混合图形,这表明可能是笔记本电脑;但是“移除GPU”的操作则暗示是台式机。台式机可以拥有多个显卡/芯片,但与笔记本电脑的混合和可切换图形不同。在台式机中,您可以在BIOS/UEFI中进行切换,在某些情况下,切换到集成GPU或禁用独立GPU会导致后者被视为不存在且未供电。 - user880592
一台桌面电脑,但我没有使用显卡进行显示输出。 我希望有一种类似于让闲置硬盘停转的功能。 - amanusk
它总是会消耗一些电力。在某些系统中,通过在BIOS/UEFI中禁用它可以完全关闭它。 - user880592
3个回答

这些OPTIMUS组合解决方案是根据Windows操作系统设计的。
根据以前的观察,NVIDIA显卡在Windows操作系统上似乎会完全关闭。我假设这是因为BIOS对来自Windows操作系统的调用处理方式不同,而且它应该有所不同。
我现在没有其中之一来测试这种方法,但无论如何都值得一试。
这种方法首先是禁用ACPI OSI内置的操作系统供应商字符串,然后将当前操作系统报告为Windows 7。有点像在欺骗BIOS...Linux内核默认情况下经常这样做,但这是一种更受控制的方法。
要做到这一点,首先像这样编辑/etc/default/grub:
sudo nano /etc/default/grub

然后,在GRUB_CMDLINE_LINUX_DEFAULT中添加选项acpi_osi=!acpi_osi=\"Windows 2009\",如下所示:
GRUB_CMDLINE_LINUX_DEFAULT="quiet acpi_osi=! acpi_osi=\"Windows 2009\""

然后,通过按下Ctrl+x,然后按下y,然后按下Enter来保存并关闭文件。

之后,像这样更新GRUB:

sudo update-grub

最后,重新启动您的系统并测试是否现在以不同的方式禁用了NVIDIA显卡。

然而,这种方法可能比专有的NVIDIA驱动程序更适用于开源驱动程序nouveauVGA Switcheroo

如需进一步阅读,请参阅内核参数


你可以尝试使用其中一个可用的PowerMizerMode,看看是否能将你的系统调整到P8状态。
$ nvidia-settings -a "[gpu:0]/GPUPowerMizerMode=<your no.>"

请注意,不同系统的PowerMizerModeP-states可用性会有所不同。请使用。
$ nvidia-settings -q GpuPowerMizerMode

检查这个。

或者你也可以尝试强制一些参数

  1. 通过 nvidia-smi -i 0 -pl 10 来限制功率(不确定是否有效)。
  2. GPUGraphicsClockOffset, GPUMemoryTransferRateOffset, 通过 nvidia-settings
  3. 通过 xorg.conf, 参考

你可能需要重新启动来测试选项。

相关:

  1. 英伟达 - GTX 1080显卡在闲置状态下功耗过高
  2. https://gist.github.com/DavidMetcalfe/fabbd2ddcb6ba4927269f6f0db31a92f
  3. https://forums.developer.nvidia.com/t/gtx-1070-driver-4-15-25-performance-mode-p0-does-not-automatically-downshift-to-idle-p8-after/69238
  4. https://github.com/devonkinghorn/linux-nvidia-dynamic-power-management-setup

我在我的无头服务器上没有运行X,所以nvidia-settings对我无效。有没有办法用nvidia-smi或其他不需要X的工具来做同样的事情? - Jo Liss
@JoLiss - 你可以尝试运行X并应用这些建议,至少看看是否能降低功耗。如果可以的话,那么你可以继续寻找其他选项。 - sancho.s ReinstateMonicaCellio

可以观察到GPU正在使用性能模式P0,这种模式下显卡的功耗非常高。在空闲状态下,它应该理想地降至P8模式,以减少功耗。
我按照以下步骤来改变这种行为。 假设您正在使用Linux系统:
您需要具备sudo权限。 首先,启用持久模式:
sudo nvidia-smi -pm 1

然后,重置GPU的时钟:

sudo nvidia-smi -rgc

注意:要了解更多关于这些命令的信息,请输入。
nvidia-smi --help

你能详细说明如何改变模式吗?这样才算是一个完整的回答。 - Artur Meinild
在我的970M上,-rgc参数会生成一个错误。有一个-rac参数可以使用,但它不能降低功耗。 - WinEunuuchs2Unix
你能列出你目前使用的驱动程序版本吗?另外,请检查一下 "nvidia-smi --help" 是否列出了 "-rgc" 参数。 - Sud Ka
同样的问题出现在GT 710上,它显示“不支持为GPU 00000000:2B:00.0设置锁定的GPU时钟。” 驱动程序版本是460.32.03,并且nvidia-smi --help列出了-rgc - Jo Liss
@JoLiss - 你有机会测试建议的内容吗? - sancho.s ReinstateMonicaCellio