分散トレーニング:🤗 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行のコードでトレーニングを開始できます。

発表のブログ投稿では、統合に関するすべての情報、”はじめに”の例、ドキュメント、例、および機能へのリンクが提供されています。

以下に再掲します:

  • 🤗 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_pointsource_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_sizeper_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_pathREADME.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を作成します。結果テーブルの自動生成に加えて、metadatamodel_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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

このAIニュースレターは、あなたが必要とするすべてです #55

今週、私たちはついにOpen AIのCode Interpreterをテストすることができ、ChatGPT内のGPT-4の新機能に興奮していましたOpenAI...

AIニュース

「Amazon SageMakerを使用して、Llama 2モデルのスループット性能を向上させる」

機械学習(ML)の普及において、私たちは興奮する転換点にいます私たちは、ほとんどの顧客の体験やアプリケーションが生成型A...

AI研究

「SMARTは、AI、自動化、そして働き方の未来を進めるための研究グループを立ち上げました」

「Mens, Manus and Machina (M3S)は、人間と機械の成功した協働のために、技術、トレーニングプログラム、および制度を設計し...

AIニュース

F.T.C.、AmazonをPrimeに加入させるためにユーザーをだますと非難

訴訟は、連邦取引委員会の委員長であるリナ・カーンが指揮する初めてのアマゾンに対する訴訟です

機械学習

「ディープランゲージモデルは、コンテキストから次の単語を予測することを学ぶことで、ますます優れてきていますこれが本当に人間の脳が行っていることなのでしょうか?」

ディープラーニングは、テキスト生成、翻訳、および補完の分野で最近大きな進歩を遂げています。周囲の文脈から単語を予測す...

AI研究

アップルとブリティッシュコロンビア大学のAI研究者が提案する「FaceLit:ニューラル3D再点灯可能な顔のための革新的なAIフレームワーク」

近年、2D画像から3D生成モデルを獲得するタスクに対する関心が高まっています。Neural Radiance Fields(NeRF)の登場により...