HuggingFace Transformers 4.29 : Tutorials : スクリプトによる訓練

HuggingFace Transformers 4.29 : Tutorials : スクリプトによる訓練 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/07/2023 (v4.29.1)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

HuggingFace Transformers 4.29 : Tutorials : スクリプトによる訓練

🤗 Transformers ノートブック と併せて、PyTorch, TensorFlow, or JAX/Flax によりタスクに対するモデルを訓練する方法を実演するサンプルスクリプトもあります。

また、研究プロジェクト で使用したスクリプトと殆どコミュニティが貢献した レガシーサンプル もあります。これらのスクリプトは積極的には保守されておらず、ライブラリの最新バージョンとは多くの場合非互換な傾向にある 🤗 Transformers の特定のバージョンを必要とします。

サンプルプログラムはすべての問題でそのまま動作することは想定されておらず、スクリプトを解こうとしている問題に適応させる必要があるかもしれません。これを手助けするために、殆どのスクリプトはデータが前処理された方法を完全に公開し、貴方のユースケースに必要なようにそれを編集することを可能にしています。

サンプルスクリプトで実装したいどのような機能についても、Pull Request を提出する前にそれを フォーラムissue で議論してください。バグ修正は歓迎する一方で、可読性を犠牲にしてより多くの機能を追加する Pull Request をマージする可能性は低いです。

このガイドはサンプルの要約訓練スクリプトを PyTorchTensorFlow で実行する方法を実演します。すべてのサンプルは特に指定がなければ両方のフレームワークで動作することが想定されています。

 

セットアップ

最新版のサンプルスクリプトを成功的に実行するため、新しい仮想環境で 🤗 Transformers をソースからインストールする必要があります :

git clone https://github.com/huggingface/transformers
cd transformers
pip install .

(訳注 : サンプルスクリプトの古いバージョンの使用方法については 原文 参照)

After you’ve setup the correct library version, navigate to the example folder of your choice and install the example specific requirements:

pip install -r requirements.txt

 

スクリプトの実行

このサンプルスクリプトは 🤗 Datasets ライブラリからデータセットをダウンロードして前処理します。それからスクリプトは要約をサポートするアーキテクチャ上で Trainer によりデータセットを微調整します。以下の例は T5-smallCNN/DailyMail データセットで微調整をする方法を示しています。T5 モデルはそれが訓練された方法に従って追加の source_prefix 引数を必要とします。このプロンプトは T5 にこれが要約タスクであることを知らせます。

python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

 

このサンプルスクリプトは 🤗 Datasets ライブラリからデータセットをダウンロードして前処理します。それからスクリプトは要約をサポートするアーキテクチャ上で Keras を使用してデータセットを微調整します。以下の例は T5-smallCNN/DailyMail データセットで微調整をする方法を示しています。T5 モデルはそれが訓練された方法に従って追加の source_prefix 引数を必要とします。このプロンプトは T5 にこれが要約タスクであることを知らせます。

python examples/tensorflow/summarization/run_summarization.py  \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --output_dir /tmp/tst-summarization  \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 16 \
    --num_train_epochs 3 \
    --do_train \
    --do_eval

 

分散訓練と混合精度

Trainer は分散訓練と混合精度をサポートします、つまりそれをスクリプト内でも使用できます。これらの機能の両方を有効にするには :

  • fp16 引数を追加して混合精度を有効にします。
  • nproc_per_node 引数により使用する GPU 数を設定します。
python -m torch.distributed.launch \
    --nproc_per_node 8 pytorch/summarization/run_summarization.py \
    --fp16 \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

TensorFlow スクリプトは分散訓練用の MirroredStrategy を使用し、訓練スクリプトに追加の引数を追加する必要はありません。TensorFlow スクリプトは利用可能であれば複数の GPU をデフォルトで使用します。

 

スクリプトを TPU で実行

テンソル処理ユニット (TPU, Tensor Processing Units) はパフォーマンスを加速するために特別に設計されています。PyTorch は XLA 深層学習コンパイラ (詳細は こちら を参照) により TPU をサポートしています。TPU を使用するには、xla_spawn.py スクリプトを起動して、num_cores 引数を使用して利用したい TPU コア数を設定します。

python xla_spawn.py --num_cores 8 \
    summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

 

テンソル処理ユニット (TPU, Tensor Processing Units) はパフォーマンスを加速するために特別に設計されています。TensorFlow スクリプトは TPU 上の訓練用に TPUStrategy を利用しています。TPU を使用するには TPU リソースの名前を tpu 引数に渡します。

python run_summarization.py  \
    --tpu name_of_tpu_resource \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --output_dir /tmp/tst-summarization  \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 16 \
    --num_train_epochs 3 \
    --do_train \
    --do_eval

 

