GPUが80℃前後で高止まりしたら|Linuxでnvidia-smi確認とファンカーブ自作

GPUが80℃前後で高止まりしたら|Linuxでnvidia-smi確認とファンカーブ自作

※本記事にはプロモーション(広告・アフィリエイトリンク)を含みます。

LinuxでStable Diffusionのように長時間GPUを回す場面では、温度がじわじわ上がって80℃前後で高止まりすることがあります。こうした状態を、NVIDIA公式ドライバに付属するコマンドだけで確認し、必要ならファン回転数を自分の曲線で制御するまでの手順をまとめます。

RTX 3060などGeForce系のGPUと、NVIDIA公式ドライバのLinux環境が対象です。数値やオプションは執筆時点のもので、カード・ドライバ・ディストリビューションによって結果が変わりうる箇所は都度明記します。

80℃は「壊れる温度」ではない、でも放置したくない

GeForce系のGPUには、サーマルスロットリングが始まる「Slowdown」と、動作上限の「Max Operating」という温度がカードごとに設定されています。多くのGeForceカードでは Max Operating がおおむね90℃台に置かれており、80℃はその上限より下——つまり即座に壊れる温度ではありません。ただし具体値はカードで異なるので、後述のコマンドで自分のカードの値を必ず確認してください。

問題は、NVIDIAのデフォルトのファンカーブが静音寄りで、負荷がかかってから回転が上がるまでが緩やかなことです。画像生成のように長時間GPUを回し続ける場面(FLUX Schnellで遠景の顔が崩れる|ComfyUIの対処3つ のような作業でも負荷が続きます)では、熱がこもって高止まりしやすくなります。まずは実際の温度としきい値を見るところから始めます。

nvidia-smi で温度としきい値を見る

カードのしきい値を含めて確認します。

nvidia-smi -q -d TEMPERATURE

出力の GPU Current Temp(現在温度)、GPU Slowdown Temp(スロットリング開始)、GPU Max Operating Temp(動作上限)を見ます。これらの値はカードとドライバで異なります。

負荷中の温度を連続監視するなら、次のように必要な項目だけをCSVで1秒ごとに出すと軽くて読みやすいです。

nvidia-smi --query-gpu=temperature.gpu,fan.speed,power.draw,clocks.sm \
  --format=csv -l 1

本当に熱でクロックが下がっているかは、スロットリング要因で確認できます。

nvidia-smi -q -d PERFORMANCE

Clocks Throttle Reasons の SW Thermal Slowdown / HW Thermal Slowdown が Active なら、熱起因でクロックが落ちています。

ここで一点、よくある誤解を潰しておきます。nvidia-smi にファン回転数を設定するオプションはありません(監視専用です)。回転数の制御は別系統で行います。

fan control には X と Coolbits が要る(最大の壁)

NVIDIAのLinuxドライバでは、ファン制御は nvidia-smi(NVML)ではなく nvidia-settings(NV-CONTROL)経由で行います。そのため X サーバが動いていて、かつ Coolbits で手動制御が許可されている ことが前提になります。ヘッドレスのサーバだと、たいていここでつまずきます。

ドライバ付属のREADME(Coolbitsの項)によると、値 4 で手動ファン制御が有効になります。Coolbitsはビット単位のORで、たとえば 12(=4+8)ならオーバークロックも併用、という指定になります。ファン制御だけなら 4 で十分です。

有効化はどちらかで行います。

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

または /etc/X11/xorg.conf の Device セクションに次を書きます。

Option "Coolbits" "4"

反映にはXの再起動(=再ログイン、またはディスプレイマネージャの再起動)が必要です。

ヘッドレス構成では、モニタ非接続だとXが起動せず nvidia-settings が接続できないことがあります。その場合は ConnectedMonitor や AllowEmptyInitialConfiguration を xorg.conf に足して仮想的にディスプレイを用意する対応が要ります(必要な指定は環境によって異なります)。

ファンカーブを自作して常駐させる

まず手動モードに切り替えて、単発で回転を指定してみます。

export DISPLAY=:0
nvidia-settings -a "[gpu:0]/GPUFanControlState=1"
nvidia-settings -a "[fan:0]/GPUTargetFanSpeed=70"

GPUFanControlState=1 が手動、0 で自動に戻ります。ファンが複数あるカードは [fan:0] [fan:1] の両方を指定しないと片方しか変わりません。

温度に応じて段階的に回すスクリプトの例です。閾値と回転数は、自分のカードの騒音と冷え方を見ながら調整してください(このあたりは環境によって異なります)。

#!/usr/bin/env bash
export DISPLAY=:0
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" >/dev/null
trap 'nvidia-settings -a "[gpu:0]/GPUFanControlState=0"; exit' INT TERM

while true; do
  t=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits)
  if   [ "$t" -ge 80 ]; then s=95
  elif [ "$t" -ge 70 ]; then s=75
  elif [ "$t" -ge 60 ]; then s=55
  elif [ "$t" -ge 45 ]; then s=40
  else s=30; fi
  for f in 0 1; do
    nvidia-settings -a "[fan:$f]/GPUTargetFanSpeed=$s" >/dev/null 2>&1
  done
  sleep 5
done

常駐させるなら、Xセッションを持つユーザの systemd --user サービスにするのが扱いやすいです。停止時に自動へ戻すよう、上のように trap で GPUFanControlState=0 を送っておくと安全です。手で戻す場合も同じく GPUFanControlState=0 を実行します。

つまずきやすい点

症状 主な原因 対処
Setting GPUFanControlState failed Coolbits未設定、またはXなし cool-bits=4 を入れてXを再起動
nvidia-settings が接続できない DISPLAYの値違い/権限違い Xを持つユーザで実行し export DISPLAY=:0
回転数が変わらない fanのindex不足 [fan:0] [fan:1] を両方指定
ドライバ更新後に効かない xorg.confの再生成が必要 nvidia-xconfig を再実行しX再起動

なお、Xを一切持たない純粋なヘッドレスサーバでは、仮想ディスプレイの用意まで含めて手間が増えます。その場合はケースファンやエアフローの見直しなど物理側の対策のほうが早いこともあります。

まとめ

次の一手はシンプルです。まず nvidia-smi -q -d TEMPERATURE を実行し、自分のカードの Slowdown Temp と Max Operating Temp を確認してください。80℃が上限に対してどれだけ余裕があるかが分かれば、ファンカーブを自作すべきか、それとも物理的な冷却で足りるかを落ち着いて判断できます。制御に踏み込むなら、Coolbits有効化 → 手動モード確認 → スクリプト常駐、の順で進めるのが安全です。

この記事で触れたもの

よくある質問

nvidia-smiでファン回転数を変えられますか?

いいえ。nvidia-smiは温度や回転数の監視専用で、ファン回転数を設定するオプションはありません。制御はnvidia-settings(NV-CONTROL)経由で、Xの起動とCoolbitsの有効化が前提になります。

RTX 3060で80℃は危険ですか?

多くのGeForceカードはMax Operating Tempが90℃台に設定され、80℃は上限より下です。ただし具体値はカードで異なるため、nvidia-smi -q -d TEMPERATUREでSlowdownとMax Operatingを確認してください。

ヘッドレスサーバでもファン制御できますか?

できますが、モニタ非接続だとXが起動せずnvidia-settingsが接続できないことがあります。ConnectedMonitorやAllowEmptyInitialConfigurationで仮想ディスプレイを用意する対応が必要です(環境によって異なります)。