AmazonSageMakerでHuggingFaceTransformersを使用した質問応答タスク用のBERTラージモデルの分散微調整

ソースノード: 1885069

新しいモデルのトレーニングから本番環境へのデプロイまで、 アマゾンセージメーカー は、スタートアップや企業が機械学習 (ML) と深層学習の力を活用するための最も完全なツール セットを提供します。

Hugging Face は、Transformers オープンソース ライブラリと ML プラットフォームを使用して、世界中の AI コミュニティが転移学習と最新の ML モデルにアクセスできるようにし、世界中の企業のデータ サイエンティストと ML エンジニアがあらゆる新しい科学的手法を活用するのに必要な時間を短縮します。アドバンス。

Transformers を新しい NLP タスクまたはドメインに適用するには、大規模な言語モデルを微調整する必要があります。これは、事前トレーニングされたモデルの蓄積された知識を活用して、追加の効率的なトレーニング プロセスでモデルを新しいタスクまたは特定の種類のドキュメントに適応させる手法です。

当面のビジネス上の問題を正確に予測するためにモデルを微調整するには、BERT、BART、RoBERTa、T5 などの大規模な Transformers モデルのトレーニングが必要ですが、スケーラブルな方法で実行するのは困難な場合があります。

Hugging Face は SageMaker と緊密に連携して、 すぐに使える深層学習コンテナ (DLC) により、最新のトランスフォーマー モデルのトレーニングとデプロイがこれまでよりも簡単かつ迅速になります。 SageMaker Data Parallel (SMDP)、SageMaker Model Parallel (SMMP)、S3 パイプ モードなどの機能がコンテナに統合されているため、これらを使用することで、企業が質問応答、生成などの Transformers ベースの ML ソリューションを作成する時間が大幅に短縮されます。テキストと画像、検索結果の最適化、カスタマー サポートの自動化、会話型インターフェイス、セマンティック検索、ドキュメント分析、その他多くのアプリケーションを改善します。

この投稿では、SageMaker 分散ライブラリと Hugging Face の緊密な統合に焦点を当てます。これにより、データ サイエンティストは、すべて SageMaker 内で Transformers モデルのトレーニングと微調整を数日から数時間で加速できるようになります。

分散型研修の概要

ML 実務者とデータ サイエンティストは、モデルをトレーニングするときに、モデル サイズ (パラメーターとレイヤーの数) のスケーリングとトレーニング データのスケーリングという XNUMX つのスケーリングの課題に直面します。 モデル サイズまたはトレーニング データのいずれかをスケーリングすると精度が向上しますが、ディープ ラーニングでは、アクセラレータ (CPU または GPU) のメモリ量によってトレーニング データのサイズとトレーニング データのサイズの組み合わせが制限される場合があります。モデル。 たとえば、大規模な言語モデルをトレーニングする場合、バッチ サイズは少数のサンプルに制限されることが多く、その結果、モデルの精度が低くなる可能性があります。

分散トレーニングでは、ワークロードを分割してモデルを複数のプロセッサ間でトレーニングできます。 労働者。 これらのワーカーはモデルのトレーニングを高速化するために並行して動作します。

スケーリングしたいもの (モデルまたはデータ) に基づいて、分散トレーニングには XNUMX つのアプローチがあります。 データ並列とモデル並列.

データ並列は、分散トレーニングへの最も一般的なアプローチです。 データの並列処理には、モデル アーキテクチャのコピーの作成と、さまざまなアクセラレータでの重み付けが必要です。 そうすれば、トレーニング セット全体を 4 つのアクセラレータに渡すのではなく、トレーニング セットをさまざまなアクセラレータに分割して、トレーニング セットをより速く処理できるようになります。 これにより、アクセラレータが勾配情報をパラメータ サーバーに返す必要があるというステップが追加されますが、この時間は、アクセラレータごとにデータセット全体の一部を反復処理する速度の向上によって十分に相殺されます。 このため、データの並列処理はトレーニング時間を大幅に短縮するのに役立ちます。 たとえば、並列化を行わずに単一のモデルをトレーニングするには 24 時間かかります。 分散トレーニングを使用すると、それを XNUMX 分に短縮できます。 SageMaker 分散トレーニングでは、勾配更新における最先端の技術も実装されています。

