ヅカの芸名を自動生成するAIを作る(6)：GPT-2編(2)

# これまでのあらすじ

前回は[こちら](https://qiita.com/muto-jo/items/8b03535dec536c68c99e)

GPT-2を用いた宝塚の芸名の自動生成を試みるのに、GPT-2の導入と、ファインチューニング用の学習データの生成まで行なった。
が、いざファインチューニング用のスクリプトを走らせたところエラーが出たところまで。

今回は、エラー対応しながらファインチューニングを実行させるところまでを記載する。

# エラーその１ 必要なライブラリが足りてない

これは既に解消してしまったので、実際のエラーメッセージは既にないが、Pythonライブラリのevaluateが見つからないとエラーが出た。
これの対応はシンプルで足りないライブラリをAnaconda Navigatorかpipで入れるだけである。

が、他に足りないライブラリがある可能性もあったため、requirements.txtに記載のあるものをそのバージョン指定に従って入れた。

requirements.txtは下記にある。
transformers/examples/pytorch/language-modeling/requirements.txt

```
accelerate
torch >= 1.3
datasets >= 1.8.0
sentencepiece != 0.1.92
protobuf
evaluate
```

これでライブラリがない類のエラーは解消した。

# その2 ImportError: cannot import name 'send_example_telemetry'

以下、エラー全文

```Shell
Traceback (most recent call last):
  File "/Users/username/Study/ai_study/fine_tuning/./transformers/examples/pytorch/language-modeling/run_clm.py", line 52, in <module>
    from transformers.utils import check_min_version, send_example_telemetry
ImportError: cannot import name 'send_example_telemetry' from 'transformers.utils' (/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/transformers/utils/__init__.py)
```

transformes.utilsに含まれるsend_example_telemetryがないと。
直感ではあったが、[前回記事の環境構築](https://qiita.com/muto-jo/items/8b03535dec536c68c99e#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の際、transformersをanacondaのリポジトリから入れており、それが悪さをしているかと推測した。

参考にした記事では、`!pip install git+https://github.com/huggingface/transformers` で入れたと書いてあり、重要なライブラリのインストール手順が違う。

そのためtransformersを一度削除し、ソースコードから入れ直す。

Anaconda Navigatorからインストールしているので、そこからtransformersを消す。

1. Anaconda Navigatorを起動し、左のメニューバーからEnviromentsを選択
1. GPT-2試す用の環境を選択
1. パッケージの一覧で、Installedを選び、右上のテキストボックスに「transoformers」を入力
1. 緑色のチェックをクリックするとメニューが開くので、「Mark for removal」を選択し、Apply
1. 依存するパッケージに変更や削除をするが良いかと聞かれるので、Yesをして実行
1. 少し時間がかかるが消える

改めて仮想環境の一覧で右三角のアイコンをクリックして、「Open terminal」でターミナルを開く。

```Shell
pip install git+https://github.com/huggingface/transformers
```

を実行する。
つらつらパッケージのダウンロードやらインストールの進捗が出たところで、インストールのエラーが出る。

```Shell
Successfully built transformers
Installing collected packages: tokenizers, urllib3, tqdm, regex, pyyaml, numpy, idna, filelock, charset-normalizer, requests, transformers
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
accelerate 0.12.0 requires torch>=1.4.0, which is not installed.
Successfully installed charset-normalizer-2.1.1 filelock-3.8.0 idna-3.4 numpy-1.23.3 pyyaml-6.0 regex-2022.9.13 requests-2.28.1 tokenizers-0.12.1 tqdm-4.64.1 transformers-4.23.0.dev0 urllib3-1.26.12
```

accelerate 0.12.0には、torch1.4.0以上が必要だがインストールされてないとのこと。

pytorchは入っていたはずだが、transformersと一緒に消えてしまったらしい。accelerateはAnaconda Navigatorから0.12.0を入れているが、これではダメなのだろうか。

Anaconda Navigatorでpytorchをインストールし、再度transformersをインストール。
今度はうまく行った。

# その3 ImportError: cannot import name 'ReduceOp' from 'torch.distributed'

再びファインチューニングのコマンドを実行するが、エラー。

```Shell
python ./transformers/examples/pytorch/language-modeling/run_clm.py --model_name_or_path=rinna/japanese-gpt2-medium --train_file=./actress_datasets.txt --validation_file=./actress_datasets.txt --do_train --do_eval --num_train_epochs=10 --save_steps=1000 --save_total_limit=3 --per_device_train_batch_size=1 --per_device_eval_batch_size=1 --output_dir=./fine_tuned_model --use_fast_tokenizer=False
Traceback (most recent call last):
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/transformers/utils/import_utils.py", line 1035, in _get_module
    return importlib.import_module("." + module_name, self.__name__)
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/transformers/modeling_utils.py", line 75, in <module>
    from accelerate import __version__ as accelerate_version
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/accelerate/__init__.py", line 7, in <module>
    from .accelerator import Accelerator
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/accelerate/accelerator.py", line 27, in <module>
    from .checkpointing import load_accelerator_state, load_custom_state, save_accelerator_state, save_custom_state
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/accelerate/checkpointing.py", line 24, in <module>
    from .utils import (
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/accelerate/utils/__init__.py", line 60, in <module>
    from .operations import (
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/accelerate/utils/operations.py", line 24, in <module>
    from torch.distributed import ReduceOp
ImportError: cannot import name 'ReduceOp' from 'torch.distributed' (/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/torch/distributed/__init__.py)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/username/Study/ai_study/fine_tuning/./transformers/examples/pytorch/language-modeling/run_clm.py", line 35, in <module>
    import evaluate
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/evaluate/__init__.py", line 29, in <module>
    from .evaluator import (
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/evaluate/evaluator/__init__.py", line 29, in <module>
    from .question_answering import QuestionAnsweringEvaluator
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/evaluate/evaluator/question_answering.py", line 22, in <module>
    from transformers import Pipeline, PreTrainedModel, PreTrainedTokenizer, TFPreTrainedModel
  File "<frozen importlib._bootstrap>", line 1055, in _handle_fromlist
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/transformers/utils/import_utils.py", line 1025, in __getattr__
    module = self._get_module(self._class_to_module[name])
  File "/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/transformers/utils/import_utils.py", line 1037, in _get_module
    raise RuntimeError(
RuntimeError: Failed to import transformers.modeling_utils because of the following error (look up to see its traceback):
cannot import name 'ReduceOp' from 'torch.distributed' (/Users/username/.pyenv/versions/anaconda3-2021.11/envs/gpt2/lib/python3.9/site-packages/torch/distributed/__init__.py)
```

どうにも原因と解決方がわからなかった(ソースを見てもググってもReduceOpの正体がはっきりしない)ので、ライブラリを入れたり消したり、入れ方も当初間違っていたりと、諸々汚い環境になっていたので、仮想環境を構築し直してそれでもエラーが出るかを確認する。
(仮想環境構築の問題なのか、それ以外の問題なのかの切り分けの意味もある)

仮想環境を削除して、下記の記事にあった手順で環境を再セットアップ。
どのパッケージをAnacondaで入れたのかpipで入れたのかが混乱しないよう、今回はpipに統一した。

https://note.com/npaka/n/n8a435f0c8f69

```Shell
pip install -e transformers
pip install datasets
pip install sentencepiece
```

* datasets 2.4.0
* sentencepiece 0.1.97
* transformers 4.22.0.dev0 //git cloneしたソースコードからインストールされている
* tokenizers 0.12.1 //これは依存関係で入ったようだ。重要ライブラリなのでバージョンを記載しておく

空の仮想環境なので、下記のパッケージも別途インストールする。
正しくいうと上のパッケージのみインストールしてファインチューニングしたら、パッケージがないなど色々怒られた。
そのため怒られる→パッケージインストール(以下、ループ)を繰り返していた。

この3つはrequirements.txtにあるので、evaluateがないと怒られた時にインストール。

* evaluate 0.2.2
* accelerate 0.12.0
* protobuf 4.21.6

下記はある程度動いた後にエラーとして出てきた。
torchは調べるのに少し苦労したが、どちらもインストールして対応。

* torch 1.12.1
  * run_clm.py L.65 `MODEL_CONFIG_CLASSES = list(MODEL_FOR_CAUSAL_LM_MAPPING.keys())`でエラーになる
  * MODEL_FOR_CASUAL_LM_MAPPINGがNoneTypeのため、keys()がないと言われる
  * StackOverflowに未解決だが同様のissueが出ており、そこにtorchが入ってないのでは？とあったので入れたら解決した
* sklearn 1.1.2
  * 一見動いた風に見えたが、学習に入る前にエラーで止まった。
  * エラーメッセージの最後にsklearnをインストールしろと出てきた

# 実行できているらしい

本記事を書きながら環境のセットアップと実行（の試行）を繰り返していたが、現在は下記のような出力があり、プログレスも動いているので、無事実行できているようだ。

```Shell
[INFO|trainer.py:1628] 2022-09-20 23:57:23,124 >> ***** Running training *****
[INFO|trainer.py:1629] 2022-09-20 23:57:23,124 >>   Num examples = 24
[INFO|trainer.py:1630] 2022-09-20 23:57:23,124 >>   Num Epochs = 10
[INFO|trainer.py:1631] 2022-09-20 23:57:23,124 >>   Instantaneous batch size per device = 1
[INFO|trainer.py:1632] 2022-09-20 23:57:23,124 >>   Total train batch size (w. parallel, distributed & accumulation) = 1
[INFO|trainer.py:1633] 2022-09-20 23:57:23,124 >>   Gradient Accumulation steps = 1
[INFO|trainer.py:1634] 2022-09-20 23:57:23,125 >>   Total optimization steps = 240
  2%|▋                                       | 4/240 [08:34<8:32:40, 130.34s/it]
```

しかし、8:32:40かかるようだ…

ファインチューニングの結果（うまく行ったか失敗したか）と、（うまく行っていれば）GPT-2での自動生成は[次回記事](https://qiita.com/muto-jo/items/01f8ff976ced4cb986f0)とする。