DGX SparkのGPUクロックを制限する:sparkLimiterのインストールとサービス登録
DGX SparkのGPUクロック上限を設定し、再起動後も同じ制限を適用するには、 を使用できる。 でクロック範囲を設定し、起動時に再適用するsystemdサービスを登録するBashスクリプトだ。 以下はDGX Spark 1台で直接実行する方法だ。デフォルト値の を使用し、必要に応じて のように変更できる。 この記事
DGX SparkのGPUクロック上限を設定し、再起動後も同じ制限を適用するには、 を使用できる。 でクロック範囲を設定し、起動時に再適用するsystemdサービスを登録するBashスクリプトだ。 以下はDGX Spark 1台で直接実行する方法だ。デフォルト値の を使用し、必要に応じて のように変更できる。 この記事
目次
DGX SparkのGPUクロック上限を設定し、再起動後も同じ制限を適用するには、sparkLimiterを使用できる。nvidia-smi -lgcでクロック範囲を設定し、起動時に再適用するsystemdサービスを登録するBashスクリプトだ。
以下はDGX Spark 1台で直接実行する方法だ。デフォルト値の0,2200を使用し、必要に応じて0,1800のように変更できる。
この記事はリポジトリのコードをもとにまとめたものだ。実際のDGX Sparkにインストールしたり、性能・温度・消費電力の変化を測定したりした結果ではない。2200MHzと1800MHzは設定例であり、推奨性能値や節電効果を保証するものではない。
DGX Sparkのターミナルで実行する。NVIDIAドライバー、systemd、Bashが必要で、サービスを登録するアカウントにはsudo権限が必要だ。スクリプトは/usr/bin/nvidia-smiのパスを使用する。
nvidia-smiでGPUが正常に認識されているか、まず確認する。ドライバーエラーがある場合は、クロック制限より先にドライバーの問題を解決する。
Gitがない場合は、Ubuntu/Debianを基準にインストールする。このパッケージのインストールコマンドはsparkLimiterのものではなく、OSの準備段階にあたる。
sudo apt-get update
sudo apt-get install -y gitgit clone https://github.com/MiaAI-Lab/sparkLimiter.git
cd sparkLimiter管理者権限でシステム設定を変更するスクリプトなので、実行前に内容を確認する。
less spark-limiter.sh別途ビルドしたり、Pythonパッケージをインストールしたりする必要はない。リポジトリ内の実行ファイルをそのまま使用する。
現在接続しているSparkに最大2200MHzの範囲を要求するには、次のコマンドを実行する。
./spark-limiter.sh --clocks 0,2200 localhost--clocks MIN,MAX:MHz単位の最小・最大クロック範囲。0,2200:最小0、最大2200MHzを要求する。GPUを常に2200MHzに固定するという意味ではない。localhost:現在のマシンに適用する。ローカルでの適用にSSHは不要。--clocksを省略しても、デフォルト値は0,2200だ。この記事では適用する値が明確になるよう、明示している。
このコマンドはGPUクロックの設定とシステムサービスの登録を直ちに実行する。スクリプト全体の前に
sudoを付ける必要はない。必要な処理ではスクリプトがsudoを呼び出す。localhostやホストを明示的に指定すると、マシンの選択確認なしにそのまま適用されるため、対象を先に確認する。
スクリプトが実行する処理は次のとおり。
sudo /usr/bin/nvidia-smi -lgc 0,2200でクロック範囲を適用する。/etc/systemd/system/spark-gpu-clock-limit.serviceを作成する。したがって、サービスファイルを別途作成したり、systemctl enableを実行したりする必要はない。GPUクロックを制御するツールであり、CPUクロックやGPUの電力制限値を設定するツールではない。実際に許可されるクロック範囲は、マシンとドライバーが対応しているかどうかによる。
次のコマンドも対象のDGX Sparkで実行する。
systemctl is-enabled spark-gpu-clock-limit.service
systemctl status --no-pager spark-gpu-clock-limit.service
systemctl cat spark-gpu-clock-limit.service確認する項目は次のとおり。
is-enabledの結果がenabledであることを確認する。Type=oneshotなので、正常に適用された後もactive (exited)と表示される場合がある。ExecStartが/usr/bin/nvidia-smi -lgc 0,2200であることを確認する。現在の起動中に実行された記録と、GPUクロック情報も確認する。
sudo journalctl -b -u spark-gpu-clock-limit.service --no-pager
/usr/bin/nvidia-smi -q -d CLOCK作業中に実際のグラフィックスクロックを1秒間隔で確認するには、次のコマンドを使用する。終了するにはCtrl+Cを押す。
/usr/bin/nvidia-smi \
--query-gpu=name,clocks.current.graphics \
--format=csv -l 1
Max Clocksは、設定した制限値をそのまま示す項目ではない。 NVIDIAのドキュメントでは、この値はGPUの設計上の最大クロックを意味する。インストールスクリプトの最後の出力にもclocks.max.grが表示されるが、この数値が2200に変わらなければ成功ではない、というわけではない。サービス設定と実行記録の両方を確認する必要がある。アイドル状態で現在のクロックが低く表示されるだけでは、制限が適用された証明にはならない。
起動後の自動適用まで確認するには、作業を保存し、実行中のGPU作業を終了してから再起動する。再起動すると現在の接続と作業が中断されるため、可能なタイミングでのみ実行する。
sudo systemctl reboot再接続後はインストールコマンドを再実行せず、上記のサービスの状態・設定・現在の起動時ログを確認する。そうすれば、手動での適用ではなく、起動時に適用されたかどうかを確認できる。
上限値を1800MHzに変更するには、同じスクリプトを再実行する。
./spark-limiter.sh --clocks 0,1800 localhostサービスファイルも新しい値に置き換えられ、直ちに再起動される。その後の再起動でもこの値が使用される。再び2200MHzに変更するには、次のように実行する。
./spark-limiter.sh --clocks 0,2200 localhostnvidia-smi -lgcだけを単独で実行しても、現在のクロック設定は変わるが、サービスに保存した値は変わらない。再起動後も維持する値はスクリプトで変更する。
sudo systemctl stop spark-gpu-clock-limit.service正常にアクティブな状態のサービスを停止すると、ExecStopのnvidia-smi -rgcが実行され、GPUクロック設定をデフォルト値に戻す。起動時の自動実行は維持されるため、次回起動時に制限が再び適用される。
再び適用するには、次のように実行する。
sudo systemctl restart spark-gpu-clock-limit.servicesudo systemctl disable --now spark-gpu-clock-limit.service
sudo /usr/bin/nvidia-smi -rgc最初のコマンドは自動実行を無効にし、現在のサービスも停止する。2番目のコマンドはクロックのリセットを明示的に実行する。disableだけを使い、--nowを省略すると、現在のサービスは停止されない。
サービスを残したまま再び有効にするには、次のように実行する。
sudo systemctl enable --now spark-gpu-clock-limit.serviceダウンロードしたsparkLimiterディレクトリで実行する。
./spark-limiter.sh --uninstall localhostサービスの停止・自動実行の無効化、GPUクロックのリセット、サービスファイルの削除を行う。ダウンロードしたリポジトリのディレクトリは削除しない。
nvidia-smi -rgcだけを実行するとサービスは残る。サービスが有効になっている場合、次回起動時に制限が再び適用されるため、恒久的に解除するには自動実行の無効化または削除が必要。
1台だけ設定するなら、前述のlocalhost方式で十分だ。複数のSparkを管理する場合は、SSHで対象を指定できる。以下のubuntu@spark1は実際のアカウント名とホスト名に置き換える。
./spark-limiter.sh --clocks 0,2200 ubuntu@spark1複数台の場合も、スペースで区切って列挙する。
./spark-limiter.sh --clocks 0,2200 ubuntu@spark1 ubuntu@spark2リモート対象にも/usr/bin/nvidia-smi、systemd、sudo権限が必要だ。初回接続時には、SSHホスト鍵のフィンガープリントが正しい対象マシンのものか確認する。状態確認コマンドは各対象マシンで実行する。
自動検出を使用するには、次のコマンドで候補一覧を確認できる。検索には対象マシンへのSSH鍵認証が必要だ。
./spark-limiter.sh --listホストを直接指定したコマンドでは、検索と対象マシンの選択が省略される。対象マシンが確実な場合は、対象を明示的に指定するほうが適用範囲を確認しやすい。
リポジトリが更新されると、デフォルト値や動作が変わることがあるため、実行前に現在のコードを確認する。