モデル並列アプローチは、XNUMX つのアクセラレータ (GPU) に収まらないほど大規模なモデルで使用されます。 このアプローチでは、モデル アーキテクチャがシャードに分割され、異なるアクセラレータに配置される並列化戦略が実装されます。 これらの各シャードの構成はニューラル ネットワーク アーキテクチャに依存し、通常は複数のレイヤーが含まれます。 アクセラレータ間の通信は、トレーニング データが XNUMX つのシャードから次のシャードに渡されるたびに発生します。

要約すると、大規模なデータセットによる時間のかかるタスクや、トレーニング実験を高速化したい場合には、分散トレーニング データの並列処理を使用する必要があります。 モデルが XNUMX つのアクセラレータに適合できない場合は、モデルの並列処理を使用する必要があります。

前提条件

SageMaker で Hugging Face Transformers モデルの分散トレーニングを実行するには、次の前提条件を満たしている必要があります。

分散型トレーニングの実施

Hugging Face Transformers ライブラリは、ライブラリが提供するモデルをトレーニングまたは微調整するために最適化された Trainer API を提供します。 トランスフォーマー モデルと同じように機能する場合は、独自のモデルでも使用できます。 見る トレイナー 詳細については。 このAPIは弊社で使用されています スクリプト例では、さまざまな NLP タスクのデータを前処理する方法を示します。これをモデルとして使用して、独自のカスタム問題を解決するスクリプトを作成できます。 Trainer API の約束は、このスクリプトが SageMaker を含むあらゆる分散セットアップですぐに機能することです。

Trainer API には、トレーニングに必要なものがすべて含まれています。 これには、データセット、モデル (またはモデルを返す関数)、 compute_metrics 述語とラベルの配列から追跡したいメトリクスを返す関数、オプティマイザーと学習率スケジューラー (適切なデフォルトが提供されます)、および というデータ クラスにグループ化されたトレーニング用に調整できるすべてのハイパーパラメーターを返します。 TrainingArguments。 これらすべてにより、モデルをトレーニングしたり、任意のデータセットでメトリクス結果を取得したり、任意のデータセットで予測を取得したりするための XNUMX つのメソッド (トレーニング、評価、予測) が公開されます。 Trainer オブジェクトの詳細については、を参照してください。 Trainer API を使用したモデルの微調整 とビデオ トレーナー APIで、簡単な例を説明します。

トレーナー API は舞台裏で、スクリプトの作成時にスクリプトを起動する環境を分析することから始まります。 TrainingArguments。 たとえば、SageMaker を使用してトレーニングを開始した場合、SageMaker は次のことを確認します。 SM_FRAMEWORK_PARAMS 環境内の変数を使用して、SageMaker データ並列処理またはモデル並列処理を有効にしたかどうかを検出します。 次に、必要な初期化手順 (たとえば、 smdistributed.dataparallel.torch.distributed.init_process_group()).

トレーナーにはトレーニング ループ全体が含まれているため、必要なステップを調整して確実にトレーニングを行うことができます。 smdistributed.dataparallel バックエンドは、スクリプト内のコード行を変更することなく、必要に応じて使用されます。 デバッグのためにローカル マシン上で (かなり遅くなりますが) 実行することもできます。 各プロセスが異なるサンプルを自動的に参照できるようにデータセットのシャーディングを処理し、エポックごとに再シャッフルし、最適化ステップの前に勾配を同期し、有効化した場合は混合精度トレーニングを、大きなバッチ サイズに適合できない場合は勾配を累積します。 GPU やその他多くの最適化が可能です。

モデルの並列処理を有効にすると、同じデータを参照する必要があるプロセスが確実に同じデータを参照できるようになります ( dp_rank 同じです)同じバッチを取得し、異なるプロセスで処理します dp_rank 同じサンプルは表示されず、エポックごとに再度シャッフルされます。 チェックポイント作成時にモデルまたはオプティマイザーの状態ディクショナリが適切に同期されていることを確認し、混合精度や勾配累積などのすべての最適化を再度処理します。

