Windows 11でCUDA使用中なのにタスクマネージャーのGPU使用率が0%になる問題をHAGS無効化で直した

スポンサーリンク

この記事は、筆者のWindowsマルチGPU環境で実際に起きた問題を、AIとの調査ログをもとに整理したものです

スポンサーリンク

起きたこと

Windows 11のマルチGPU環境で、ローカルLLMを実行しているときに奇妙な症状に遭遇しました。

nvidia-smiでは2枚のGPUにしっかり負荷がかかっているのに、Windowsのタスクマネージャーでは片方のGPU使用率だけが0%のままになっていました。

今回の構成は、ざっくり言うと次のようなものです。

  • Windows 11 Pro
  • NVIDIA GeForce RTX 3090 + RTX 3080
  • NVIDIA Driver 576.80
  • ローカルLLM実行環境: LM Studio
  • 片方のGPUは表示出力あり
  • もう片方のGPUはモニターなしのヘッドレス状態
  • マシンはサブ機で、普段はリモート操作

最終的には、HAGS(ハードウェア アクセラレータによる GPU スケジューリング)を無効化して再起動したところ、タスクマネージャー側でもCUDA負荷が見えるようになりました。

最初に疑ったこと: phantom device

このPCは過去にGPU構成を何度か入れ替えていました。

そのため、まず疑ったのはWindows上に残っている古いGPUの履歴です。Device Managerで「非表示のデバイスを表示」したときに出てくる、いわゆる phantom device / non-present device です。

PowerShellでは次のように確認できます。

Get-PnpDevice -Class Display

実際、過去に使っていたGPUや、同じGPUを別スロットに挿していたときのデバイスインスタンスが CM_PROB_PHANTOM として残っていました。

不要なphantom deviceは、管理者権限のPowerShellなどから pnputil で削除できます。

pnputil /remove-device "PCI\VEN_...."

この作業で、Device Manager相当の表示は現在刺さっている2枚のGPUだけになりました。BlenderのCycles設定にも古いGPUが残っていたので、userpref.blend のバックアップを取った上でデバイス一覧を再生成しました。

その結果、BlenderやDevice Manager上のGPU一覧は正常になりました。

しかし、タスクマネージャーで片方のGPU使用率が見えない問題はまだ残りました。

nvidia-smiではGPUはちゃんと動いている

ローカルLLMで負荷をかけると、nvidia-smiでは両方のGPUが使われていました。

実測では、おおよそ次のような状態でした。

RTX 3080: GPU使用率 約40%, VRAM 約9.7GB, 消費電力 約150W
RTX 3090: GPU使用率 約60%, VRAM 約19GB, 消費電力 約340W

つまり、GPUが使われていないわけではありません。

一方で、タスクマネージャーやWindowsのGPU Engine counterでは、片方のGPUだけ使用率が0%に見えていました。

Windows側のカウンタは次のように確認できます。

Get-Counter '\GPU Engine(*)\Utilization Percentage'

この時点では、GPUメモリ使用量は見えているのに、GPU Engine utilizationだけが0%という状態でした。

タスクマネージャーとnvidia-smiは同じものを見ていない

ここで重要なのは、Windowsのタスクマネージャーと nvidia-smi は同じ計測経路を見ているわけではない、ということです。

Microsoftの説明では、タスクマネージャーのGPU表示はWDDMのGPU schedulerやvideo memory manager由来の情報を使っています。

参考:

GPUs in the task manager – DirectX Developer Blog
The below posting is from Steve Pronovost, our lead engineer responsible for the GPU scheduler and memory manager. GPUs …

一方、nvidia-smiはNVIDIAのNVML側からGPU使用率を見ています。

参考:

https://docs.nvidia.com/deploy/nvidia-smi/index.html

そのため、CUDAやローカルLLMのようなcompute系の負荷では、nvidia-smiでは見えているのにタスクマネージャーでは見えない、ということが起き得ます。

特に今回のように、片方のGPUがヘッドレス、つまり表示出力を持っていない状態では、Windows側のWDDM GPU Engine counterがうまく出ないことがあるようです。

HAGSとは何か

HAGSは、Hardware-Accelerated GPU Schedulingの略です。

日本語のWindows設定では「ハードウェア アクセラレータによる GPU スケジューリング」と表示されます。

設定場所は次のあたりです。

設定
→ システム
→ ディスプレイ
→ グラフィック
→ 既定のグラフィック設定
→ ハードウェア アクセラレータによる GPU スケジューリング

