NVIDIA GPU 风扇速度配置仅适用于 2 个 GPU 中的 1 个

NVIDIA GPU 风扇速度配置仅适用于 2 个 GPU 中的 1 个

我有两个 NVIDIA GPU,我想分别设置每个 GPU 的风扇速度。当我nvidia-settings这样做时,我只能设置 的风扇速度[gpu:0],并且我所做的更改会影响 中标记为 1 的设备nvidia-smi。更改[gpu:1]风扇速度会产生正常(即无错误)输出,但没有效果。

  • 为什么更改会[gpu:0]影响设备 1?这些标签中的 ID 应该匹配吗?设备 0 的标签是什么?
  • nvidia-smi列出 Xorg 作为正在运行的进程两个都GPU,但我只有一个显示器:0。[gpu:x]标识符是否可能是特定于显示器的,我需要启动一个新显示器?如果是这样,我该如何启动新显示器并指定它应该使用我的其他 GPU?
  • 我尝试运行Xvfb以创建一个新的显示:Xvfb :1 -screen 0 1024x768x16 &。这确实创建了一个显示:1,但如果我在更改风扇设置时尝试使用此显示,则会收到错误,WARNING: NV-CONTROL extension not found on this Display.另请参阅下面我使用的确切风扇命令。

相关信息:

NVIDIA-SMI 输出

Thu Aug 22 13:33:05 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.104      Driver Version: 410.104      CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 RTX 208...  Off  | 00000000:04:00.0 Off |                  N/A |
| 35%   34C    P8    10W / 250W |   3741MiB / 10981MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:06:00.0 Off |                  N/A |
| 40%   45C    P2    71W / 250W |   2593MiB / 10989MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     16282      G   /usr/lib/xorg/Xorg                             6MiB |
|    0     22744      C   /opt/conda/bin/python                       1795MiB |
|    0     27845      C   /opt/conda/bin/python                       1935MiB |
|    1     16282      G   /usr/lib/xorg/Xorg                            16MiB |
|    1     21781      C   /opt/conda/bin/python                       1215MiB |
+-----------------------------------------------------------------------------+

XOrg.conf 片段

这是我的 Xorg.conf 文件中列出两个 GPU 的部分。我的理解是,这里的配置会为每个 GPU 创建虚拟桌面,这反过来又允许我设置它们的风扇速度。

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce RTX 2080 Ti"
    BusID          "PCI:6:0:0"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce RTX 2080 Ti"
    BusID          "PCI:4:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "AllowEmptyInitialConfiguration" "True"
    Option         "Coolbits" "28"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth    24
    Option         "AllowEmptyInitialConfiguration" "True"
    Option         "Coolbits" "28"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

用于设置风扇速度的命令

sudo DISPLAY=:0 XAUTHORITY=/var/run/lightdm/root/:0 nvidia-settings --verbose=all -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=80

我尝试在各个地方将所有 :0 和 0 用法设置为 :1 和 1,但没有成功。

答案1

我最近也在为这个问题而苦恼。在做任何事情之前,请备份当前的xorg.conf。接下来,运行以下命令:

sudo nvidia-xconfig --enable-all-gpus --cool-bits=28

如果您需要AllowEmptyInitialConfigurationTrue请运行以下命令:

sudo nvidia-xconfig --enable-all-gpus --cool-bits=28 --allow-empty-initial-configuration

保存并重启。这样你就可以控制任何 GPU 风扇了。如果你在启动时编写了此脚本,你的新命令将如下所示:

nvidia-settings --verbose=all -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=80 -a [gpu:1]/GPUFanControlState=1 -a [fan:1]/GPUTargetFanSpeed=80

答案2

以下是 Python 代码:

import time
from pynvml import *

nvmlInit()

class Device:
  def __init__(self, index):
    self.index = index
    self.handle = nvmlDeviceGetHandleByIndex(index)
    self.name = nvmlDeviceGetName(self.handle)
    self.fan_count = nvmlDeviceGetNumFans(self.handle)

  def set_fan_speed(self, percentage):
    """ WARNING: This function changes the fan control policy to manual. It means that YOU have to monitor the temperature and adjust the fan speed accordingly. If you set the fan speed too low you can burn your GPU! Use nvmlDeviceSetDefaultFanSpeed_v2 to restore default control policy.
    """
    for i in range(self.fan_count):
      nvmlDeviceSetFanSpeed_v2(self.handle, i, percentage)
 
print(f"Driver Version: {nvmlSystemGetDriverVersion()}")
device_count = nvmlDeviceGetCount()
devices = [Device(i) for i in range(device_count)]

for device in devices:
  device.set_fan_speed(80)

try:
  while True:
    time.sleep(1)
except:
  # reset to auto fan control
  for device in devices:
    for i in range(device.fan_count):
      nvmlDeviceSetDefaultFanSpeed_v2(device.handle, i)
  nvmlShutdown()

请注意,在脚本退出时我们如何恢复到默认风扇控制。

这也是我的要点用于根据温度变化更新风扇速度。

相关内容