評価メソッドと予測メソッドを使用する場合、トレーナーは分散評価を実行して、すべての GPU を活用します。 プロセスごとにデータの分割を適切に処理します(同じプロセス) dp_rank モデルの並列処理がアクティブ化されている場合)、予測がデータセットに送信される前に、使用しているデータセットと同じ順序で適切に収集されていることを確認します。 compute_metrics 関数または返されたばかりです。 Trainer API の使用は必須ではありません。 ユーザーは引き続き Hugging Face 内で Keras または PyTorch を使用できます。 ただし、Trainer API は便利な抽象化レイヤーを提供できます。

SageMaker Hugging Face Estimators を使用してモデルをトレーニングする

Estimator は SageMaker トレーニング用の高レベルのインターフェイスであり、エンドツーエンドの SageMaker トレーニングおよびデプロイメント タスクを処理します。 スクリプトのトレーニングは、呼び出し時に呼び出されます。 fit 上の HuggingFace 推定者。 Estimator では、どの微調整スクリプトを使用するかを定義します。 entry_point、その instance_type 使用するハイパーパラメータと渡されるハイパーパラメータ。詳細については、 HuggingFace パラメータについては、を参照してください ハグ顔推定器.

分散トレーニング: データ並列

この例では、新しい Hugging Face DLC と SageMaker SDK を使用して、トランスフォーマーとデータセット ライブラリを使用して質問と回答のタスクで分散 Seq2Seq トランスフォーマー モデルをトレーニングします。 の bert-large-uncased-whole-word-masking モデルは微調整されています チーム データセット。

次のコード サンプルは、 HuggingFace データ並列処理を使用した分散トレーニング用の推定器。

  1. ハグ顔トランスフォーマー スクリプトを選択します。
    # git configuration to download our fine-tuning script
    git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'}

作成すると HuggingFace Estimator では、GitHub リポジトリに保存されているトレーニング スクリプトを Estimator のエントリ ポイントとして指定できるため、スクリプトをローカルにダウンロードする必要はありません。 使用できます git_config Hugging Face Transformers サンプル スクリプトを実行し、右の「分岐」を実行します。 transformers_version を設定する必要があります。 たとえば、次のように使用すると、 transformers_version 4.6.1 では、「」を使用する必要があります。branch':'v4.6.1'。

  1. トレーニング ジョブに渡されるトレーニング ハイパーパラメーターを構成します。
    # hyperparameters, which are passed into the training job
    hyperparameters={ 'model_name_or_path': 'bert-large-uncased-whole-word-masking', 'dataset_name':'squad', 'do_train': True, 'do_eval': True, 'fp16': True, 'per_device_train_batch_size': 4, 'per_device_eval_batch_size': 4, 'num_train_epochs': 2, 'max_seq_length': 384, 'max_steps': 100, 'pad_to_max_length': True, 'doc_stride': 128, 'output_dir': '/opt/ml/model'
    }

ハイパーパラメータとして、任意のものを定義できます。 Seq2Seqトレーニング引数 およびトレーニング スクリプトで定義されているもの。

  1. 分布パラメータを定義します。 HuggingFace 推定者:
    # configuration for running training on smdistributed Data Parallel
    distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}

あなたが使用することができます SageMakerデータ並列処理ライブラリ すぐに使える分散トレーニング。 データ並列処理の機能を直接トレーナーに追加しました。 データの並列処理を有効にするには、単一のパラメーターを HuggingFace Estimator は、トレーナーベースのコードで自動的に使用できるようにします。

  1. 作る HuggingFace 前のステップで定義したパラメータを含む推定器を作成し、トレーニングを開始します。