ざっくり言うと、GPUに投げる仕事の順番管理を、従来よりGPUやドライバ側に寄せる機能です。ゲームではレイテンシやCPU負荷が改善することがあります。

一方で、CUDA、録画、リモート操作、マルチGPU監視などでは、環境によってGPU使用率表示や互換性に影響することがあります。

HAGSを無効化したらCUDA engineが見えるようになった

今回の環境では、HAGSを無効化して再起動したところ、Windows側のGPU Engine counterにCUDA負荷が出るようになりました。

無効化後、同じローカルLLM負荷をかけると、Get-Counterで次のように engtype_cuda が見えるようになりました。

GPU A: engtype_cuda 約40%
GPU B: engtype_cuda 約53%

nvidia-smi側でも両GPUに負荷が出ており、タスクマネージャー側の表示とも整合するようになりました。

つまり今回の問題は、GPU本体の故障ではありませんでした。

また、phantom deviceの残骸だけが原因でもありませんでした。

最終的には、HAGS有効時に、ヘッドレス側GPUのCUDA engine使用率がWindowsのタスクマネージャーに出ていなかった、という見立てです。

HAGSを無効化する副作用

HAGSを無効化すると、GPUスケジューリングは従来方式に戻ります。

あり得る影響としては、次のようなものがあります。

  • 一部ゲームでfpsやレイテンシが少し変わる
  • Frame Generationや低遅延系の機能に影響する可能性がある
  • 逆に、CUDA、Blender、ローカルLLM、録画、リモート操作、マルチGPU監視では安定する場合がある

今回のPCはゲーム用メインマシンではなく、ローカルLLMやBlenderなどのGPU作業用サブ機です。そのため、HAGSは無効のまま運用することにしました。

切り分け手順まとめ

同じように「GPUは動いているはずなのにタスクマネージャーで使用率が見えない」という場合、次の順番で確認するとよさそうです。

1. nvidia-smiを見る

まずはタスクマネージャーではなく、nvidia-smiで確認します。

nvidia-smi

ここでGPU使用率、VRAM使用量、温度、消費電力が出ていれば、GPU自体は動いています。

2. WindowsのDisplayデバイスを確認する

過去にGPUを差し替えている場合は、phantom deviceが残っていることがあります。

Get-PnpDevice -Class Display

CM_PROB_PHANTOM の古いGPUが大量に残っている場合は、不要なものを整理する価値があります。ただし、削除対象を間違えると面倒なので、実際に刺さっているGPUのInstance IDと照合してから作業したほうが安全です。

3. WindowsのGPU Engine counterを見る

タスクマネージャーの元になっているカウンタは、次のように見られます。

Get-Counter '\GPU Engine(*)\Utilization Percentage'

CUDA負荷なら engtype_cudacompute 系のカウンタに値が出ることがあります。

4. HAGSを無効化して再起動する

HAGSが有効で、特にマルチGPUやヘッドレスGPUで使用率が見えない場合は、HAGS無効化を試す価値があります。

UIから変更するのが一番安全です。

設定
→ システム
→ ディスプレイ
→ グラフィック
→ 既定のグラフィック設定
→ ハードウェア アクセラレータによる GPU スケジューリング

変更後は再起動が必要です。

レジストリで確認する場合は、次のキーを見ます。

Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers' -Name HwSchMode

一般に HwSchMode=1 はHAGS無効、HwSchMode=2 はHAGS有効、値がない場合はWindowsの既定設定に従います。

5. それでもだめならドライバ更新やダミープラグを試す

片方のGPUが完全にヘッドレスの場合、HDMIやDisplayPortのダミープラグを挿すことで、Windows側の扱いが変わることがあります。

ただし、これは原因切り分けとしては有用ですが、常用する必要があるかは環境次第です。

また、NVIDIAドライバのバージョンによって挙動が変わる可能性もあります。古いドライバを使っている場合は、Studio Driverなどの更新も試す価値があります。

まとめ

今回の結論はシンプルです。

GPUはちゃんと動いていた。タスクマネージャーが見えていなかった。原因はHAGSだった。

Windowsのタスクマネージャーは便利ですが、CUDAやローカルLLMの監視では万能ではありません。

特に、マルチGPU、ヘッドレスGPU、HAGS有効、CUDA/compute負荷の組み合わせでは、nvidia-smiやHWiNFO、MSI Afterburnerなど、別系統の監視ツールも併用したほうがよさそうです。

ローカルLLMやBlender用のWindowsマシンでGPU使用率が変に見える場合は、HAGSを一度疑ってみる価値があります。

コメント

タイトルとURLをコピーしました