Hugging Face Amazon SageMaker コンテナを使用して独自のスクリプトを導入し、サマライザ モデルを微調整してデプロイする

NLP ドメインには、最近多くの進歩がありました。 事前トレーニング済みのモデルと完全に管理された NLP サービスにより、NLP へのアクセスと採用が民主化されました。 Amazon Comprehend カスタム エンティティ認識、トピック モデリング、センチメント分析などの NLP タスクを実行して、ML の経験がなくてもデータから洞察を抽出できるフル マネージド サービスです。

昨年、AWS は パートナーシップ   ハグ顔 自然言語処理 (NLP) モデルをより迅速に本番環境に導入するのに役立ちます。 Hugging Face は、NLP に焦点を当てたオープンソースの AI コミュニティです。 彼らの Python ベースのライブラリ (トランスフォーマー) は、BERT、RoBERTa、GPT などの一般的な最先端の Transformer アーキテクチャを簡単に使用するためのツールを提供します。 これらのモデルは、テキスト分類、情報抽出、質問応答など、さまざまな NLP タスクに適用できます。 他人.

アマゾンセージメーカー は、開発者とデータ サイエンティストが機械学習 (ML) モデルを迅速に構築、トレーニング、デプロイできるフル マネージド サービスです。 SageMaker は、ML プロセスの各ステップから面倒な作業を取り除き、高品質のモデルの開発を容易にします。 SageMaker Python SDK は、いくつかの異なる ML および深層学習フレームワークを使用して、SageMaker でモデルをトレーニングおよびデプロイするためのオープンソース API およびコンテナーを提供します。

Hugging Face と SageMaker の統合により、独自のドメイン固有のユースケースで Hugging Face モデルを大規模に構築できます。

この投稿では、SageMaker でカスタム Hugging Face テキスト サマライザーを構築してデプロイする方法の例を紹介します。 この目的のために Pegasus [1] を使用します。これは、抽象的なテキスト要約用に調整された目的で特別に事前トレーニングされた最初の Transformer ベースのモデルです。 BERT は、文中のランダムな単語をマスキングするよう事前にトレーニングされています。 対照的に、Pegasus の事前トレーニング中は、文章は入力ドキュメントからマスクされます。 次に、モデルは、マスクされていないすべての文をコンテキストとして使用して、欠落している文を単一の出力シーケンスとして生成し、結果としてドキュメントのエグゼクティブ サマリーを作成します。

HuggingFace ライブラリの柔軟性のおかげで、この記事で示したコードを t5、BART などの他のタイプのトランスフォーマー モデルに簡単に適応させることができます。

独自のデータセットを読み込んでハグ顔モデルを微調整する

CSV ファイルからカスタム データセットを読み込むには、 load_dataset Transformers パッケージのメソッド。 を使用して、ロードされたデータセットにトークン化を適用できます。 datasets.Dataset.map 関数。 ザ map 関数は、読み込まれたデータセットを反復処理し、トークン化関数を各例に適用します。 トークン化されたデータセットは、モデルを微調整するためにトレーナーに渡すことができます。 次のコードを参照してください。

# Python
def tokenize(batch):
    tokenized_input = tokenizer(batch[args.input_column], padding='max_length', truncation=True, max_length=args.max_source)
    tokenized_target = tokenizer(batch[args.target_column], padding='max_length', truncation=True, max_length=args.max_target)
    tokenized_input['target'] = tokenized_target['input_ids']

    return tokenized_input
    

def load_and_tokenize_dataset(data_dir):
    for file in os.listdir(data_dir):
        dataset = load_dataset("csv", data_files=os.path.join(data_dir, file), split='train')
    tokenized_dataset = dataset.map(lambda batch: tokenize(batch), batched=True, batch_size=512)
    tokenized_dataset.set_format('numpy', columns=['input_ids', 'attention_mask', 'labels'])
    
    return tokenized_dataset

Hugging Face SageMaker estimator のトレーニング スクリプトを作成する

