Jetson Nano で挑戦するGPUマイニング（Ethereum失敗編）

# 1. はじめに
- Jetson NanoのGPUは、GPUマイニングに利用できるのか？を検証するため、Jetson NanoのGPUによるEthereum（イーサリアム）のGPUマイニングに挑戦しました。
- 先に結果をお伝えすると、ethminerのビルド、ethminerのベンチマーク実行までは問題なく動作しますが、マイニングプールを利用した本番マイニングでは実行時にOSダウンし、マイニングに失敗しました。

- 今回は、残念ながら失敗記事となりますが、自分自身への備忘録を兼ねて、Jetson Nanoで挑戦するGPUマイニングの内容を、お伝えしたいと思います。
- もし改善策をご存知の方がいらっしゃいましたら、コメント頂けると幸いです。

# 2. この記事を読んでできること
- Jetson NanoでGPUマイニングする手順の参考を得ることができる。（ただし、結果動きません。）

# 3. 必要なもの
- Jetson Nano
- SDカード（なるべく速いもの A1）
- インターネット環境
- パソコン（Windows10など）
- sshクライアントソフト（[TeraTerm](https://ja.osdn.net/projects/ttssh2/releases/)）

# 4. Jetson Nano Developer Kitのセットアップ
- 公式の[Jetson Download Center](https://developer.nvidia.com/embedded/downloads)から、Jetson Nano Developer Kitイメージを入手し、Jetson Nanoのセットアップ（アカウント作成）まで済ませておきます。
- 最近は、JetPack なる新たなイメージも登場しているようですので、おもむきに合わせてお選ぶのもよいでしょう。

参考：この記事作成時のファイルバージョン：nv-jetson-nano-sd-card-image-r32.2.3.zip

# 5. 下準備
- 下準備として、Jetson Nanoのもろもろセットアップを済ませておきます。
- Jetson Nanoにディスプレイ、キーボードおよびマウスを接続し、ターミナル（端末）を起動し、コマンド実行をおこないます。

```plaintext:コマンドプロンプト
// terminalの起動
Ctrl + Alt + T

// IPv4アドレスの確認
$ ifconfig

// IPv6無効化
$ sudo vi /etc/sysctl.conf

# 最終行にIPv6無効化を追記する
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

// ホスト名アクセス（ホスト名.local）の有効化
$ sudo apt install avahi-daemon

// OS再起動
$ sudo shutdown -r now

// 上記コマンド実行後は、sshクライアントから接続できると思います
- sshクライアントを利用しssh接続
- IPアドレス または ホスト名.local を利用

// リポジトリ一覧の更新
$ sudo apt update

// パッケージのアップグレード
$ sudo apt upgrade

// cmakeのインストール
$ sudo apt install git cmake

// pip3のインストール
$ sudo apt install python3-pip

// jetson-statsのインストール
$ sudo -H pip3 install jetson-stats

// 環境変数PATHへの追記
$ export PATH=${PATH}:/usr/local/cuda/bin

// swapfileの作成
$ sudo dd if=/dev/zero of=/var/swapfile bs=1024 count=$((6*1024*1024))

// root以外からのアクセスを禁止
$ sudo chmod 600 /var/swapfile

// swapの作成
$ sudo mkswap /var/swapfile

// swapの有効化
$ sudo swapon /var/swapfile

// swapサイズの確認
$ free
```

# 6. ethminerのセットアップ
- 以下のコマンドを実行し、ethminerをセットアップします。

```plaintext:コマンドプロンプト
// ディレクトリ移動
$ cd /opt/

// ethminerのダウンロード
$ sudo git clone --recursive https://github.com/ethereum-mining/ethminer.git

// ディレクトリ移動
$ cd /opt/ethminer

// ディレクトリ作成
$ sudo mkdir build

// ディレクトリ移動
$ cd /opt/ethminer/build/

// メイク（ビルド）・・・60分程度かかるかと思います
$ sudo cmake .. -DETHASHCUDA=ON -DETHASHCL=OFF

$ sudo cmake --build .

$ sudo make install

// バージョン確認
$ ethminer -V
```

# 7. ethminerの使い方確認
- ヘルプなどの参照情報を確認します。
- 合わせて以下のGitHubサイトも確認しておきましょう。
- 参考：[GitHub ethminer](https://github.com/ethereum-mining/ethminer)

```plaintext:コマンドプロンプト
// ヘルプの確認
$ ethminer --help

// 利用方法の確認
$ ethminer --help-ext con

    Example 1: -P getwork://127.0.0.1:8545
    Example 2: -P stratums://0x012345678901234567890234567890123.miner1@ethermine.org:5555
    Example 3: -P stratum://0x012345678901234567890234567890123.miner1@nanopool.org:9999/john.doe%40gmail.com
    Example 4: -P stratum://0x012345678901234567890234567890123@nanopool.org:9999/miner1/john.doe%40gmail.com
```

# 8. ベンチマークテスト
- マイニングプールを利用してのマイニングを開始する前に、ベンチマークを実行し動作検証をおこないます。
- ベンチマークスコア上は、370.0 Kh程度のスコアがでることがわかります。

```plaintext:コマンドプロンプト
// デバイスの確認
# ethminer -U --list-devices

// GPU使用状況の確認（jetson-stats）
sudo jtop

// ベンチマーク確認
ethminer -U -M 1

ethminer 0.19.0-alpha.0-2+commit.782292d1
Build: linux/release/gnu

 i 13:43:13 ethminer Selected pool localhost:0
 i 13:43:13 ethminer Established connection to localhost:0
 i 13:43:13 ethminer Spinning up miners...
cu 13:43:13 cuda-0   Using Pci Id : 00:00.0 NVIDIA Tegra X1 (Compute 5.3) Memory : 3.86 GB
 i 13:43:13 sim      Epoch : 0 Difficulty : 4.29 Gh
 i 13:43:13 sim      Job: bc72c8ac… block 1 localhost:0
cu 13:43:14 cuda-0   Generating DAG + Light : 1.02 GB
 m 13:43:18 ethminer 0:00 A0 0.00 h - cu0 0.00
 m 13:43:23 ethminer 0:00 A0 0.00 h - cu0 0.00
cu 13:44:25 cuda-0   Generated DAG + Light in 70,993 ms. 2.85 GB left.
 m 13:44:28 ethminer 0:01 A0 0.00 h - cu0 0.00
 m 13:44:33 ethminer 0:01 A0 26.89 Kh - cu0 26.89
 m 13:44:38 ethminer 0:01 A0 376.92 Kh - cu0 376.92
 m 13:44:43 ethminer 0:01 A0 376.67 Kh - cu0 376.67
 m 13:44:48 ethminer 0:01 A0 376.80 Kh - cu0 376.80
```

# 9. マイニングの実行
- 私の検証環境では、何が悪かったのか、実行直後にOSダウン＆再起動となり、マイニングは失敗しました。（残念）
- ※ウォレットアドレスおよびマイニングプール先は、ご自身環境に合わせて実行してみてください。
- 以下のコマンドは、マイニングプールに、[Nanopool](https://eth.nanopool.org/)を用いた場合の例となります。

- 参考：[マイニングプール記述例](https://github.com/ethereum-mining/ethminer/blob/master/docs/POOL_EXAMPLES_ETH.md)
- 参考：[Nanopool](https://eth.nanopool.org/)

```plaintext:コマンドプロンプト
// マイニング実行（ただし失敗します）
$ ethminer -P stratum1+tcp://0x925524bcff3616709e39d1cedd6516617ba83635.JetsonNano@eth-asia1.nanopool.org:9999

※ -P stratum1+tcp://ETH_WALLET.WORKERNAME@eth-asia1.nanopool.org:9999

// マイニング実行（-M 1 オプションをつけるとマイニング開始されるとの情報がありました、ただし 4.20 GB 以上のメモリがないとGPUサスペンドするとの情報をいただきました）
$ ethminer -M 1 -P stratum1+tcp://0x925524bcff3616709e39d1cedd6516617ba83635.JetsonNano@eth-asia1.nanopool.org:9999

```

# 10. おわりに
いかがでしたでしょうか？残念ですがJetson NanoでGPUマイニングに成功することができませんでした。うまくいかなかった要因をご存知の方がいらっしゃいましたら、ぜひ、コメントをお願いします。
今回の記事が、みなさまの学習の参考になれば幸いです。

2019/12/15 TAKAHIRO NISHIZONO