Radeon VIIでStable Diffusionを使って画像生成している時に、同じ部屋の照明がチラつくことに気が付いた。 明らかにグラボの消費電力が原因なので対策する。

PCスペック

CPUAMD Ryzen 7 1700
メモリDDR4-2400 32GB(8GB x 4)
マザーボードFatal1ty AB350 Gaming K4
グラフィックボードSAPPHIRE RADEON VII
SSD(NVMe)PX-256M9PeG
無線LANアダプターArcher TX3000E
OSUbuntu 22.04.2 LTS

グラフィックボード詳細

GPURadeon VII
コアクロック1750MHz
メモリクロック1000MHz
メモリサイズ/バス幅16GB/4096bit
消費電力300W
Radeon VII

手段

Linux環境にはAMD Softwareのような便利なGUIソフトウェアはない。
そのため、デバイスファイルにデータを書き込む方法で各設定値を調整していく。

その辺の基本的な操作はArchWikiが詳しい↓
https://wiki.archlinux.jp/index.php/AMDGPU

  1. /etc/default/grubに値を追加
    GRUB_CMDLINE_LINUX_DEFAULT="amdgpu.ppfeaturemask=0xffffffff
    
  2. 管理者権限でupdate-grub2を実行して再起動
    $sudo update-grub2
    

ここまでやればあとは自由に設定変更できるようになる。

よく使うコマンド

P-state確認

$sudo cat /sys/class/drm/card0/device/pp_od_clk_voltage
OD_SCLK:
0:        808Mhz
1:       1801Mhz
OD_MCLK:
1:       1000Mhz
OD_VDDC_CURVE:
0:        808Mhz        713mV
1:       1304Mhz        823mV
2:       1801Mhz       1124mV
OD_RANGE:
SCLK:     808Mhz       2200Mhz
MCLK:     800Mhz       1200Mhz
VDDC_CURVE_SCLK[0]:     808Mhz       2200Mhz
VDDC_CURVE_VOLT[0]:     738mV        1218mV
VDDC_CURVE_SCLK[1]:     808Mhz       2200Mhz
VDDC_CURVE_VOLT[1]:     738mV        1218mV
VDDC_CURVE_SCLK[2]:     808Mhz       2200Mhz
VDDC_CURVE_VOLT[2]:     738mV        1218mV

最大GPUクロック変更

$sudo sh -c "s 1 1801 > /sys/class/drm/card0/device/pp_od_clk_voltage"

↓の電圧変更と合わせて使う。

電圧変更

$sudo sh -c "vc 2 1801 1124 > /sys/class/drm/card0/device/pp_od_clk_voltage"

設定を適用

$sudo sh -c "echo c > /sys/class/drm/card0/device/pp_od_clk_voltage"

GPUモニタリング

$sudo watch -n 0.5  cat /sys/kernel/debug/dri/0/amdgpu_pm_info

測定

以前の記事と同様の設定を使用する。

設定

使用するモデル

AbyssOrangeMix2_nsfw

ポジティブプロンプト

a photograph of an astronaut riding a horse

ネガティブプロンプト

nsfw, (worst quality, low quality, extra digits, male:1.4), bad_prompt

他設定

Sampling methodDPM++ 2M Karras
Sampling steps20
Width/Height640 / 480
Batch count2
Batch size5
CFG Scale7
Seed2382819807

パフォーマンス比較

GPUクロック電圧描画時間(Time taken)消費電力(ワットチェッカー読み)
1801MHz(デフォルト)1123mV(デフォルト)217.7s430W
1600MHz900mV221.5s335W
1500MHz860mV233.6s285W
1400MHz810mV249.6s245W
1300MHz770mV265.6s220W
1200MHz740mV286.0s200W

当然だが、GPUクロックを下げるたびに消費電力が下がって描画時間が長くなる。 どれが効率が良いのかが分かりづらいので、一回の生成にかかる電力量を計算してみる。

GPUクロック電圧1回の生成にかかる電力量(W)
1801MHz(デフォルト)1123mV(デフォルト)93,611
1600MHz900mV74,202.5
1500MHz860mV66,576
1400MHz810mV61,152
1300MHz770mV58,432
1200MHz740mV57,200

1200Mhz/740mVの組み合わせが一番効率的という結果になった。

まとめ

Radeon VIIのGPUクロックと電圧を下げることで、性能は落ちるものの、消費電力を抑えられた。また、当初の問題だった照明のちらつきもなくすことができた。 電力をバカ食いする本グラボでは、デフォルト値が盛られていることもあり、低電圧化の恩恵は大きいことが分かった。

同じようなグラボを使っている方は自己責任でぜひ試してほしい。