投稿で説明されているように AWSとHuggingFaceが協力して、自然言語処理モデルの採用を簡素化および加速します、SageMaker で Hugging Face モデルをトレーニングすることは、かつてないほど容易になりました。 これは、Hugging Face estimator を使用して実行できます。 SageMaker SDK.

次のコード スニペットは、データセットで Pegasus を微調整します。 あなたもたくさん見つけることができます サンプルノートブック Transformers GitHub リポジトリで直接利用できる、さまざまなタイプのモデルを微調整する方法を説明します。 分散トレーニングを有効にするには、 データ並列処理ライブラリ HuggingFace トレーナー API に組み込まれている SageMaker で。 データの並列処理を有効にするには、次を定義する必要があります distribution Hugging Face estimator のパラメーター。

# Python
from sagemaker.huggingface import HuggingFace
# configuration for running training on smdistributed Data Parallel
distribution = {'smdistributed':{'dataparallel':{ 'enabled': True }}}
huggingface_estimator = HuggingFace(entry_point='train.py',
                                    source_dir='code',
                                    base_job_name='huggingface-pegasus',
                                    instance_type= 'ml.g4dn.16xlarge',
                                    instance_count=1,
                                    transformers_version='4.6',
                                    pytorch_version='1.7',
                                    py_version='py36',
                                    output_path=output_path,
                                    role=role,
                                    hyperparameters = {
                                        'model_name': 'google/pegasus-xsum',
                                        'epoch': 10,
                                        'per_device_train_batch_size': 2
                                    },
                                    distribution=distribution)
huggingface_estimator.fit({'train': training_input_path, 'validation': validation_input_path, 'test': test_input_path})

設定できる最大トレーニング バッチ サイズは、モデル サイズと使用するインスタンスの GPU メモリによって異なります。 SageMaker 分散トレーニングが有効になっている場合、合計バッチ サイズは、各デバイス/GPU に分散されたすべてのバッチの合計です。 ml.g4dn.xlarge インスタンスの代わりに分散トレーニングで ml.g16dn.4xlarge を使用すると、ml.g8dn.xlarge インスタンス (4 GPU) の 1 倍 (XNUMX GPU) のメモリを使用できます。 デバイスあたりのバッチ サイズは変わりませんが、XNUMX つのデバイスが並行してトレーニングを行っています。

SageMaker でいつものように、 train.py スクリプト モードで使用し、トレーニング用のハイパーパラメータを渡すスクリプト。 Pegasus の次のコード スニペットは、モデルをロードし、Transformers を使用してトレーニングします。 Trainer クラス:

# Python
from transformers import (
    AutoModelForSeq2SeqLM,
    AutoTokenizer,
    Seq2SeqTrainer,
    Seq2seqTrainingArguments
)

model = AutoModelForSeq2SeqLM.from_pretrained(model_name).to(device)
    
training_args = Seq2seqTrainingArguments(
    output_dir=args.model_dir,
    num_train_epochs=args.epoch,
    per_device_train_batch_size=args.train_batch_size,
    per_device_eval_batch_size=args.eval_batch_size,
    warmup_steps=args.warmup_steps,
    weight_decay=args.weight_decay,
    logging_dir=f"{args.output_data_dir}/logs",
    logging_strategy='epoch',
    evaluation_strategy='epoch',
    saving_strategy='epoch',
    adafactor=True,
    do_train=True,
    do_eval=True,
    do_predict=True,
    save_total_limit = 3,
    load_best_model_at_end=True,
    metric_for_best_model='eval_loss'
    # With the goal to deploy the best checkpoint to production
    # it is important to set load_best_model_at_end=True,
    # this makes sure that the last model is saved at the root
    # of the model_dir” directory
)
    
trainer = Seq2SeqTrainer(
    model=model,
    args=training_args,
    train_dataset=dataset['train'],
    eval_dataset=dataset['validation']
)

trainer.train()
trainer.save_model()

# Get rid of unused checkpoints inside the container to limit the model.tar.gz size
os.system(f"rm -rf {args.model_dir}/checkpoint-*/")

