超初心者向け Swar Chia Plot Manager 導入方法

プロット作成方法を色々試行錯誤してきましたが、いい加減コマンドプロンプトたくさん開いてPlottingするのめんどくさい!となりました。

Twitterなどでも割と聞くようになってきたSwar Chia Plot Managerというのを使ってみたので紹介します。

「Pythonなんもわからん」でもなんとかなったので備忘録として残します。ただし質問されても答えられないかもしれません。返事がなかったら察してください。Windows10環境のお話です。

GitHubからダウンロード

上のリンクから飛んで頂いて、Code→Download ZIPで好きな場所に保存、解凍しておきましょう。

私は公式のInstallationに従ってDocumentsフォルダに入れました。
C:\Users\hyperbanana\Documents\Swar-Chia-Plot-Manager-main
ユーザー名は各自おきかえてください。

Pythonをインストール

Python 3.7以上であればOKみたいですが、よくわからんので最新版を入れます。現時点で3.9.5のようです。

オススメの通り、Windows Installer (64-bit)をダウンロードしましょう。

ダウンロードしたインストーラーを立ち上げます。デフォルトではオフになっていますが、「Add Python 3.9 to PATH」のチェックボックスをオンにしましょう。環境変数PATHを設定します。これをしないと後述のコマンドが動きません。

Install NowをクリックすればOK

閉じます。

Swar Chia Plot Managerをインストール

先程ダウンロードしたフォルダをエクスプローラで開きましょう。
C:\Users\hyperbanana\Documents\Swar-Chia-Plot-Manager-main

開いたらアドレスバーをクリックします。

アドレスバーに「cmd」と入力し、Enterを押します。

コマンドプロンプトが立ち上がりました。powershellでも良いみたいですがここは好みで。

Python仮想環境の作成

Pythonの仮想環境を作成します。コマンドプロンプトに下記コマンドを入力してEnter
python -m venv venv

2番目のvenvは好きな名前に変更できるそうですが、よくわからないので公式の手順どおりにしています。

「Swar-Chia-Plot-Manager-main」に「venv」というフォルダが作成されれば成功です。

このようにコマンドを入力しても「Python」とだけ出るようであればおそらく環境変数PATHが無いです。もしくは管理者権限でコマンドプロンプトを実行するなど色々試してみてください。

Python仮想環境をアクティブにする

仮想環境をアクティブにします。下記コマンドを入力してEnter
venv\Scripts\activate

頭に(venv)とでてくれば成功です。

必須モジュールインストール

必要なモジュールを入れます。下記コマンドを入力してEnter
pip install -r requirements.txt

スクショ取り忘れました。成功してるっぽければ成功。

設定ファイル作成

C:\Users\hyperbanana\Documents\Swar-Chia-Plot-Manager-main

ここにある「config.yaml.default」をコピーして「config.yaml」に名前を変えましょう。

コマンドでやるなら、copy config.yaml.default config.yaml

作った設定ファイルを開きましょう。メモ帳でもなんでもいいです。

コマンドでやるなら、notepad config.yaml

では実際に数値を記入していきましょう。#で始まる行はコメントなので、#が無い行を追記修正していきます。

chia.exeの場所

chia_location: C:\Users\hyperbanana\AppData\Local\chia-blockchain\app-1.1.6\resources\app.asar.unpacked\daemon\chia.exe

chia.exeの場所を記述します。GUIのChia.exeとは違うので注意してください。また、「chia location:」のコロンの後は半角スペースが入ります!単にアドレスをコピペすると半角スペースが無いのでエラーになります。(ハマった)

logの場所

folder_path: C:\Chia\Logs\Plotter

デフォルトでは「S:\Chia\Logs\Plotter」とかよくわからんドライブレターが勝手に書かれていますが、存在しないとエラーになりますので、自分で好きな場所を指定しましょう。ネットワークドライブを指定するとバグります。(ハマった)

globalの設定

max_concurrent: 6
システムが実行できるプロットの最大並列数

max_for_phase_1: 3
フェーズ1を実行できるプロットの最大数

minimum_minutes_between_jobs: 5
新しいジョブを開始するまでの最小時間(分)

jobの設定

- name: MX500
ジョブの名前。お好きな名前を。

max_plots: 999
マネージャー起動中に実行されるプロットの最大数、プロット作成コマンドの-nと近い。

farmer_public_key:
ファーマー公開鍵。chiaセットアップ済みなら空欄でOK、秘密鍵を入れてないマシンで実行する場合は入れる。

pool_public_key:
プール公開鍵。上に同じ。

temporary_directory: D:\chiaTemp
一時ディレクトリを指定。リストを指定することもできます。その場合1つずつ循環して使われるみたい。リスト指定の仕方はデフォルトのジョブを参考にしてください。

temporary2_directory:
一時ディレクトリ2。入力するとフェーズ3,4がここで実行されます。

destination_directory: \\Qnap\home\ChiaPlotsMX500
保存先ディレクトリ。リスト指定すると循環します。

