動機
GPUの設定(NVIDIAなら nvidia-smi
)でGPUの消費電力の上限を設定することができるので,GPUの消費電力あたりのハッシュレートを最適化するだけならワットチェッカーなしでも行えます。しかしながら,GPU以外の電源装置やCPUなどの消費電力のことも考えると,ワットチェッカーを使ってシステム全体の電力を測定必要があると考えられます。そこで消費電力のログをBluetoothで取得できるワットチェッカーを使ってマイニングの電力効率を最適にする設定を探しました。
使用したワットチェッカーは以下のものです。
Bluetoothワットチェッカー REX-BTWATTCH1
Bluetoothアダプタの選定
ログを保存しておくために別のPCを用意するのも面倒なので,マイニングを行うPCにUSBタイプのBluetoothアダプタを取り付けてワットチェッカーと接続することにしました。以下のURLによると動作しないものもあるということなので注意しておいたほうが良さそうです。
Linuxからワットチェッカーに接続する
公式に提供されているツールはWindows用とAndroid/iOS用のものしかなく,プロトコルの仕様書なども公開されていないのですが,以下のページでLinuxから接続する方法が解説されています。
Armadillo-IoT G3で「Bluetooth ワットチェッカー」から計測データを表示
サンプルプログラムを動かすとこんな感じになります↓
私はbluetoothctl, sdptoolやrfcommなどのコマンドの意味をちゃんと理解していないのであまり解説できないのですが,上記のページの通りにコマンドを実行すると動作させることができました。少しだけ罠もあるので紹介します。
だいたいのコマンドを実行するときには sudo
が必要
sudo
無しで実行しても "Permission denied" というようなメッセージが表示されないものがあるので注意しましょう。
たとえば bluetoothctl
を実行するときには sudo
なしで実行するとプロンプトは表示されるのですが,何も入力を受け付けてくれず,ハングアップしたような見た目になります。(Ctrl-Cは動く)。
sdptool add SP
を実行するときには sudo
なしで実行すると何も表示されずに終了します(コマンドの終了コードは非ゼロです)。Serial Port service registered
という出力がないといけません。
bluetoothdのためのsystemdの設定に --compat
を追加するときには systemctl edit
ではうまくいかない
上記のページによれば,sdptoolを使用するためにbluetoothdのサービスを起動するときのオプションに --compat
が必要なので, /etc/systemd/system/dbus-org.bluez.service
を直接編集するように説明があります。しかしながら,一般にsystemdで既存のunitの設定ファイルを直接編集するのは良くないこととされていて, systemctl edit
を使って設定ファイルの差分だけを記述する方法が用意されています。詳細は以下のページを参照して下さい。
systemdで既存のunitを編集する2つの方法 - Qiita
しかしながら,理由はよくわからないものの, systemctl edit
を使った場合には --compat
オプションが正しく適用されていないようなのです。仕方がないので設定ファイルを直接編集する方法を取りました。
ワットチェッカーのログを保存する
公開されているC言語のサンプルプログラムがそのまま動作したので,出力をそのままファイルに保存することにしました。ただしプログラムの出力がバッファされてしまっているようで,直ちにファイルに書き込まれるわけではないようなので, unbuffer
などを使ってバッファされないようにしたほうが良いと思います。
sudo unbuffer ./wattchecker /dev/rfcomm0 | tee -a ~/watt_logs/watt.log
ログはこんな感じになります(プログラムのほうを修正すればなんとでもなるのですが,ご自由にどうぞ)
2017/12/26 16:53:38
voltage = 105.22V , current = 365.26mA , power = 36.37W
2017/12/26 16:53:40
voltage = 105.29V , current = 365.93mA , power = 36.45W
2017/12/26 16:53:42
voltage = 105.32V , current = 365.20mA , power = 36.33W
2017/12/26 16:53:44
voltage = 105.16V , current = 363.63mA , power = 36.15W
2017/12/26 16:53:46
voltage = 105.18V , current = 364.60mA , power = 36.29W
パースするときには以下のような関数を使いました。
import re
import datetime
def parse_watt(iters):
pattern = r'^voltage = (?P<voltage>\d+\.\d+)V , current = (?P<current>\d+\.\d+)mA , power = (?P<power>\d+\.\d+)W$'
for line in iters:
line = line.rstrip('\n')
m = re.match(pattern, line)
if m:
time_str = prev_line
date = datetime.datetime.strptime(time_str, r'%Y/%m/%d %H:%M:%S')
yield (date, float(m.group('power')))
prev_line = line
GPUの設定を変更しながらベンチマークを動かす
ワットチェッカーのログが取れるようになったので,GPUの電力設定を変更しながらベンチマーク動かしてハッシュレートを調べたいと思います。
今回は NVIDIAのGPUで tpruvot/ccminer を動かしました。ハッシュ計算のアルゴリズムはLyra2v2を使いました。使用したスクリプトを以下に示します。
#!/bin/bash
set -ue -o pipefail
export LC_ALL=C
nvidia-smi -pm 1
for pl in $(seq 60 2.5 120); do
# sudo で動かさないと --plimit が動作しないので注意
hashrate=`./ccminer -a lyra2v2 --benchmark --time-limit 90 --plimit $pl 2>&1 >/dev/null`
printf "`date`\t${pl}\t${hashrate}\n"
done
このスクリプトではGPUの消費電力の上限を60Wから120Wまで2.5Wごとに変化させて,それぞれの設定ごとに90秒間のベンチマークを動作させてハッシュレートを記録しています。
どこかのマイニングプールに接続してマイニングしながら計測を行うと無駄がなくて良いと思うかもしれませんが,タスクの待ち時間などでGPUが動いていない期間が発生してしまい,計測が不正確になってしまうのでやめたほうがいいです。代わりに --benchmark
オプションを使ってGPUを全力で動かす設定にしましょう。 --time-limit
はベンチマークを動かす時間を秒で指定するオプションです。 --plimit
はGPUの消費電力の上限をワットで指定するオプションで nvidia-smi -pl
と同様に設定に応じて動作周波数などを調整してくれます。
--benchmark
モードでは指定した時間(今回は90秒)が経過したら標準エラー出力にハッシュレートを出力するので, 2>&1 >/dev/null
とすることでハッシュレートを標準出力にリダイレクトさせつつ,もともとの標準出力を捨てています。
結果
測定したシステムの構成は以下のとおりです。
CPU | Intel(R) Pentium(R) CPU G4560 @ 3.50GHz (TDP 54W) |
電源 | Antec NeoECO Classic NE550C (80PLUS BRONZE) |
GPU | NVIDIA GeForce GTX 1060 (3GB) |
システム全体の電力とccminerのplimitオプションの関係
横軸はccminerのplimitオプションで設定した値,縦軸はワットチェッカーで計測したシステム全体の消費電力です。エラーバーは90秒間のベンチマーク中のシステム全体の消費電力の標準偏差です(ワットチェッカーによるログ取得は2秒に1回行われるため)。
70Wあたりに不思議な傾向が見られました。GPUの電源制御の仕組みなどが関係しているのかもしれませんが,理由はよく分かりませんでした。知っている人がいたら教えてください。
ハッシュレートとccminerのplimitオプションの関係
横軸はccminerのplimitオプションで設定した値,縦軸はccminerのハッシュレートです。当たり前ですが,plimitの設定を高くすればするほどハッシュレートは高くなります。
ハッシュレートとシステム全体の電力の関係
縦軸はワットチェッカーで計測したシステム全体の消費電力(90秒間の平均値),縦軸はccminerのハッシュレートです
電力あたりのハッシュレートとccminerのplimitオプションの関係
横軸はccminerのplimitオプションで設定した値,縦軸はシステム全体の消費電力あたりのハッシュレートです。
この実験で一番重要なグラフです。今使っているGPUではplimitの設定を72.5Wにしたときに消費電力あたりのハッシュレートが最適になるということがわかりました。
結論
Bluetoothワットチェッカーを使って消費電力を記録することでマイニングの電力効率の最適化を試みました。
今後はccminerの --pstate
, --cpu-clock
, --mem-clock
あたりのオプションの最適化にも取り組んでみたいです。
付録 A. SPP,SDP,RFCOMMについて
SPPとかSDPとかRFCOMMとかいろいろな登場人物が登場するので,深く理解したい人は以下の資料あたりから調べてみるといいかもしれません。