from sagemaker.huggingface import HuggingFace
# estimator
huggingface_estimator = HuggingFace(entry_point='run_qa.py', source_dir='./examples/pytorch/question-answering', git_config=git_config, instance_type= 'ml.p3.16xlarge', instance_count= 2, volume_size= 200, role= <SageMaker Role>, # IAM role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', distribution= distribution, hyperparameters = hyperparameters) # starting the train job huggingface_estimator.fit()

  ハグフェイストランスフォーマーリポジトリ 言語モデリングからトークン分類までのタスクでモデルを微調整するためのいくつかの例とスクリプトが含まれています。 私たちの場合、使用するのは、 run_qa.py examples/pytorch/question-answering 例。

smdistributed.dataparallel SageMaker でのモデルトレーニングをサポート 次のインスタンス タイプのみ。 最高のパフォーマンスを得るには、サポートするインスタンス タイプを使用することをお勧めします。 エラスティックファブリックアダプター (EFA):

  • ml.p3.16xlarge
  • ml.p3dn.24xlarge (推奨)
  • ml.p4d.24xlarge (推奨)

最高のパフォーマンスと最大限の効果を得るには、 SMDataParallel、少なくとも XNUMX つのインスタンスを使用する必要がありますが、この例のテストに XNUMX つを使用することもできます。

以下 サンプルノート より詳細なステップバイステップのガイダンスが提供されます。

分散トレーニング: モデルの並列化

モデルの並列処理による分散トレーニングでは、Hugging Face Transformers とデータセット ライブラリを SageMaker SDK とともに使用して、 一般的な言語理解の評価(GLUE) を使用したマルチノード、マルチ GPU クラスターのベンチマーク SageMaker モデル並列処理ライブラリ.

データ並列処理と同様に、最初に git 構成、トレーニング ハイパーパラメータ、および分散パラメータを設定します。 HuggingFace 推定者:

# git configuration to download our fine-tuning script
git_config = {'repo': 'https://github.com/huggingface/transformers.git','branch': 'v4.6.1'} # hyperparameters, which are passed into the training job
hyperparameters={ 'model_name_or_path':'roberta-large', 'task_name': 'mnli', 'per_device_train_batch_size': 16, 'per_device_eval_batch_size': 16, 'do_train': True, 'do_eval': True, 'do_predict': True, 'num_train_epochs': 2, 'output_dir':'/opt/ml/model', 'max_steps': 500,
} # configuration for running training on smdistributed Model Parallel
mpi_options = { "enabled" : True, "processes_per_host" : 8,
}
smp_options = { "enabled":True, "parameters": { "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "partitions": 4, "ddp": True, }
} distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options
}

モデル並列処理ライブラリは内部で MPI を使用するため、モデル並列処理を使用するには、分布パラメーターを使用して MPI を有効にする必要があります。 「processes_per_host前述のコードの「」は、MPI が各ホストで起動するプロセスの数を指定します。 開発とテストにはこれらを推奨します。 実稼働時に、大規模な GPU 容量をリクエストする場合は、AWS サポートにお問い合わせください。 詳細については、「」を参照してください。 SageMaker 分散モデルの並列トレーニング ジョブを実行する.

以下 サンプルノート 完全なコード スクリプトが含まれています。

スポットインスタンス

SageMaker Python SDK の Hugging Face フレームワーク拡張機能を使用すると、フルマネージドの アマゾン エラスティック コンピューティング クラウド (Amazon EC2) スポットインスタンス トレーニング費用を最大 90% 節約できます。

トレーニング ジョブがすぐに完了しない限り、次を使用することをお勧めします。 チェックポインティング マネージドスポットトレーニングでは、以下を定義する必要があります。 checkpoint_s3_uri.

スポットインスタンスを使用するには HuggingFace 推定器、設定する必要があります use_spot_instances パラメータを True に設定し、 max_wait & max_run 時間。 管理されたスポット トレーニングのライフサイクルの詳細については、次を参照してください。 Amazon SageMakerのマネージドスポットトレーニング.

以下は、スポット トレーニング Estimator を設定するためのコード スニペットです。

from sagemaker.huggingface import HuggingFace # hyperparameters, which are passed into the training job
hyperparameters={'epochs': 1, 'train_batch_size': 32, 'model_name':'distilbert-base-uncased', 'output_dir':'/opt/ml/checkpoints' } # s3 uri where our checkpoints will be uploaded during training
job_name = "using-spot"
checkpoint_s3_uri = f's3://{sess.default_bucket()}/{job_name}/checkpoints' huggingface_estimator = HuggingFace(entry_point='train.py', source_dir='./scripts', instance_type='ml.p3.2xlarge', instance_count=1, base_job_name=job_name, checkpoint_s3_uri=checkpoint_s3_uri, use_spot_instances=True, max_wait=3600, # This should be equal to or greater than max_run in seconds' max_run=1000, # expected max run in seconds role=role, transformers_version='4.6', pytorch_version='1.7', py_version='py36', hyperparameters = hyperparameters)

以下 ノート 完全なコード スクリプトが含まれています。

まとめ

この投稿では、SageMaker を使用した Hugging Face Transformers の分散トレーニングについて説明しました。 まず、データ並列処理とモデル並列処理のユースケースを検討しました。 通常はデータ並列処理の方が適切ですが、トレーニングがコンピューティングによってボトルネックになっている場合に必ずしも限定されるわけではありません。一方、モデルが単一のアクセラレータで提供されるメモリ内に収まらない場合は、モデル並列処理を使用できます。 次に、両方の方法でトレーニングする方法を示しました。

説明したデータ並列処理のユースケースでは、単一の p3.2xlarge インスタンス (単一の GPU を使用) でモデルをトレーニングするのに 4 時間かかり、この記事の執筆時点で約 15 ドルの費用がかかります。 データ並列処理を使用すると、24 ドルのコストで同じモデルを 28 分でトレーニングできます。 コストは 10 倍になりましたが、これによりトレーニング時間は XNUMX 分の XNUMX に短縮されました。短期間に多くのモデルをトレーニングする必要がある状況では、データ並列処理により、比較的低いコスト増加でこれを実現できます。 モデルの並列処理のユースケースに関しては、ハードウェアの制限により以前はまったくトレーニングできなかったモデルをトレーニングする機能が追加されます。 どちらの機能も ML 実践者にとって新しいワークフローを可能にし、 HuggingFace SageMaker Python SDK の一部としての Estimator。 これらのモデルをホストされたエンドポイントにデプロイするには、他の Estimator と同じ手順に従います。

この統合により、SageMaker エコシステムの一部である他の機能が有効になります。 たとえば、追加のコスト最適化のために簡単なフラグを Estimator に追加することで、スポット インスタンスを使用できます。 次のステップとして、 トレーニングデモ & サンプルノート.


著者について

アルキス・ジョグレカール Emerging Technologies チームの AI/ML パートナー ソリューション アーキテクトです。 彼は、AWS のビルディング ブロックを使用した、パフォーマンスが高くスケーラブルなディープ ラーニングと科学コンピューティングに興味を持っています。 彼のこれまでの経験は、計算物理学の研究から、学界、国立研究所、新興企業での機械学習プラットフォームの開発まで多岐にわたります。 コンピューターから離れた時間は、サッカーをしたり、友人や家族と過ごしたりしています。

ジェームス・イー は、アマゾン ウェブ サービスの新興テクノロジー チームのシニア AI/ML パートナー ソリューション アーキテクトです。 彼は、企業顧客やパートナーと協力して AI/ML アプリケーションを設計、導入、拡張してビジネス価値を引き出すことに情熱を注いでいます。 仕事以外では、サッカーをしたり、旅行したり、家族と時間を過ごしたりすることを楽しんでいます。

フィリップ・シュミット Hugging Faceの機械学習エンジニア兼技術リーダーであり、AmazonSageMakerチームとのコラボレーションを主導しています。 彼は、最先端のNLPモデルの民主化、最適化、生産化、およびディープラーニングの使いやすさの向上に情熱を注いでいます。

シルヴァン・ガガー 彼は、Hugging Face のリサーチ エンジニアであり、トランスフォーマー ライブラリの主要な管理者の XNUMX 人です。 彼はオープンソース ソフトウェアが大好きで、コミュニティがそれを使用できるよう支援しています。

ジェフ・ブーディエ は、主要なオープンソース ML ライブラリである Transformers の作成者である Hugging Face で製品を構築しています。 以前、Jeff は GoPro に買収された Stupeflix の共同創設者で、製品管理、製品マーケティング、事業開発、および企業開発のディレクターを務めていました。

出典: https://aws.amazon.com/blogs/machine-learning/distributed-fine-tuning-of-a-bert-large-model-for-a-question-answering-task-using-hugging-face-トランスフォーマー on amazon-sagemaker/

タイムスタンプ:

より多くの AWS機械学習ブログ