情報詳細Q.GPUを使用したディープラーニング推論時間のばらつきを抑制したいです。ナレッジ000009385の内容は既に試しています。A.GPUの仕様上、使用していない時間があると電力効率を考慮してクロックが下がるよう制御されます。かなり短いサンプリング時間で制御が行われるため、わずかなSleepや別のCPU処理を行うだけでもクロックが低下し、処理時間にばらつきが発生します。次の方法でGPUクロックを固定することで改善できます。管理者権限でのコマンドプロンプト操作が必要です。1. GPUIDの取得 nvidia-smi C:\Windows\System32>nvidia-smi Tue Sep 3 11:08:23 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 560.81 Driver Version: 560.81 CUDA Version: 12.6 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 4090 WDDM | 00000000:01:00.0 Off | Off | | 31% 41C P2 71W / 450W | 1975MiB / 24564MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ Bus-IdがGPUIDとなります(この場合00000000:01:00.0)2. すべてのGPUの最大電力を取得し、メモします。 nvidia-smi -q -d POWER | findstr Max C:\Windows\System32>nvidia-smi -q -d POWER | findstr Max Max Power Limit : 450.00 W Max : 72.62 W Max Power Limit : N/A この場合、最大電力は450.00です。3. 使用されているGPUの最大電力を、手順1で得た値に設定し、GPUIDでアドレス指定します。 nvidia-smi -pl <maxPower> -i <GPUID> C:\Windows\System32>nvidia-smi -pl 450 -i 00000000:01:00.0 Power limit for GPU 00000000:01:00.0 was set to 450.00 W from 450.00 W. All done. 4. 最大SMクロック周波数を取得し、メモします。(複数の値が返された場合は最大の値をメモします) nvidia-smi -q -d CLOCK | findstr SM C:\Windows\System32>nvidia-smi -q -d CLOCK | findstr SM ==============NVSMI LOG============== SM : 2760 MHz SM : 3105 MHz SM Clock Samples この場合、3105MHzをこの後使用します5. 最小・最大GPUクロック周波数を手順4で得た値に設定し、GPUIDでアドレス指定します。 nvidia-smi --lock-gpu-clocks=<SM Clock>,<SM Clock> -i <GPUID> C:\Windows\System32>nvidia-smi --lock-gpu-clocks=3105,3105 -i 00000000:01:00.0 GPU clocks set to "(gpuClkMin 3105, gpuClkMax 3105)" for GPU 00000000:01:00.0 All done. 6. 最大メモリークロック周波数を取得し、メモします。(複数の値が返された場合は最大の値をメモします) nvidia-smi -q -d CLOCK | findstr Memory C:\Windows\System32>nvidia-smi -q -d CLOCK | findstr Memory Memory : 9751 MHz Memory : N/A Memory : N/A Memory : N/A Memory : 9751 MHz Memory Clock Samples 7. 最小・最大メモリークロック周波数を手順6で得た値に設定し、GPUIDでアドレス指定します。 nvidia-smi --lock-memory-clocks=<SM Clock>,<SM Clock> -i <GPUID> C:\Windows\System32>nvidia-smi --lock-memory-clocks=9751,9751 -i "00000000:01:00.0" Memory clocks set to "(memClkMin 9751, memClkMax 9751)" for GPU 00000000:01:00.0 All done. Windowsでは次のようなバッチファイルを作成しておくと便利です。各数値はGPUの機種によって異なるため、実機で取得した値をもとに設定してください set ID="00000000:01:00.0" set POWER=365.00 set SM=2100 set MEMORY=9751 nvidia-smi -pl %POWER% -i %ID% nvidia-smi --lock-gpu-clocks=%SM%,%SM% -i %ID% nvidia-smi --lock-memory-clocks=%MEMORY%,%MEMORY% -i %ID% pause * デフォルト状態に戻すには以下のコマンドを実行してください。 nvidia-smi --reset-gpu-clocks nvidia-smi --reset-memory-clocks * 詳細や関連情報は外部ページにはなりますが、以下のURLをご参照ください。https://developer.nvidia.com/blog/advanced-api-performance-setstablepowerstate/* 最大SMクロックに固定することによる寿命の懸念がある場合、任意のクロックに固定することができます。添付ファイルタイトルディープラーニング推論時間のばらつきを抑制したいURL 名000009712公開状況公開済み検証状況公開済み