Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

collate_fn関数のエラーについて #3

Closed
hydaramasup opened this issue Feb 23, 2023 · 5 comments
Closed

collate_fn関数のエラーについて #3

hydaramasup opened this issue Feb 23, 2023 · 5 comments

Comments

@hydaramasup
Copy link

突然の質問で申し訳ありません。こちらについて試行しつつ、勉強させてていただいております。
train.pyの実行時に、下記のようなエラーが出ており、対処法に苦慮しています。
main関数内のローカルにある、collate_fn関数のエラーであることはわかるのですが、対処法をご教示いただくことは可能でしょうか。
AttributeError: Can't pickle local object 'main..collate_fn'

@hppRC
Copy link
Owner

hppRC commented Feb 23, 2023

@hydaramasup
ご参考・ご質問ありがとうございます!
実行時のコマンド・環境についてもう少しだけ教えていただけると、より具体的な解決法をご提示できそうで助かります。

したがって、以下の内容について詳細を改めてご記述いただけますでしょうか?

  • Pythonのバージョンと、各種パッケージのインストールの仕方、環境構築のやり方(PoetryかCondaかなど)
  • エラーが発生した際に実行したコマンド
  • コードの改変などしていないか、自分で修正をした部分があるかどうか
  • https://github.com/hppRC/bert-classification-tutorial/blob/main/.envrc に記述されている環境変数の設定をおこなっているか

@hydaramasup
Copy link
Author

@hppRC 早速ありがとうございます。以下共有させていただきます。

①Pythonのバージョンと、各種パッケージのインストールの仕方、環境構築のやり方(PoetryかCondaかなど)
・Pythonのバージョン:3.10.9
・パッケージのインストール:githubにご記載いただいていたパッケージ以外は入れていない状態です。
・環境構築:Anaconda で、bert-classification-tutorialの環境を構築して、以下2つを実行しています。
conda install pytorch pytorch-cuda=11.6 -c pytorch -c nvidia
pip install tqdm "transformers[ja,sentencepiece]" classopt tokenizers numpy pandas more-itertools scikit-learn scipy

・エラーが発生した際に実行したコマンド
Anaconda prompt上で、python src/train.pyの実行時に発生しています。
TRACE BACKを見ると、このような形で帰ってきています。

File "", line 1, in
Traceback (most recent call last):
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\spawn.py", line 116, in spawn_main
File "C:\Users<ユーザー名>\src\train.py", line 198, in
exitcode = _main(fd, parent_sentinel)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\spawn.py", line 126, in _main
main(args)
File "C:\Users<ユーザー名>\src\train.py", line 154, in main
self = reduction.pickle.load(from_parent)
EOFError: Ran out of input
val_metrics = {"epoch": None, **evaluate(val_dataloader)}
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\site-packages\torch\autograd\grad_mode.py", line 27, in decorate_context
return func(*args, **kwargs)
File "C:\Users<ユーザー名>\src\train.py", line 118, in evaluate
for batch in tqdm(dataloader, total=len(dataloader), dynamic_ncols=True, leave=False):
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\site-packages\tqdm\std.py", line 1195, in iter
for obj in iterable:
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\site-packages\torch\utils\data\dataloader.py", line 435, in iter
return self._get_iterator()
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\site-packages\torch\utils\data\dataloader.py", line 381, in _get_iterator
return _MultiProcessingDataLoaderIter(self)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\site-packages\torch\utils\data\dataloader.py", line 1034, in init
w.start()
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\context.py", line 336, in _Popen
return Popen(process_obj)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\popen_spawn_win32.py", line 93, in init
reduction.dump(process_obj, to_child)
File "C:\Users<ユーザー名>\anaconda3\envs\bert-classification-tutorial\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
AttributeError: Can't pickle local object 'main..collate_fn'

・コードの改変などしていないか、自分で修正をした部分があるかどうか
train.pyの中で、import src.utils as utilsが動作しなかったため、import utils as utilsとして、utils.pyを参照できる形にすることを試みています。

https://github.com/hppRC/bert-classification-tutorial/blob/main/.envrc に記述されている環境変数の設定をおこなっているか
こちらはすべて反映しています。
なお、OSはWindows 11、UbuntuによってWSLの環境も入れている状態です。

@hppRC
Copy link
Owner

hppRC commented Feb 24, 2023

@hydaramasup

こちらこそご返信ありがとうございます!
実行環境やエラーの内容を確認したところ、Windows上で訓練を実行しようとした際に発生する問題かなと推察しました。
(エラー文中にでてくるファイルパスの形式がWindowsのもので、WSLで使われているLinuxのファイルパスの形式と異なるので、コマンド自体はWSL上ではなくWindows上で行われていると考えています)

特に、Windows上でPyTorchによるマルチプロセス処理を実行しようとした場合に発生するエラーかなと思いましたので、少し調べてみたところ、以下のGitHub上のissueが参考になりました。

woven-planet/l5kit#130 (comment)

このissueでは、DataLoaderに与える num_workers 引数の値を0にすると同様の問題が解決すると書いてありました。

したがって、現時点での解決策として試していただきたいのですが、 本リポジトリの src/train.pyの94行目 (create_loader関数の内部) に記述してある num_workers = 4という設定を、num_workers = 0に変更して再度実行してみていただけないでしょうか。

よろしければ、変更後に実行した結果をご報告いただいて、もし解決していたらそれで大丈夫ですし、まだ解決していない or 新たな問題が発生していたら改めて考えさせていただきたいです。
どうぞよろしくお願いいたします🙇

@hydaramasup
Copy link
Author

@hppRC おかげさまで無事、動作することができました!ありがとうございます。
(後学のために、ここでのnum_workersの役割だけ、ご教示いただくことは可能でしょうか…?)
ローカル環境で構築しているからか、batch_sizeは10ぐらいにしないとCUDAメモリ不足になるため、オプションで工夫をしています。
何かあれば、改めてご相談させてください。どうぞよろしくお願い致します。

@hppRC
Copy link
Owner

hppRC commented Feb 25, 2023

@hydaramasup
無事動作したようでよかったです!安心しました。今回の問題はWindows上で本リポジトリのコードを実行する人はどなたでもなる可能性がある問題かなと思いましたので、のちほど README.mdtrain.py に今回の内容について追記しておこうと思います。
私も大変参考になりました、ありがとうございました!!

ちなみに、num_workers は複数のプロセスでDataLoaderを動作させるときに必要なオプションで、この num_workers の数だけ同時にプロセスがデータ(モデルに入力するバッチ)の処理を行なってくれます。詳しくは PyTorchの公式ドキュメント か、 この日本語の記事 が参考になりそうでしたので、よろしければぜひご覧ください。

batch_sizeについては、勾配累積 (Gradient Accumulation) というテクニックを使うと、ある程度限られたメモリサイズでもbatch_sizeを大きくすることができるかもしれません。詳しくは こちらの記事 が参考になりましたので、よろしければこちらも併せてご覧ください🙏
一般にbatch_sizeをある程度大きくしておくことで学習が安定することが知られており、またあくまで僕の感覚ではありますが、BERTのfine-tuning時にはbatch_sizeを8~32くらいにしておくと学習が安定する印象があります(あとbatch_sizeは2の冪乗数、つまり8とか32とか128とかに設定することが多いです)。なので、もし学習がうまくいかない場合は、勾配累積などのテクニックでbatch_sizeを大きくするなどの工夫も考えてみていただけるといいかなと思いました🙏

@hppRC hppRC closed this as completed Feb 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants