M1でのEthereum GPUマイニング
M1 Mac miniでethminerを使用してイーサリアムのGPUマイニングをしてみました。
ハッシュレートは2.1Mhぐらいで、消費電力はサンワのワットモニターで測ると8~10Wです。2021/3/27時点では1日10円程度の利益が出る計算になります。
ethminerよりUselethMinerによるマイニングの方がハッシュレートが高いようです(2022/2/1追記)
変更履歴
- 2022/2/01 UselethMinerについて追記
- 2021/6/10 OpenCLのオプションとDAGに関して追記
- 2021/5/13 boostのURLの修正と1.76.0を使うように変更したパッチを追加
M1移植版ethminerのビルド
Yifan Gu氏によるM1移植版ethminerをブログに従ってビルドして実行します。
準備
ターミナルを起動してください。~/Downloads/以下で作業します。
$ cd ~/Downloads/
XcodeとCommand line tools for Xcodeが未インストールならばApp StoreからXcodeをインストールし、ターミナル上でCommand line tools for Xcodeをインストールしてください。
$ xcode-select --install
brewとcmakeが未インストールならbrewをインストールし、brew経由でcmakeをインストールしてください。
$ arch -arm64e /bin/bash -c "$(curl -fsSL $ https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
$ export PATH=/opt/homebrew/bin:$PATH
$ brew install cmake
ethminerのビルド
git経由でファイルを取得します。
$ git clone https://github.com/gyf304/ethminer-m1.git
$ cd ethminer-m1
$ git submodule update --init --recursive
2021/5/13追記
boostのURLが変更されているようなのでcmake/Hunter/config.cmakeを修正してください。ついでにboost-1.76.0が出ているようなので、1.75.0から1.76.0を使うようにしたパッチを用意しました。
$ curl -o ethminer-m1.patch https://gist.githubusercontent.com/asfdrwe/7537288d7e9816defb69e66468efbeb2/raw/c6d2baa0634ad3a47925983e1288d82edffab612/ethminer-m1.patch
$ patch -p1 < ethminer-m1.patch
cmakeでビルドします。NVIDIA用のCUDAとAMDのBINKERNを外す指定をしてださい。初回cmake実行時のみ依存関係で必要なものをビルドするのでそれなりに時間がかかります。
$ mkdir build
$ cd build
$ cmake .. -DETHASHCUDA=OFF -DBINKERN=OFF
ethminerをビルドして実行バイナリのあるフォルダに移動します。
$ make
$ cd ethminer
ethminer GPUマイニングの実行
そのまま実行しようとすると、2021/3/27時点ではcl2Metalにバグがあるようで、日本語環境下ではOpenCLコードのバックスラッシュを円記号として扱ってしまい、正常に動作しないようです。
...
cl 19:18:59 cl-0 OpenCL kernel
UNSUPPORTED (log once): buildComputeProgram: cl2Metal failed
X 19:19:00 cl-0 OpenCL kernel build log:
Compilation failed:
program_source:117:17: error: program scope variable must reside in constant add
ress space
const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7]
^ a[12] ^ a[17] ^ a[22], 1);¥
^
program_source:117:22: error: use of undeclared identifier 'a'
const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7]
^ a[12] ^ a[17] ^ a[22], 1);¥
^
program_source:117:29: error: use of undeclared identifier 'a'
const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7]
^ a[12] ^ a[17] ^ a[22], 1);¥
^
program_source:117:36: error: use of undeclared identifier 'a'
const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7]
^ a[12] ^ a[17] ^ a[22], 1);¥
^
...
システム環境設定の言語と地域から英語環境を入れて優先する言語を英語にして実行することもできますが、環境変数__CF_USER_TEXT_ENCODING
を英語設定にすることでも実行可能になります。
uidをidコマンドで確認し__CF_USER_TEXT_ENCODING
の内容をechoで確認してください。
uidが501(16進数で0x1F5)の場合はこうなります。
$ id
uid=501(asfdrwe) gid=20(staff) groups=20(staff),...
$ env | grep __CF_USER_TEXT_ENCODING
__CF_USER_TEXT_ENCODING=0x1F5:0x1:0xE
idが501(0x1F5)ならば__CF_USER_TEXT_ENCODING
を0x1F5:0x1:0xEから__CF_USER_TEXT_ENCODING
を0x1F5:0x0:0x0にすればcl2Metalのバグを回避できます。envコマンドを使うかexportで環境変数の値を変更してethminerを実行してください。
NiceHash poolを使用するならばこのようになります。
$ env __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0 ./ethminer -G -P stratum2+tcp://『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@daggerhashimoto.usa.nicehash.com:3353
または
$ export __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
$ ./ethminer -G -P stratum2+tcp://『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@daggerhashimoto.usa.nicehash.com:3353
他のpoolの場合のethminerのサンプルを参考にしてください。
実行例
ethminer 0.19.0+commit.5b9b7814
Build: darwin/release/appleclang
i 12:09:07 Configured pool daggerhashimoto.usa.nicehash.com:3353
i 12:09:07 Selected pool daggerhashimoto.usa.nicehash.com:3353
i 12:09:07 Stratum mode : EthereumStratum/1.0.0 (NiceHash)
i 12:09:07 Established connection to daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
i 12:09:07 Spinning up miners...
cl 12:09:07 cl-0 Using Device : Intel GPU 0.0 Apple M1 OpenCL 1.2 Memory : 5.33 GB (5726633984 B)
i 12:09:07 Extranonce set to b22872
i 12:09:07 Authorized worker xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxx
i 12:09:07 Epoch : 403 Difficulty : 848.17 Mh
i 12:09:07 Job: fa4bd3aa… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
cl 12:09:08 cl-0 Generating split DAG + Light (total): 4.15 GB
cl 12:09:08 cl-0 OpenCL kernel
cl 12:09:08 cl-0 Creating DAG buffer, size: 4.15 GB, free: 1.18 GB
cl 12:09:08 cl-0 Creating light cache buffer, size: 66.37 MB
cl 12:09:08 cl-0 Loading kernels
cl 12:09:08 cl-0 Creating buffer for header.
cl 12:09:08 cl-0 Creating mining buffer
i 12:09:10 Job: 552ccbcf… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
...
m 12:10:32 0:01 A0:R1 2.20 Mh - cl0 2.20
i 12:10:32 Job: 572392cd… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
i 12:10:36 Job: 926fd047… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
m 12:10:37 0:01 A0:R1 2.17 Mh - cl0 2.17
i 12:10:40 Job: d1be8681… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
m 12:10:42 0:01 A0:R1 2.18 Mh - cl0 2.18
i 12:10:44 Job: 33c11b8d… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
i 12:10:46 Job: dfeba6e0… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
...
うまく実行できていれば2.1Mh程度でマイニングできるはずです。また、NiceHashのmyページのmining rigのHISTORY & STATのActive workers に指定したWorker名で状況が表示されます。
実行オプション
ethminer -H cl
でOpenCL使用時のオプションがわかります。
OpenCL Extended Options :
Use this extended OpenCL arguments to fine tune the performance.
Be advised default values are best generic findings by developers
--cl-devices UINT {} Default not set
Space separated list of device indexes to use
eg --cl-devices 0 2 3
If not set all available CL devices will be used
--cl-global-work UINT Default 65536
Set the global work size multiplier
Value will be adjusted to nearest power of 2
--cl-local-work UINT {64,128,256} Default = 128
Set the local work size multiplier
--cl-nobin FLAG
Use openCL kernel. Do not load binary kernel
--cl-noexit FLAG
Don't use fast exit algorithm
現在のethminerではDAGサイズは最小4GBのようで、使用しているMac miniのメモリが8GBしかないのでそのまま実行していますが、メモリが16GBのM1 Macなら--cl-local-work 64や--cl-global-workでより大きいDAGサイズにすれば、ハッシュレートが上がるかもしれません。
--cl-local-workや--cl-global-workはOpenCLの並列度の指定です。変更してみましたがハッシュレートはほとんど同じです。ソースをいじって極端に小さくするとハッシュレートが下がります。DAGに関してもnsfminerのコードを参考にDAGの分割をやめるなど少しいじってみましたがハッシュレートが下がります(2021/6/10追記)。
まとめ
現時点(2021/3/07)では一応電気代以上に稼げるマイニングがM1 MacでのGPUマイニングで可能となっています。興味のある方は試してみてください。
参考
オリジナル版ethminerのページ