🤗 Accelerate でスクリプトを実行

🤗 Accelerate は PyTorch 専用ライブラリで、PyTorch 訓練ループへの完全な可視性を維持しながら、数種類のセットアップ (CPU-only, マルチ GPU, TPU) でモデルを訓練するための統一された手法を提供します。もしまだならば 🤗 Accelerate を確実にインストールしてください :

Note: As Accelerate is rapidly developing, the git version of accelerate must be installed to run the scripts

pip install git+https://github.com/huggingface/accelerate

run_summarization スクリプトを実行する代わりに、run_summarization_no_trainer.py スクリプトを使用する必要があります。🤗 Accelerate がサポートするスクリプトはフォルダに task_no_trainer を含みます。configuration ファイルを作成してセーブする次のコマンドを実行することから始めます :

accelerate config

Test your setup to make sure it is configured correctly:

accelerate test

Now you are ready to launch the training:

accelerate launch run_summarization_no_trainer.py \
    --model_name_or_path t5-small \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir ~/tmp/tst-summarization

 

カスタムデータセットの使用

要約 (用) スクリプトはカスタムデータセットが CSV か JSON Line ファイルである限りサポートします。貴方自身のデータセットを使用するとき、幾つかの追加引数を指定する必要があります :

  • train_file と validation_file は貴方の訓練と検証用ファイルへのパスを指定します。
  • text_column は要約する入力テキストです。
  • summary_column は出力するターゲットテキストです。

カスタムデータセットを使用する要約用スクリプトはこのようなものです :

python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --train_file path_to_csv_or_jsonlines_file \
    --validation_file path_to_csv_or_jsonlines_file \
    --text_column text_column_name \
    --summary_column summary_column_name \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --overwrite_output_dir \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --predict_with_generate

 

スクリプトのテスト

完結するに数時間がかかるかもしれない、データセット全体にコミットする前に想定するようにすべてが動作することを確認するために、スクリプトをデータセットサンプルの小さい数で実行するのは良い考えである場合が多いです。データセットをサンプルの最大数に切り捨てるために以下の引数を使用します :

  • max_train_samples
  • max_eval_samples
  • max_predict_samples
python examples/pytorch/summarization/run_summarization.py \
    --model_name_or_path t5-small \
    --max_train_samples 50 \
    --max_eval_samples 50 \
    --max_predict_samples 50 \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

すべてのサンプルスクリプトが max_predict_samples 引数をサポートはしていません。スクリプトがこの引数をサポートしているか分からない場合は、確認のために -h 引数を追加してください :

examples/pytorch/summarization/run_summarization.py -h

 

チェックポイントから訓練を再開する

有効にするべきもう一つの役立つオプションは前のチェックポイントから訓練を再開するものです。これは、訓練が中断された場合、やり直すことなく中断したところから再開できることを確実にします。チェックポイントから訓練を再開するには 2 つの手法があります。

最初の方法は output_dir previous_output_dir 引数を使用して output_dir にストアされた最新チェックポイントから訓練を再開します。この場合、overwrite_output_dir は取り除くべきです :

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --output_dir previous_output_dir \
    --predict_with_generate

2 番目の方法は resume_from_checkpoint path_to_specific_checkpoint 引数を使用して特定のチェックポイント・フォルダから訓練を再開します。

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --resume_from_checkpoint path_to_specific_checkpoint \
    --predict_with_generate

 

モデルを共有する

すべてのスクリプトは貴方の最終的なモデルを モデルハブ にアップロードすることができます。始める前に Hugging Face にログインしていることを確認してください :

huggingface-cli login

そしてスクリプトに push_to_hub 引数を追加します。この引数は貴方の Hugging Face ユーザ名と output_dir で指定されたフォルダ名を使用してレポジトリを作成します。

リポジトリに特定の名前を与えるには、それを追加するために push_to_hub_model_id 引数を使用します。レポジトリは貴方の名前空間に自動的にリストアップされます。

以下のサンプルはモデルを特定のレポジトリ名でアップロードする方法を示します :

python examples/pytorch/summarization/run_summarization.py
    --model_name_or_path t5-small \
    --do_train \
    --do_eval \
    --dataset_name cnn_dailymail \
    --dataset_config "3.0.0" \
    --source_prefix "summarize: " \
    --push_to_hub \
    --push_to_hub_model_id finetuned-t5-cnn_dailymail \
    --output_dir /tmp/tst-summarization \
    --per_device_train_batch_size=4 \
    --per_device_eval_batch_size=4 \
    --overwrite_output_dir \
    --predict_with_generate

 

以上