完全なコードは、 GitHubの.

トレーニング済みのハグ顔モデルを SageMaker にデプロイする

Hugging Face の友人たちは、SageMaker for Transformers モデルの推論をこれまで以上にシンプルにしました。 SageMaker ハグ顔推論ツールキット. 環境変数を設定するだけで、以前にトレーニングしたモデルを直接デプロイできます "HF_TASK":"summarization" (手順については、を参照してください ペガサスモデル)、選択 配備します、次に選択 アマゾンセージメーカー、推論スクリプトを記述する必要はありません。

ただし、予測を生成または後処理する特定の方法が必要な場合 (たとえば、さまざまなテキスト生成パラメーターのリストに基づいていくつかの要約の提案を生成するなど) は、独自の推論スクリプトを作成すると便利で比較的簡単です。

# Python
# inference.py script

import os
import json
import torch
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

def model_fn(model_dir):
    # Create the model and tokenizer and load weights
    # from the previous training Job, passed here through "model_dir"
    # that is reflected in HuggingFaceModel "model_data"
    tokenizer = AutoTokenizer.from_pretrained(model_dir)
    model = AutoModelForSeq2SeqLM.from_pretrained(model_dir).to(device).eval()
    
    model_dict = {'model':model, 'tokenizer':tokenizer}
    
    return model_dict
        

def predict_fn(input_data, model_dict):
    # Return predictions/generated summaries
    # using the loaded model and tokenizer on input_data
    text = input_data.pop('inputs')
    parameters_list = input_data.pop('parameters_list', None)
    
    tokenizer = model_dict['tokenizer']
    model = model_dict['model']

    # Parameters may or may not be passed    
    input_ids = tokenizer(text, truncation=True, padding='longest', return_tensors="pt").input_ids.to(device)
    
    if parameters_list:
        predictions = []
        for parameters in parameters_list:
            output = model.generate(input_ids, **parameters)
            predictions.append(tokenizer.batch_decode(output, skip_special_tokens=True))
    else:
        output = model.generate(input_ids)
        predictions = tokenizer.batch_decode(output, skip_special_tokens=True)
    
    return predictions
    
    
def input_fn(request_body, request_content_type):
    # Transform the input request to a dictionary
    request = json.loads(request_body)
    return request

前のコードに示されているように、SageMaker の HuggingFace のこのような推論スクリプトには、次のテンプレート関数のみが必要です。

  • model_fn() ・訓練ジョブ終了時に内部に保存された内容を読み込む SM_MODEL_DIR、または tar.gz ファイルとして保存された既存のモデルの重みディレクトリから Amazon シンプル ストレージ サービス (アマゾン S3)。 これは、トレーニング済みのモデルと関連するトークナイザーを読み込むために使用されます。
  • input_fn() – エンドポイントに対して行われた要求から受信したデータをフォーマットします。
  • predict_fn() – の出力を呼び出します model_fn() (モデルとトークナイザー) の出力で推論を実行する input_fn() (フォーマットされたデータ)。

オプションで、 output_fn() の出力を使用して、推論フォーマットの関数 predict_fn()、この投稿では説明しませんでした。

次に、トレーニング済みのハグ顔モデルを、関連する推論スクリプトとともに SageMaker にデプロイできます。 ハグ顔 SageMaker モデル クラス:

# Python
from sagemaker.huggingface import HuggingFaceModel

model = HuggingFaceModel(model_data=huggingface_estimator.model_data,
                     role=role,
                     framework_version='1.7',
                     py_version='py36',
                     entry_point='inference.py',
                     source_dir='code')
                     
predictor = model.deploy(initial_instance_count=1,
                         instance_type='ml.g4dn.xlarge'
                         )

デプロイされたモデルをテストする