size: 32
kサイズ。そのままでいい。

bitfield: true
ビットフィールドを使用する?trueでいい。

threads: 8
スレッド数。フェーズ1のみ有効。フェーズ1の最大数を指定できるのでたくさん割り当てても大丈夫かも。

buckets: 128
バケット数。128でいい。HDDの場合64にすると少し効率が上がった気がする。

memory_buffer: 5000
RAM数。適当に。

max_concurrent: 2
このジョブの最大並列数。MX500は1TBだからもっと増やしても大丈夫だけど、増やしすぎると速度が落ちるので控えめ運用。

max_concurrent_with_start_early: 2
早期に開始されたフェーズを含む特定時点でのこのジョブのプロット最大数。よくわからんので上と同じ数値にしとく。もしかしたらフェーズ4まで行ったら新しいjob開始するやつかも。

initial_delay_minutes: 0
最初のジョブを開始するときに遅延させる(分)

stagger_minutes: 0
このジョブの次のプロットが開始されるまでの待機時間(分)

max_for_phase_1: 4
このジョブのフェーズ1のプロット最大数。

concurrency_start_early_phase: 4
早くプロットを開始したいフェーズ。このフィールドには4を使用することがオススメらしい。わからん。

concurrency_start_early_phase_delay: 0
初期段階の開始が検出されたときに、新しいプロットが開始されるまでの最大待機時間 (分)。

temporary2_destination_sync: false
宛先ディレクトリを常に一時ディレクトリ2として送信する。よくわからないけど、リストにしたとき用かな?

exclude_final_directory: true
ハーベスターへplotディレクトリ追加すをスキップするかどうか。HPOOL利用中だからスキップする。

skip_full_destinations: false
これを有効にすると、実行中のすべてのプロットと将来のプロットのサイズを計算して、保存先ドライブにジョブを開始するのに十分な空き容量があるかどうかを判断する。ない場合はスキップして次のDestに移動する。すべてがいっぱいになるとジョブが無効になる。
神機能じゃね!?と思ったがネットワークドライブを指定してるとエラーになってジョブが起動せずエラーになる(ハマった)

unix_process_priority: 10
Unixのみ。Win10だと意味ないだろうけどサンプルにかいてあったからそのままにしてる。削除でいいと思う。

windows_process_priority: 32
Windows10のプロットプロセスの優先順位。とりあえずデフォルトのNORMAL_PRIORITY_CLASSにしてる。

enable_cpu_affinity: false
使用するスレッドを指定できる。ハーベスターも兼ねている場合、1~2スレッドを指定から外すとハーベスターやノードのパフォーマンスが上がるようです。

cpu_affinity: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]
上のやつをfalseにしてるから意味ないだろうけどなんとなく残してる。削除でいいと思う。

見づらくなったから一覧でもう一度載せとく。

  - name: MX500
    max_plots: 999
    farmer_public_key:
    pool_public_key:
    temporary_directory: D:\chiaTemp
    temporary2_directory: 
    destination_directory: \\Qnap\home\ChiaPlotsMX500
    size: 32
    bitfield: true
    threads: 8
    buckets: 128
    memory_buffer: 5000
    max_concurrent: 2
    max_concurrent_with_start_early: 2
    initial_delay_minutes: 0
    stagger_minutes: 0
    max_for_phase_1: 4
    concurrency_start_early_phase: 4
    concurrency_start_early_phase_delay: 0
    temporary2_destination_sync: false
    exclude_final_directory: true
    skip_full_destinations: false
    unix_process_priority: 10
    windows_process_priority: 32
    enable_cpu_affinity: false
    cpu_affinity: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]

以上がSSDに2並列でplottingするジョブの設定です。

HDDの場合はこんな感じかな。USB HDDを3台つなげてるのでElements1~3の3つのジョブがあります。一つのジョブでtemporary_directoryをリスト表示にしてもいいと思うけど、ジョブを分けたほうが見やすかった。

  - name: Elements1
    max_plots: 999
    farmer_public_key:
    pool_public_key:
    temporary_directory: F:\chiaTemp
    temporary2_directory: 
    destination_directory: \\Qnap\home\ChiaPlotsMX500
    size: 32
    bitfield: true
    threads: 8
    buckets: 128
    memory_buffer: 5000
    max_concurrent: 1
    max_concurrent_with_start_early: 1
    initial_delay_minutes: 0
    stagger_minutes: 0
    max_for_phase_1: 2
    concurrency_start_early_phase: 4
    concurrency_start_early_phase_delay: 0
    temporary2_destination_sync: false
    exclude_final_directory: true
    skip_full_destinations: false
    unix_process_priority: 10
    windows_process_priority: 32
    enable_cpu_affinity: false
    cpu_affinity: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]

実行

config.yamlの設定がおわったら実行しましょう。下記コマンドを入力してEnter
python manager.py start

