SSZのMerkleization
前回に引き続きSSZ(Simple Serialize)について解説する。今回はSSZのMerkleizationについてまとめる。
前回の記事はこちら。
y-nakajo.hatenablog.com
Merkleizationについては、引き続きSSZの仕様を参考にした。
github.com
概要
Eth1.0ではPatricia Merkle Trieを採用していたが、sszではよりシンプルにするために、Binary Merkle Treeを採用した。
さらにhashアルゴリズムもより汎用性を高めるためにkeccak256ではなく、広く利用されているsha256を採用した。
また、SSZではSchema構造を維持したままMerkleizeされる。これにより、Schemaの一部のデータのみをProofと共に共有することが可能となっている。
例えば次に示すDepositDataスキーマをMerkleizeする場合は、下図のtreeが構成され、root hashが求まる。
class DepositData(Container): pubkey: BLSPubkey # (= Bytes48) withdrawal_credentials: Bytes32 amount: Gwei # (= Uint64) signature: BLSSignature # Signing over DepositMessage (= Bytes96)
以降、Merkleization方法の各ステップを詳しく解説する。
SSZ - Simple Serialize
本記事では、現在のConsensus-Layer(旧Beacon Chain)で採用されているシリアル化アルゴリズムのSimple Serialize、通称sszについてまとめる。
sszについてまとめるにあたり、以下のサイトを参考にした。
github.com
ethereum.org
eth2book.info
- 導入の理由
- sszで定義されている型
- 基本型(basic type)
- 複合型(composite type)
- Container
- Vector
- List
- Bitvector
- Bitlist
- Union
- alias
- 初期値(Default Value)
- Serialization
- fixed size と variable size
- basic serialization
- 具体例
- IndexedAttestationの定義
- serializeするインスタンス
- 詳細説明
- Decode方法
- 参照実装
Validatorのリワード計算方法
Validatorの報酬の計算方法は以下のページに整理されているが、これはPhaase0の計算式である。
kb.beaconcha.in
Consensus-LayerはAltairとBellatrixの2回のアップデートが加えられており、現在のValidatorの報酬計算式は変更されている。詳しくは以下のページまとめられているが、自分なりにも整理する。
pintail.xyz
なお、ここではConsensu Layerの報酬の計算方法のみを記載している。The Merge後はこれにプラスしてexecution-layerの手数料報酬も得られる。
- 計算式の変更理由
- phase0の計算方法
- base reward
- reward and penarty
- Altairの計算方法
- base rewardとsync reward
- reward and penarty
- 実例
- 参考
2022年12月Ethereum Mainnetの同期について
先ほどEthereum Mainnetの同期が完了したので、同期に必要なシステム要件と掛かった時間を記録として残す。
なお、同期に必要となる時間はネットワーク状況や、接続したpeerによって大幅に前後することに注意。また、今回同期に用いたマシンは個人利用PCであり、並行して各種プログラムも稼働中であったことを追記しておく。
結果だけ先に記すと、execution layerの同期が完全に完了するまでにおおよそ6日ほど要した。
- PCスペック
- node clients
- execution layer
- consensus layer
- 実行コマンド
- execution layer
- consensus layer
- 同期ログ
- 開始時期
- Post Merge同期開始
- execution layer 同期完了
- Mainnet 同期完了時のストレージ消費量
Failed to import transformers.trainer because of the following error の解決方法
huggingfaceのtransformersを使っていたら、急に「Failed to import transformers.trainer because of the following error」というエラーが発生した。対応方法がなかなか見つからなかったので記事に残しておく。
環境
Windows 11 Home + WSL2 + Ubuntu-20.04
conda version : 22.9.0
conda-build version : 3.21.9
python version : 3.8.13.final.0
ライブラリのバージョン
pytorch-transformers 1.2.0 pypi_0 pypi
transformers 4.18.0 py38h06a4308_0
pytorch 1.12.1 py3.8_cuda11.6_cudnn8.3.2_0 pytorch
pytorch-memlab 0.2.4 pypi_0 pypi
pytorch-mutex 1.0 cuda pytorch
pytorch-transformers 1.2.0 pypi_0 pypi
torchaudio 0.12.1 py38_cu116 pytorch
torchvision 0.13.1 py38_cu116 pytorch
Stack trace
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) File ~/anaconda3/lib/python3.8/site-packages/transformers/utils/import_utils.py:1002, in _LazyModule._get_module(self, module_name) 1001 try: -> 1002 return importlib.import_module("." + module_name, self.__name__) 1003 except Exception as e: File ~/anaconda3/lib/python3.8/importlib/__init__.py:127, in import_module(name, package) 126 level += 1 --> 127 return _bootstrap._gcd_import(name[level:], package, level) File <frozen importlib._bootstrap>:1014, in _gcd_import(name, package, level) File <frozen importlib._bootstrap>:991, in _find_and_load(name, import_) File <frozen importlib._bootstrap>:975, in _find_and_load_unlocked(name, import_) File <frozen importlib._bootstrap>:671, in _load_unlocked(spec) File <frozen importlib._bootstrap_external>:843, in exec_module(self, module) File <frozen importlib._bootstrap>:219, in _call_with_frames_removed(f, *args, **kwds) File ~/anaconda3/lib/python3.8/site-packages/transformers/trainer.py:176 175 if is_datasets_available(): --> 176 import datasets 178 if is_torch_tpu_available(check_device=False): File ~/anaconda3/lib/python3.8/site-packages/datasets/__init__.py:43 41 del version ---> 43 from .arrow_dataset import Dataset 44 from .arrow_reader import ReadInstruction File ~/anaconda3/lib/python3.8/site-packages/datasets/arrow_dataset.py:62 60 from tqdm.auto import tqdm ---> 62 from . import config 63 from .arrow_reader import ArrowReader File ~/anaconda3/lib/python3.8/site-packages/datasets/config.py:41 40 # Imports ---> 41 DILL_VERSION = version.parse(importlib_metadata.version("dill")) 42 PANDAS_VERSION = version.parse(importlib_metadata.version("pandas")) File ~/anaconda3/lib/python3.8/site-packages/packaging/version.py:49, in parse(version) 48 try: ---> 49 return Version(version) 50 except InvalidVersion: File ~/anaconda3/lib/python3.8/site-packages/packaging/version.py:264, in Version.__init__(self, version) 261 def __init__(self, version: str) -> None: 262 263 # Validate the version and parse it into pieces --> 264 match = self._regex.search(version) 265 if not match: TypeError: expected string or bytes-like object The above exception was the direct cause of the following exception: RuntimeError Traceback (most recent call last) Cell In [27], line 3 1 #@title Trainerの定義 ----> 3 from transformers import Trainer 4 from transformers import TrainingArguments 5 from transformers import EarlyStoppingCallback File <frozen importlib._bootstrap>:1039, in _handle_fromlist(module, fromlist, import_, recursive) File ~/anaconda3/lib/python3.8/site-packages/transformers/utils/import_utils.py:992, in _LazyModule.__getattr__(self, name) 990 value = self._get_module(name) 991 elif name in self._class_to_module.keys(): --> 992 module = self._get_module(self._class_to_module[name]) 993 value = getattr(module, name) 994 else: File ~/anaconda3/lib/python3.8/site-packages/transformers/utils/import_utils.py:1004, in _LazyModule._get_module(self, module_name) 1002 return importlib.import_module("." + module_name, self.__name__) 1003 except Exception as e: -> 1004 raise RuntimeError( 1005 f"Failed to import {self.__name__}.{module_name} because of the following error (look up to see its" 1006 f" traceback):\n{e}" 1007 ) from e RuntimeError: Failed to import transformers.trainer because of the following error (look up to see its traceback): expected string or bytes-like object
エラー原因
以下の組み合わせだと今回のエラーが発生する。
datasets==2.6.1
dill==0.3.5.1
エラー発生個所はdatasetsの以下の部分
https://github.com/huggingface/datasets/blob/a2576b8c1664806e814d2427bf21bbef4be85456/src/datasets/config.py#L41
エラー原因はどうやらdillのバージョンがimportlib.metadata.versionで取得できないからのようだ。実際にコンソールで試してみても取得できない。
Python 3.8.13 (default, Mar 28 2022, 11:38:47) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import importlib.metadata >>> importlib.metadata.version("dill") >>>
dill==0.3.6だとversion番号が変えてくるので、dill=0.3.5.1が悪さをしている模様。なので、0.3.6にしたいところだが、実はdatasets=2.6.1がまだdill==0.3.6に対応していないため、setup.pyにdill<0.3.6の指定がある。このため、強制的にdill==0.3.5.1にダウングレードされてしまう。
解決策
dill==0.3.5をインストールしたらよいかと思ったが、どうもconda installでインストールできなかった。multiprocessが依存ライブラリとしてdill >= 0.3.6を指定しており、コンフリクトが起きるためなのかな?
最終的には、datasets=2.4.0にすることで解決できた。
なお、google colabでリモート接続の場合だとdill=0.3.5.1でも問題なく動いているので、おま環の可能性が高い。
Docker Desktop for Windowsに外部からアクセスできるようにする
Docker Desktop for WindowsでNginxを建てて、そのNginxにLAN内のほかのPCからアクセスする方法。
Windows Firewallに対して80番ポート(Nginxをホスト側の80番ポートにフォワードしてる場合だが)を開ける。
他のブログなどで書かれているのは大体ここまで。で、今回これだけだとうまくいかなくてハマった。
80番ポートを開けるだけでなく、Docker Desktop for Windowsに対してのdeny設定もオフにする必要がある。
上記のように設定する。
プライベートネットワークへの接続として設定していた場合はたぶん問題ない。僕の場合は、パブリックネットワークとして設定していたのでここをオフにする必要があった。
気づいたら当たり前だけど、気づくまで時間かかったので備忘録として残しておく。