アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

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設定もオフにする必要がある。

上記のように設定する。

プライベートネットワークへの接続として設定していた場合はたぶん問題ない。僕の場合は、パブリックネットワークとして設定していたのでここをオフにする必要があった。

気づいたら当たり前だけど、気づくまで時間かかったので備忘録として残しておく。

Windows 11 + RTX2080TiでのDeepLearning環境メモ

nvidia driverを最新版にしたり、cuDNNの公開鍵が無効になったため、cudaを入れなおしたりなどしていたらpytorchからGPUが認識できなくなってしまった(泣


環境を再構築したので、cudaやdriver versionなどをメモとして残しておく。
cudaとNvidiaのdriver及び、GPUのシリーズなどでバージョンをそろえないといけないらしいので、そのあたりでよくわからなくて困ってる人の助けになれば。。。

pystyle.info


ということで、自分は以下の環境、バージョンでpytorchがGPUを認識できています。

  • OS
  • WSL2 + Ubuntu
  • nvidia-smi結果
  • conda info
  • pytorch関連バージョン
  • 環境構築方法
    • cuda 11.7.1
    • Anaconda
    • pytorch
続きを読む

Windowsで回線速度を定期的に測定する

最近はネットワークやルータ周りにも興味が出てきて勉強中。

勉強のためにルータを直接いじりたいけど、業務用は少し高いのでASUSのルータ RT-AX3000を購入したところ、これはtransixに対応していないのでPPPoEで接続するように変更した。
PPPoEだと速度が遅いという噂はよくみているので、実際にどの程度速度が変わるのか測定するために、定期的に回線速度を計測する環境をWindowsで構築してみた。

Linux環境ならこのような定期計測の環境を構築する方法は簡単に思いつくのだが、Windowsではやったことがないので、何気に苦労した。同じように悩んでいる人&未来の自分のために構築した内容をブログに整理しておく。

  • 回線速度計測に使うツール
  • batファイルの中身
  • タスクスケジューラの設定
  • 計測結果
続きを読む

BlockのgasLimitとgasUsedの関係とマイナーの戦略

www.youtube.com

僕もよく拝見している、やさしいDeFiチャンネルの「やさしいEthereumガスの解説&きびしいEIP1559猛勉強」の動画内でこんな疑問があがっていた。「マイナーはUsedGasを見てBlockに含めるTransactionを決定しているのか?」この辺りは自分も明確に調べたことがなかったので、今一度整理し直してみる。動画のなかで、自分の投稿をネタにしてもらえたのでそのお礼記事でもある。

今回は、仕様(YellowPaper)、実装、実データの3点から整理してみた。

  • 結論
  • 仕様
  • 実装
  • 実データ
  • 補足:マイナーのtransaction選別戦略について

結論

結論だけ先に述べる。

  • Minerの戦略としては基本的に priorityFeePerGas でTransactionを選別していると思われる。MEVも積極的に考慮してると思われる。
  • Ethereumの使用上、BlockのgasLimitのチェックはTransactionで実際に消費されたgas量がlimitを越えなければよい。つまりtransactionのgasUsedの総合計 < block.gasLimitとなる。
    • ただし、transaction実行前には、transactionのgasLimitを現在消費したgasUsedの合計と加算したときにblock.gasLimitを超えないかをチェックしているので、transactionのgasLimitは小さいほうがよりブロックに取り込まれやすいといえる。

block.gasLimitはtx.gasLimitの総計が超えないようにしてるのかとずっと勘違いしていた。この点は今回の調査をもって訂正する。

続きを読む

cudaのGPG Keyが無効になってたので綺麗?に削除してみた

久々にMyPCで機械学習を動かそうとしたら、cuda周りでエラーが発生した。nvidiaのドライバーも新しくしたので、入れなおそうと思ってupdateしたけど、GPG key周りでエラーが発生してうまくアップデートができなかった。

なので、まずは古いcuda関連のライブラリを削除してみた。Ubuntuとapt周りは詳しくないけど、エラーは出なくなったので手順を残しておく。

  • 環境
  • 発生したエラー
  • cudaを綺麗に削除する
続きを読む

Attestation

今回はBeaconChainのAttestationについて学んだことを整理するために記事にする。
なお、Attestationの仕様については基本的に以下の公式のspecを参照した。
github.com

  • 基礎知識
  • Attestationとは
    • Attestationの構造
    • AttestationDataの構造
    • Attestationが有効とみなされる条件
    • Attestationの集約(Aggregation)
  • Attestationに対する報酬とペナルティ
  • LMDとFFGの判定タイミング
  • Attestationのslashing条件
  • 疑問点
    • LMDの重みがリアルタイムと過去とで異なる
    • Block Proposerがblockを提案しなかったら、attestorの報酬は減ってしまうのか?
  • 参考
続きを読む