バックグラウンドではじまります。
止めるときは
python manager.py stop

確認

進捗状況等を確認するには下記コマンドです。
python manager.py view

一覧で全部みれる!便利~~!

常に確認したいのではなく一度だけこの表示を確認したい場合は、

python manager.py status

設定変更方法

plottingとmanager.pyはそれぞれ独立して動いているため、manager.pyを途中で止めても問題ありません。進捗等はログファイルを読んでいるっぽいので、途中からでも進捗を認識してくれます。

viewを辞める方法は、Ctrl+C

config.yamlを編集し、それを反映したい場合は下記コマンドです。
python manager.py restart

そして再びviewに戻りましょう。
python manager.py view

バケット数などを変えた場合

進捗のパーセンテージはログファイルの行数で管理されているのかな。
config.yamlに次のような記述があります。

progress:
  # phase_line_end: These are the settings that will be used to dictate when a phase ends in the progress bar. It is
  #                 supposed to reflect the line at which the phase will end so the progress calculations can use that
  #                 information with the existing log file to calculate a progress percent.
  #   phase_weight: These are the weight to assign to each phase in the progress calculations. Typically, Phase 1 and 3
  #                 are the longest phases so they will hold more weight than the others.
  phase1_line_end: 801
  phase2_line_end: 834
  phase3_line_end: 2474
  phase4_line_end: 2620
  phase1_weight: 33.4
  phase2_weight: 20.43
  phase3_weight: 42.29
  phase4_weight: 3.88

しかしですね、例えばバケット数を64にした場合、ログの行数がだいぶずれるんです。
そんなときはこれ!
python manager.py analyze_logs
ログファイルを解析して丁度いいprogressの値を出してくれます。

progress:
  phase1_line_end: 419
  phase2_line_end: 452
  phase3_line_end: 1293
  phase4_line_end: 1375
  phase1_weight: 30.93
  phase2_weight: 16.05
  phase3_weight: 37.58
  phase4_weight: 15.44

こんな感じに書き換えるといい感じになりました。

 リモート管理が捗る?

コマンドプロンプト1つで1台のPCを管理することができるようになりました。今までリモートデスクトップでつないでコマンドプロンプトを大量にならべているのを確認して…なんてことしなくてよくなるかも!?

ということで試しにWindows10にOpenSSHサーバーを設定してteratermでアクセスしてみました。

いい感じにコンパクトになったんじゃないの!?と喜んだものの、どうやらssh接続しているとジョブの開始に失敗するようですね…

[15860] Failed to execute script chia
Traceback (most recent call last):
File "win32ctypes\pywin32\pywintypes.py", line 35, in pywin32error
File "win32ctypes\pywin32\win32cred.py", line 66, in CredRead
File "win32ctypes\core\cffi\_authentication.py", line 147, in _CredRead
File "win32ctypes\core\cffi\_util.py", line 81, in __call__
File "win32ctypes\core\cffi\_util.py", line 92, in _raise_error
OSError: [WinError 1312] 指定されたログオン セッションは存在しません。そのセッションは既に終了している可能性があります。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "chia\cmds\chia.py", line 81, in <module>
File "chia\cmds\chia.py", line 77, in main
File "click\core.py", line 829, in __call__
File "click\core.py", line 782, in main
File "click\core.py", line 1259, in invoke
File "click\core.py", line 1259, in invoke
File "click\core.py", line 1066, in invoke
File "click\core.py", line 610, in invoke
File "click\decorators.py", line 21, in new_func
File "chia\cmds\plots.py", line 135, in create_cmd
File "chia\plotting\create_plots.py", line 57, in create_plots
File "chia\plotting\create_plots.py", line 28, in get_farmer_public_key
File "chia\util\keychain.py", line 200, in get_first_private_key
File "chia\util\keychain.py", line 142, in _get_pk_and_entropy
File "keyring\core.py", line 55, in get_password
File "keyring\backends\Windows.py", line 100, in get_password
File "keyring\backends\Windows.py", line 111, in _get_password
File "win32ctypes\pywin32\win32cred.py", line 71, in CredRead
File "contextlib.py", line 130, in __exit__
File "win32ctypes\pywin32\pywintypes.py", line 37, in pywin32error
win32ctypes.pywin32.pywintypes.error: (1312, 'CredRead', '指定されたログオン セッションは存在しません。そのセッションは既に終了している可能性があります。')

もしこのエラーの回避方法を知っている方がいらっしゃいましたらアドバイスいただけると嬉しいです。

 終わりに

Swar Chia Plot Managerは導入めんどくさいけど、とても便利でした。いままで手動でやっていた並列フェーズ1ずらしも自動でやってくれます。フェーズ1を実行する数も指定できるのが便利すぎる予感がしています。

Pythonなにそれ!?って人でもなんとかなるくらいを想定して詳しく書いてみました。もし参考になれば幸いです。詳しい人がみたら間違いだらけかもしれませんが、やばいところあったらご指摘いただければと思います。