我有两个 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
如果您需要AllowEmptyInitialConfiguration
,True
请运行以下命令:
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()
请注意,在脚本退出时我们如何恢复到默认风扇控制。
这也是我的要点用于根据温度变化更新风扇速度。