如何在運行 Linux 的無頭節點上控制多個消費性 NVIDIA GPU(例如 Titan 和 1080 Ti)的風扇速度?
答案1
以下是一個簡單的方法,不需要編寫腳本、連接假顯示器或擺弄,可以透過 SSH 執行來控制多個 NVIDIA GPU 的風扇。它已經在 Arch Linux 上進行了測試。
創建 xorg.conf
sudo nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=7
這將為/etc/X11/xorg.conf
每個 GPU 建立一個條目,類似於手動方法。
筆記:一些發行版(Fedora、CentOS、Manjaro)有額外的設定檔(例如 in/etc/X11/xorg.conf.d/
或/usr/share/X11/xorg.conf.d/
),它們覆蓋xorg.conf
並設定AllowNVIDIAGPUScreens
.此選項與本指南不相容。應修改或刪除額外的設定檔。 X11 日誌檔案顯示已載入哪些設定檔。
替代方案:手動建立 xorg.conf
識別您的卡片的 PCI ID:
nvidia-xconfig --query-gpu-info
找到PCI BusID
字段。請注意,這些與核心中報告的總線 ID 不同。
或者,執行sudo startx
、開啟/var/log/Xorg.0.log
(或 startX 在其輸出中「日誌檔案:」行下列出的任何位置),然後尋找行NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>
。
編輯/etc/X11/xorg.conf
xorg.conf
以下是三 GPU 機器的範例:
Section "ServerLayout"
Identifier "dual"
Screen 0 "Screen0"
Screen 1 "Screen1" RightOf "Screen0"
Screen 1 "Screen2" RightOf "Screen1"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:5:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:6:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device2"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:9:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
EndSection
Section "Screen"
Identifier "Screen2"
Device "Device2"
EndSection
必須BusID
與我們在上一個步驟中識別的總線 ID 相符。即使沒有連接顯示器,該選項AllowEmptyInitialConfiguration
也允許 X 啟動。該選項Coolbits
允許控制風扇。它還可以允許超頻。
筆記:一些發行版(Fedora、CentOS、Manjaro)有額外的設定檔(例如 in/etc/X11/xorg.conf.d/
或/usr/share/X11/xorg.conf.d/
),它們覆蓋xorg.conf
並設定AllowNVIDIAGPUScreens
.此選項與本指南不相容。應修改或刪除額外的設定檔。 X11 日誌檔案顯示已載入哪些設定檔。
編輯/root/.xinitrc
nvidia-settings -q fans
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:1]/GPUFanControlState=1 -a [fan:1]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:2]/GPUFanControlState=1 -a [fan:2]/GPUTargetFanSpeed=75
為了方便起見,我使用 .xinitrc 來執行 nvidia-settings,儘管可能還有其他方法。第一行將列印出系統中的每個 GPU 風扇。這裡,我將風扇設定為75%。
發射X
sudo startx -- :0
您可以從 SSH 執行此命令。輸出將是:
Current version of pixman: 0.34.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat May 27 02:22:08 2017
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Attribute 'GPUFanControlState' (pushistik:0[gpu:0]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:0]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:1]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:1]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:2]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:2]) assigned value 75.
監控溫度和時脈速度
nvidia-smi
並可nvtop
用於觀察溫度和功耗。較低的溫度將使卡片的時脈頻率更高並增加其功耗。您可以用於sudo nvidia-smi -pl 150
限制功耗並保持卡片涼爽,或用於sudo nvidia-smi -pl 300
讓它們超頻。如果給定 150W,我的 1080 Ti 運行頻率為 1480 MHz;如果給定 300W,則運行頻率超過 1800 MHz,但這取決於工作負載。您可以監控他們的時鐘速度,nvidia-smi -q
或者更具體地說,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'
返回自動風扇管理。
重啟。我還沒有找到其他方法讓風扇自動運轉。
答案2
我編寫了一個可安裝 pip 的 Python 腳本來執行類似於 @AlexsandrDubinsky 的建議的操作。
當您執行 fans.py 時,它會為每個 GPU 設定一個臨時 X 伺服器,並附加一個假顯示器。然後,它每隔幾秒鐘循環一次 GPU,並根據溫度設定風扇速度。當腳本終止時,它將風扇的控制權傳回給驅動程式並清理 X 伺服器。
答案3
根據這個問題和類似的 StackExchange 問題的答案,我編寫了一個 shell 腳本,它將風扇速度設定為100
(或任何你想要的值)全部你的粉絲數量全部機器上 GPU 的數量。
該腳本假設您的電腦安裝了 X11,但您沒有使用它為使用者提供 GUI。
/bin/set-gpu-fan-speed.sh:
#!/bin/bash
set -Eeuxo pipefail
# Kill any existing X servers.
killall Xorg || true
sleep 5
# Create a NVIDIA-friendly Xorg config.
nvidia-xconfig -a --cool-bits=28 --allow-empty-initial-configuration --enable-all-gpus
# Start a new X server for nvidia-settings to use.
export XDG_SESSION_TYPE=x11
export DISPLAY=:0
startx -- $DISPLAY &
sleep 5
# Determine the number of GPUs and fans on this machine.
NUM_GPUS=$(nvidia-settings -q gpus | grep -c 'gpu:')
NUM_FANS=$(nvidia-settings -q fans | grep -c 'fan:')
# For each GPU, enable fan control.
for ((i=0; i < NUM_GPUS; i++))
do
nvidia-settings --verbose=all -a "[gpu:$i]/GPUFanControlState=1"
done
# For each fan, set fan speed to 100%.
for ((i=0; i < NUM_FANS; i++))
do
nvidia-settings --verbose=all -a "[fan:$i]/GPUTargetFanSpeed=100"
done
# Kill the X server that we started.
killall Xorg || true
這些風扇速度變化不會在重新啟動後持續存在,因此我編寫了一個 systemd 單元檔案來在每次啟動時執行上述腳本。
/etc/systemd/system/set-gpu-fan-speed.service:
[Unit]
Description="Sets the GPU fan speed"
[Service]
Type=oneshot
User=root
ExecStart=/bin/set-gpu-fan-speed.sh
[Install]
WantedBy=multi-user.target
建立上述檔案後,以 root 身分執行以下命令以使腳本在重新啟動時執行。
systemctl enable set-gpu-fan-speed.service
systemctl start set-gpu-fan-speed.service