ブログ
BLOG

アナウンス

DGX SPARKを使用していると、通常よりも演算速度が数倍遅くなる場合があります。

調査してみると、最大負荷時の消費電力が本来100W程度になるはずが20W程度に留まっており、 GPU本来の性能を発揮できていないことが分かりました。

本記事では、この問題の判別方法と対処方法をまとめます。

消費電力の計測コマンドの準備

NVIDIAチップ搭載マシンでは、下記のコマンドでGPUの状態を確認できます。

nvidia-smi

ただし、このコマンドには以下の問題があります。

  • 表示が大きく、ターミナルが見づらくなる
  • 一度表示されるだけで、時系列の変化が分からない

実はこのコマンドにはオプションがあり、以下のように指定することで必要な情報だけをコンパクトに表示できます。

$ nvidia-smi --query-gpu=pstate,temperature.gpu,power.draw,clocks.sm,utilization.gpu,memory.used  --format=csv -l 1
pstate, temperature.gpu, power.draw [W], clocks.current.sm [MHz], utilization.gpu [%], memory.used [MiB]
P8, 36, 4.34 W, 208 MHz, 0 %, [N/A]
P8, 36, 4.35 W, 208 MHz, 0 %, [N/A]
P8, 36, 4.41 W, 208 MHz, 0 %, [N/A]

表示される項目はそれぞれ、pstate・GPU温度・消費電力・動作クロック・GPU使用率・メモリ使用量を表しています。

pstate(パフォーマンスステート)の主な値は以下の通りです。

  • P0:通常動作(最大パフォーマンスモード)
  • P8:スタンバイモード(省電力状態)

オプションの意味は以下の通りです。

  • --format=csv:CSV形式で出力
  • -l 1:1秒周期で繰り返し表示

なお、memory.used [MiB][N/A] と表示されるのは、DGX SPARK がユニファイドメモリ(Unified Memory)構成のためです。

計測コマンドのエイリアス登録

このコマンドは今後頻繁に使用するため、エイリアスに登録しておくと便利です。

$ cd ~
$ nano .bashrc

ファイルの末尾に以下を追加します。

alias smi1='nvidia-smi --query-gpu=pstate,temperature.gpu,power.draw,clocks.sm,utilization.gpu,memory.used  --format=csv -l 1'
alias smi3='nvidia-smi --query-gpu=pstate,temperature.gpu,power.draw,clocks.sm,utilization.gpu,memory.used  --format=csv -l 3'

初回は、ターミナルを開き直すか、以下のコマンドを実行して設定を反映させます。

$ source .bashrc

以降は以下のコマンドで使用できます。

$ smi1  # → 1秒ごとに状態を表示
$ smi3  # → 3秒ごとに状態を表示

負荷テストプログラムの準備

消費電力を計測するには、GPUに最大限の負荷をかける必要があります。 以下のテストプログラム(check.py)を用意します。 PyTorchを使用するため、事前にインストールしておいてください。

このプログラムは、60秒間にわたってGPU上で逆行列演算を繰り返し実行します。

import torch
import time

device = 'cuda'
size = 6000

a = torch.randn(size, size, device=device)
b = torch.randn(size, size, device=device)

print("Start GPU load...")

start = time.time()
while time.time() - start < 60:  # 60秒間実行
    c = a @ b
    torch.cuda.synchronize()

print("Done")

消費電力の計測と判定

ターミナルを2つ開いて、同時に実行します。

  • ターミナル1(状態の監視)
$ smi1
  • ターミナル2(負荷テストの実行)
$ python check.py

正常な場合

check.py 実行後にターミナル1で消費電力が90W以上に上昇することが確認できます。

P8, 45, 5.18 W,  208 MHz,  0 %, [N/A]
P8, 45, 4.75 W,  208 MHz,  0 %, [N/A]
P0, 58, 42.19 W, 2405 MHz, 96 %, [N/A] ← check.py 実行開始
P0, 59, 93.08 W, 2405 MHz, 96 %, [N/A] ← 消費電力が90W以上に(正常)!
P0, 60, 93.43 W, 2405 MHz, 96 %, [N/A]
P0, 60, 93.41 W, 2405 MHz, 96 %, [N/A]
P0, 61, 93.64 W, 2405 MHz, 96 %, [N/A]
P0, 61, 93.91 W, 2405 MHz, 96 %, [N/A]

異常な場合

異常時な場合は、pstateはP0(通常動作)であるにもかかわらず、消費電力が最大16W程度に抑えられています。 消費電力制限が誤作動しているような状態です。
この状態ではGPUの演算速度がかなり遅くなってしまいます!!

P0, 43, 6.87 W,  637 MHz, 64 %, [N/A]
P0, 44, 16.93 W, 630 MHz, 96 %, [N/A]  ← check.py 実行開始
P0, 44, 16.93 W, 630 MHz, 96 %, [N/A]  ← 消費電力が16W程度のまま(異常)!
P0, 44, 16.94 W, 630 MHz, 96 %, [N/A]
P0, 44, 16.86 W, 624 MHz, 96 %, [N/A]
P0, 44, 16.91 W, 637 MHz, 96 %, [N/A]
P0, 44, 16.94 W, 630 MHz, 96 %, [N/A]

対処方法

以下の手順で、ほとんどの場合に問題が解消されます。

  1. DGX SPARK をシャットダウンする
  2. 電源ケーブルをコンセントから抜く
  3. 数分間放置する
  4. 電源ケーブルを接続し、DGX SPARK を起動する

まとめ

この現象はGPU使用率が高くても消費電力が上がらないため、速度低下に気づきにくいという点が厄介です。
DGX SPARKを起動したら、本記事の手順で動作確認を行うことをお勧めします。

ロボット開発・製品導入に関するご相談を承っております

構想段階からのご相談やお見積りのご依頼もお気軽にお問い合わせください

お問い合わせ >>
お問い合わせ