このデモでは、モデルをトレーニングしました。 女性の e コマース ファッション レビュー データセットには、衣料品の記事のレビュー (入力テキストと見なされます) とそれに関連するタイトル (要約と見なされます) が含まれます。 タイトルのない記事を削除すると、データセットには 19,675 件のレビューが含まれます。 70 エポックの記事の 3.5% を含むトレーニング セットで Pegasus モデルを微調整するには、ml.p3.16xlarge インスタンスで約 XNUMX 時間かかりました。

次に、モデルをデプロイし、テスト セットのサンプル データを使用してテストします。 以下は、セーターを説明するレビューの例です。

# Python
Review Text
"I ordered this sweater in green in petite large. The color and knit is beautiful and the shoulders and body fit comfortably; however, the sleeves were very long for a petite. I roll them, and it looks okay but would have rather had a normal petite length sleeve."

Original Title
"Long sleeves"

Rating
3

SageMaker エンドポイントでホストされているカスタム推論スクリプトのおかげで、さまざまなテキスト生成パラメーターを使用して、このレビューの要約をいくつか生成できます。 たとえば、さまざまな長さのペナルティを指定して、非常に短い要約から適度に長い要約の範囲を生成するようにエンドポイントに依頼できます (長さのペナルティが小さいほど、生成される要約は短くなります)。 以下は、いくつかのパラメーター入力の例と、その後のマシン生成の要約です。

# Python
inputs = {
    "inputs":[
"I ordered this sweater in green in petite large. The color and knit is   beautiful and the shoulders and body fit comfortably; however, the sleeves were very long for a petite. I roll them, and it looks okay but would have rather had a normal petite length sleeve."
    ],

    "parameters_list":[
        {
            "length_penalty":2
        },
	{
            "length_penalty":1
        },
	{
            "length_penalty":0.6
        },
        {
            "length_penalty":0.4
        }
    ]

result = predictor.predict(inputs)
print(result)

[
    ["Beautiful color and knit but sleeves are very long for a petite"],
    ["Beautiful sweater, but sleeves are too long for a petite"],
    ["Cute, but sleeves are long"],
    ["Very long sleeves"]
]

あなたはどちらのまとめがお好みですか? 最初に生成されたタイトルは、レビューに関するすべての重要な事実を捉えており、単語数は 1 分の 10 です。 対照的に、最後のレビューでは、セーターの最も重要な特徴に焦点を当てるために、XNUMX つの単語 (元のレビューの XNUMX/XNUMX 未満の長さ) しか使用していません。

まとめ

カスタム データセットでテキスト サマライザーを微調整し、SageMaker の本番環境にデプロイできます。 GitHubの。 追加 サンプルノートブック SageMaker で Hugging Face モデルをトレーニングしてデプロイする方法も利用できます。

いつものように、AWSはフィードバックを歓迎します。 コメントや質問を送信してください。

参考文献

[1] PEGASUS: 抽出されたギャップ文を使用した抽象的要約のための事前トレーニング


著者について

独自のスクリプト PlatoBlockchain Data Intelligence をもたらす Hugging Face Amazon SageMaker コンテナを使用して、サマライザー モデルを微調整してデプロイします。垂直検索。あい。 ヴィクトル・マレセビッチ は、AW​​S プロフェッショナル サービスの機械学習エンジニアであり、自然言語処理と MLOps に情熱を注いでいます。 彼は顧客と協力して、挑戦的な深層学習モデルを開発し、AWS で本番稼働させています。 余暇には、グラス一杯の赤ワインとチーズを友人と分け合って楽しんでいます。

独自のスクリプト PlatoBlockchain Data Intelligence をもたらす Hugging Face Amazon SageMaker コンテナを使用して、サマライザー モデルを微調整してデプロイします。垂直検索。あい。アアムナ・ナジミ は、AW​​S プロフェッショナル サービスのデータ サイエンティストです。 彼女は、顧客がビッグデータと人工知能技術を使用して革新し、データからビジネス価値と洞察を引き出すのを支援することに情熱を注いでいます。 余暇には、ガーデニングや新しい場所への旅行を楽しんでいます。

タイムスタンプ:

より多くの AWS機械学習