分散トレーニング:🤗 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の世界で生き残るにはどうすればいいですか?あなたの仕事は危険にさらされていますか?

あなたの仕事は危険にさらされていますか?これは多くの労働者が悩む質問ですが、最近の解雇の文脈ではありません私が言って...

AI研究

マイクロソフトの研究者が提案するNUWA-XL:極長ビデオ生成のための新しい拡散オーバー拡散アーキテクチャ

生成モデルの分野では、最近、視覚合成への関心が高まっています。以前の研究では、高品質の画像生成が可能でした。しかし、...

AIニュース

「AIドクター」は、入院後の再入院やその他の健康結果を予測します

研究者たちは、死亡リスクや入院期間などの要因に基づいて患者の健康結果を予測する人工知能アルゴリズムを発明しました

AI研究

研究者たちは、より優れた熱管理のために固体熱トランジスタを開発しました

固体熱トランジスタは、電場のオンオフスイッチングを使用して、半導体デバイス内の熱移動を精密に制御することを可能にします

AIニュース

『Amazon SageMaker Clarifyを使用して、臨床設定で医療上の決定を説明する』

この投稿では、Amazon SageMaker Clarifyを使用して、臨床設定でモデルの説明可能性を向上させる方法を示します医療領域で使...

人工知能

NVIDIAとHexagonが、産業のデジタル化を加速するためのソリューションスイートを提供します

産業企業がデジタル化の次のレベルに到達するためには、物理システムの正確なバーチャルな表現を作成する必要があります。 NV...