分散トレーニング:🤗 TransformersとAmazon SageMakerを使用して、要約のためにBART/T5をトレーニングする
Distributed Training Training BART/T5 for summarization using 🤗 Transformers and Amazon SageMaker.
見逃した場合: 3月25日にAmazon SageMakerとのコラボレーションを発表しました。これにより、最新の機械学習モデルを簡単に作成し、先進的なNLP機能をより速く提供できるようになりました。
SageMakerチームと協力して、🤗 Transformers最適化のDeep Learning Containersを構築しました。AWSの皆さん、ありがとうございます!🤗 🚀
SageMaker Python SDKの新しいHuggingFaceエスティメーターを使用すると、1行のコードでトレーニングを開始できます。
- Amazon SageMakerを使用して、Hugging Faceモデルを簡単にデプロイできます
- Hugging Face Transformers と Amazon SageMaker を使用して、GPT-J 6B を推論のためにデプロイします
- 学生アンバサダープログラムの応募受付が開始されました!
発表のブログ投稿では、統合に関するすべての情報、”はじめに”の例、ドキュメント、例、および機能へのリンクが提供されています。
以下に再掲します:
- 🤗 Transformers ドキュメント: Amazon SageMaker
- サンプルノートブック
- Hugging Face用のAmazon SageMakerドキュメント
- Hugging Face用のPython SDK SageMakerドキュメント
- Deep Learning Container
Amazon SageMakerについて詳しく知りたい場合は、”Amazon SageMakerは、すべての開発者とデータサイエンティストが迅速に機械学習(ML)モデルを構築、トレーニング、展開できる完全に管理されたサービスです。SageMakerは、機械学習プロセスの各ステップから負担を軽減し、高品質なモデルの開発を容易にします。” [ REF ]
新しいHugging Face DLCとAmazon SageMaker拡張機能を使用して、summarization
タスクで分散Seq2Seq-transformerモデルをトレーニングし、transformers
およびdatasets
ライブラリを使用してモデルをhuggingface.coにアップロードしてテストします。
データ並列処理にはSageMaker Data Parallelismを使用します。これはTrainer APIに組み込まれています。データ並列処理を使用するには、HuggingFace
エスティメーターでdistribution
パラメーターを定義するだけです。
# smdistributed Data Parallelでトレーニングを実行するための設定
distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
このチュートリアルでは、Amazon SageMakerノートブックインスタンスを使用してトレーニングジョブを実行します。ここで、Notebook Instanceの設定方法を学ぶことができます。
やること:
- 開発環境の設定とsagemakerのインストール
- 🤗 Transformersの
examples/
スクリプトを選択 - 分散トレーニングとハイパーパラメーターの設定
HuggingFace
エスティメーターの作成とトレーニングの開始- 微調整モデルをhuggingface.coにアップロード
- 推論のテスト
モデルとデータセット
私たちは、samsumデータセットでfacebook/bart-large-cnnを微調整します。 “BARTは、ノイズ除去をプレトレーニング目的としたシーケンス・トゥ・シーケンスモデルです。” [ REF ]
samsum
データセットには、約16,000のメッセンジャーのような会話と要約が含まれています。
{"id": "13818513",
"summary": "Amandaがクッキーを焼いて、明日はJerryに持ってくる予定です。",
"dialogue": "Amanda: クッキーを焼いたよ。食べる?\r\nJerry: もちろん!\r\nAmanda: 明日持ってくるね :-)"}
開発環境の設定とsagemakerのインストール
SageMakerノートブックインスタンスが実行されている場合、Jupyer NotebookまたはJupyterLabを選択し、conda_pytorch_p36 kernel
で新しいノートブックを作成できます。
注意: Jupyterの使用はオプションです。SDKがインストールされている場所からでもSageMakerトレーニングジョブを起動できます。クラウドへの接続と適切な権限が必要です。例えば、ラップトップ、別のIDE、またはAirflowやAWS Step Functionsのようなタスクスケジューラーなどです。
その後、必要な依存関係をインストールできます
!pip install transformers "datasets[s3]" sagemaker --upgrade
モデルのアップロードにはgit-lfs
をインストールします。
!curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
!sudo yum install git-lfs -y
!git lfs install
SageMakerでのトレーニングを実行するには、SageMakerセッションを作成し、適切な権限を持つIAMロールを提供する必要があります。このIAMロールは後でTrainingJob
にアタッチされ、たとえばAmazon S3からデータをダウンロードできるようになります。
import sagemaker
sess = sagemaker.Session()
role = sagemaker.get_execution_role()
print(f"トレーニング実行に使用されるIAMロールARN: {role}")
print(f"アーティファクトを保存するために使用されるS3バケット: {sess.default_bucket()}")
🤗 Transformersリポジトリには、language-modeling
からtoken-classification
までのタスクに対するモデルのファインチューニングのためのいくつかのexamples/
スクリプトが含まれています。この場合、私たちはseq2seq/
の例からrun_summarization.py
を使用しています。
注意: このチュートリアルをそのまま使用して、異なる例のスクリプトでモデルをトレーニングすることもできます。
HuggingFace
Estimatorには組み込みのgitサポートがあるため、entry_point
とsource_dir
としてGitHubリポジトリに保存されたトレーニングスクリプトを指定できます。
私たちはtransformers 4.4.2
DLCを使用する予定なので、v4.4.2
を互換性のある例のスクリプトを取得するためのブランチとして設定する必要があります。
#git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.4.2'} # v4.4.2 is referring to the `transformers_version you use in the estimator.
# v4.4.2はエスティメータで使用する`transformers_version`を指していますが、パッケージが欠落しているため使用されていません
git_config = {'repo': 'https://github.com/philschmid/transformers.git','branch': 'master'} # v4.4.2 is referring to the `transformers_version you use in the estimator.
分散トレーニングとハイパーパラメータの設定
次に、hyperparameters
を定義し、分散トレーニング戦略を設定します。ハイパーパラメータとして、任意のSeq2SeqTrainingArgumentsとrun_summarization.pyで定義されたハイパーパラメータを定義できます。
# トレーニングジョブに渡されるハイパーパラメータ
hyperparameters={
'per_device_train_batch_size': 4,
'per_device_eval_batch_size': 4,
'model_name_or_path':'facebook/bart-large-cnn',
'dataset_name':'samsum',
'do_train':True,
'do_predict': True,
'predict_with_generate': True,
'output_dir':'/opt/ml/model',
'num_train_epochs': 3,
'learning_rate': 5e-5,
'seed': 7,
'fp16': True,
}
# smdistributed Data Parallelでトレーニングを実行するための設定
distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
SageMaker Data Parallelismを使用しているため、total_batch_size
はper_device_train_batch_size
* n_gpus
となります。
HuggingFace
Estimatorの作成とトレーニングの開始
トレーニングの前に、HuggingFace
Estimatorを作成する最後のステップです。EstimatorはAmazon SageMakerトレーニングのエンドツーエンドを処理します。使用するファインチューニングスクリプトをentry_point
として定義し、使用するinstance_type
と渡すhyperparameters
を定義します。
from sagemaker.huggingface import HuggingFace
# Estimatorの作成
huggingface_estimator = HuggingFace(
entry_point='run_summarization.py', # スクリプト
source_dir='./examples/seq2seq', # 例の相対パス
git_config=git_config,
instance_type='ml.p3dn.24xlarge',
instance_count=2,
transformers_version='4.4.2',
pytorch_version='1.6.0',
py_version='py36',
role=role,
hyperparameters = hyperparameters,
distribution = distribution
)
instance_type
としてml.p3dn.24xlarge
を使用しており、8x NVIDIA A100を含むinstance_count
が2であることに注意してください。これは16のGPUとtotal_batch_size
が16*4=64でトレーニングを実行し、64のtotal_batch_size
で400億パラメータのモデルをトレーニングすることを意味します。トレーニングを開始するには、.fit()
メソッドを呼び出します。
# トレーニングジョブを開始します
huggingface_estimator.fit()
2021-04-01 13:00:35 開始 - トレーニングジョブを開始しています...
2021-04-01 13:01:03 開始 - 要求されたMLインスタンスを起動していますProfilerReport-1617282031: 進行中
2021-04-01 13:02:23 開始 - トレーニングのためのインスタンスを準備しています......
2021-04-01 13:03:25 ダウンロード中 - 入力データをダウンロードしています...
2021-04-01 13:04:04 トレーニング中 - トレーニングイメージをダウンロードしています...............
2021-04-01 13:06:33 トレーニング中 - トレーニングイメージのダウンロードが完了しました。トレーニングが進行中です
....
....
2021-04-01 13:16:47 アップロード中 - 生成されたトレーニングモデルをアップロード中
2021-04-01 13:27:49 完了 - トレーニングジョブが完了しました
トレーニング秒数: 2882
請求可能な秒数: 2882
トレーニング秒数は2882ですが、これはインスタンスの数で乗算されています。計算すると2882/2=1441で、「トレーニングイメージのダウンロード」から「トレーニングジョブが完了するまで」の期間です。実際の金額に換算すると、16台のNVIDIA Tesla V100-GPUを使用した最先端の要約モデルのトレーニングは約28ドルになります。
fine-tunedモデルをhuggingface.coにアップロードする
モデルがかなり良いスコアを達成したため、huggingface.coにアップロードし、model_card
を作成し、ホストされた推論ウィジェットでテストします。モデルをアップロードするには、ここでアカウントを作成する必要があります。
Amazon S3からモデルをダウンロードし、次のコードを使用して解凍することができます。
import os
import tarfile
from sagemaker.s3 import S3Downloader
local_path = 'my_bart_model'
os.makedirs(local_path, exist_ok = True)
# S3からモデルをダウンロード
S3Downloader.download(
s3_uri=huggingface_estimator.model_data, # トレーニングされたモデルが格納されているS3 URI
local_path=local_path, # *.tar.gzが保存されるローカルパス
sagemaker_session=sess # モデルのトレーニングに使用されるSageMakerセッション
)
# モデルを解凍
tar = tarfile.open(f"{local_path}/model.tar.gz", "r:gz")
tar.extractall(path=local_path)
tar.close()
os.remove(f"{local_path}/model.tar.gz")
huggingface.coへモデルをアップロードする前に、model_card
を作成する必要があります。 model_card
には、モデルの説明、ハイパーパラメータ、結果、およびトレーニングに使用されたデータセットが含まれます。 model_card
を作成するには、local_path
にREADME.md
を作成します。
# 評価結果とテスト結果を読み取る
with open(f"{local_path}/eval_results.json") as f:
eval_results_raw = json.load(f)
eval_results={}
eval_results["eval_rouge1"] = eval_results_raw["eval_rouge1"]
eval_results["eval_rouge2"] = eval_results_raw["eval_rouge2"]
eval_results["eval_rougeL"] = eval_results_raw["eval_rougeL"]
eval_results["eval_rougeLsum"] = eval_results_raw["eval_rougeLsum"]
with open(f"{local_path}/test_results.json") as f:
test_results_raw = json.load(f)
test_results={}
test_results["test_rouge1"] = test_results_raw["test_rouge1"]
test_results["test_rouge2"] = test_results_raw["test_rouge2"]
test_results["test_rougeL"] = test_results_raw["test_rougeL"]
test_results["test_rougeLsum"] = test_results_raw["test_rougeLsum"]
含めるメトリックスをすべて抽出した後、README.md
を作成します。結果テーブルの自動生成に加えて、metadata
のmodel_card
にメトリックスを手動で追加します。
import json
MODEL_CARD_TEMPLATE = """
---
language: en
tags:
- sagemaker
- bart
- summarization
license: apache-2.0
datasets:
- samsum
model-index:
- name: {model_name}
results:
- task:
name: Abstractive Text Summarization
type: abstractive-text-summarization
dataset:
name: "SAMSum Corpus: A Human-annotated Dialogue Dataset for Abstractive Summarization"
type: samsum
metrics:
- name: Validation ROGUE-1
type: rogue-1
value: 42.621
- name: Validation ROGUE-2
type: rogue-2
value: 21.9825
- name: Validation ROGUE-L
type: rogue-l
value: 33.034
- name: Test ROGUE-1
type: rogue-1
value: 41.3174
- name: Test ROGUE-2
type: rogue-2
value: 20.8716
- name: Test ROGUE-L
type: rogue-l
value: 32.1337
widget:
- text: |
Jeff: Can I train a 🤗 Transformers model on Amazon SageMaker?
Philipp: Sure you can use the new Hugging Face Deep Learning Container.
Jeff: ok.
Jeff: and how can I get started?
Jeff: where can I find documentation?
Philipp: ok, ok you can find everything here. https://huggingface.co/blog/the-partnership-amazon-sagemaker-and-hugging-face
---
## `{model_name}`
このモデルはAmazon SageMakerと新しいHugging Face Deep Learningコンテナを使用してトレーニングされました。
詳細については以下を参照してください:
- [🤗 Transformersのドキュメント:Amazon SageMaker](https://huggingface.co/transformers/sagemaker.html)
- [Example Notebooks](https://github.com/huggingface/notebooks/tree/master/sagemaker)
- [Hugging FaceのためのAmazon SageMakerのドキュメント](https://docs.aws.amazon.com/sagemaker/latest/dg/hugging-face.html)
- [Hugging FaceのためのPython SDK SageMakerのドキュメント](https://sagemaker.readthedocs.io/en/stable/frameworks/huggingface/index.html)
- [Deep Learningコンテナ](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#huggingface-training-containers)
## ハイパーパラメータ
{hyperparameters}
## 使用方法
from transformers import pipeline
summarizer = pipeline("summarization", model="philschmid/{model_name}")
conversation = '''Jeff: Can I train a 🤗 Transformers model on Amazon SageMaker?
Philipp: Sure you can use the new Hugging Face Deep Learning Container.
Jeff: ok.
Jeff: and how can I get started?
Jeff: where can I find documentation?
Philipp: ok, ok you can find everything here. https://huggingface.co/blog/the-partnership-amazon-sagemaker-and-hugging-face
'''
nlp(conversation)
## 結果
| キー | 値 |
| --- | ----- |
{eval_table}
{test_table}
"""
# モデルカードを生成する(todo: Trainerからのさらなるデータを追加する)
model_card = MODEL_CARD_TEMPLATE.format(
model_name=f"{hyperparameters['model_name_or_path'].split('/')[1]}アンジップされたモデルとモデルカードがmy_bart_model
に配置された後、huggingface_hub
のSDKを使用してリポジトリを作成し、huggingface.coにアップロードすることができます。または、https://huggingface.co/newに移動して新しいリポジトリを作成し、アップロードすることもできます。
from getpass import getpass
from huggingface_hub import HfApi, Repository
hf_username = "philschmid" # huggingface.coのユーザー名
hf_email = "[email protected]" # コミットに使用するメールアドレス
repository_name = f"{hyperparameters['model_name_or_path'].split('/')[1]}-{hyperparameters['dataset_name']}" # huggingface.co上のリポジトリ名
password = getpass("パスワードを入力してください:") # パスワードの入力プロンプトを作成
# hfトークンの取得
token = HfApi().login(username=hf_username, password=password)
# リポジトリの作成
repo_url = HfApi().create_repo(token=token, name=repository_name, exist_ok=True)
# Repositoryインスタンスの作成
model_repo = Repository(use_auth_token=token,
clone_from=repo_url,
local_dir=local_path,
git_user=hf_username,
git_email=hf_email)
# モデルをハブにプッシュ
model_repo.push_to_hub()
推論のテスト
モデルをアップロードした後、https://huggingface.co/{hf_username}/{repository_name}
でアクセスできます。
print(f"https://huggingface.co/{hf_username}/{repository_name}")
そして、"Hosted Inference API"ウィジェットを使用してテストすることができます。
https://huggingface.co/philschmid/bart-large-cnn-samsum
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles