Amazon Web Services ブログ

ドキュメントの要約を Hugging Face on Amazon SageMaker で民主化する

この記事は “Democratize documentation summarization with Hugging Face on Amazon SageMaker” を翻訳したものです。

本投稿は、AWS の Sr. AI/ML Partner Solutions Architect である James Yi と AI/ML Solutions Architect である Simon Zamarin により寄稿されました。

はじめに

メディア・エンターテインメント(M&E)業界の進化に伴い、企業はより良い顧客体験を提供するために人工知能(AI)や機械学習(ML)を利用する機会を増やしています。顧客獲得、顧客維持、顧客エンゲージメントは、AI/ML 技術が大きな価値を提供できる重要な分野です。コンテンツの消費パターンがますます複雑化する中、AI/ML ソリューションは、M&E のお客様が消費者と効果的にエンゲージすることを支援します。

ドキュメントの要約は、M&E 業界における重要なユースケースの一例です。記事の見出しの作成からプッシュ通知用の短文要約の作成まで、自動化された文書要約ソリューションは、コンテンツプロバイダーが消費者とより効果的にエンゲージメントを築くのに役立ちます。従来、要約作業は手作業で行われていました。しかし、特に最近のユーザー作成コンテンツの爆発的な増加により、それは必ずしも実用的ではありません。最新の自然言語生成(NLG)モデルは、高品質の文書要約を自動生成することができます。そして、 Amazon Web Services(AWS)パートナーからのソリューションは、これらのモデルの使用を容易にします。AWS パートナーである Hugging Face 社の Transformers ライブラリと Amazon SageMaker – ML を併用すれば、すべてのデータサイエンティストと開発者が、これらのモデルをこれまで以上に簡単に利用できるようになります。このブログ記事では、Amazon SageMaker を使用して、Hugging Face ライブラリを使用した最先端の文書要約ソリューションをデプロイする方法について説明します。

文書要約手法の全体像

ソリューションの詳細に踏み込む前に、文書要約の2つのハイレベルな手法、抽出型モデルと抽象型モデルについて取り上げておくとよいでしょう。抽出的要約では、ML モデルは大量のテキストから重要な文章をそのまま抽出しますが、必ずしも最高品質の要約を生成するとは限りません。これに対し、抽象型モデルでは、原文の核心を捉えた全く新しい要約を生成します。したがって、これらの方法は、人間の要約者が文書を言い換えて作成するのと同様の出力を生成します。

Hugging Face は両方の手法をサポートしており、どちらも M&E 業界で応用されています。従来の出版社では、読者がより早く記事を見つけられるように、長文の記事を要約する必要があります。番組配信者は、電子番組表(EPG)やメディアアセットマネジメント(MAM)用の要約を作成するために利用できます。さらに、コンテンツ制作者は、自動音声認識(ASR)と要約を同じワークフローで使用することで、日刊紙の要約を作成することができます。図1は、この2つの手法を説明したものです。

図1:抽出型要約は、キーワードをそのまま抽出し、抽象型要約は文書を言い換える。

図1:抽出型要約は、キーワードをそのまま抽出し、抽象型要約は文書を言い換える。

このブログでは、Hugging Face Hub で事前にトレーニングさせたモデルを紹介します。トレーニング済みのモデルは、医学雑誌の要約のような全てのドメインで機能するとは限りませんが、より一般的な要約のユースケースの出発点としては十分かもしれません。そして最近導入された Amazon SageMaker Asynchronous Inference のエンドポイントを使用します。これは、入ってくるリクエストをキューに入れ、非同期に処理するものです。

非同期エンドポイントは、リアルタイムの低レイテンシー予測を必要としないユースケースに最適です。生成された要約を1秒以内ではなく数秒から数分以内に受け取れればいい場合、このユースケースに当てはまるかもしれません。さらに、この推論モードでは、エンドポイントが一定期間アイドル状態になると、エンドポイントインスタンスを自動的にゼロにスケールダウンすることが容易になります。また、レイテンシーの制約をなくすことで、高価な GPU の代わりに低価格の CPU インスタンスを使用することができます。図2は、非同期型文書要約処理のアーキテクチャの一例です。

このアプローチでは、ドキュメントは Amazon Simple Storage Service (Amazon S3) に置かれます。Amazon S3 は、業界最高レベルのスケーラビリティ、データの可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージサービスです。ドキュメントが置かれると Amazon S3 は、AWS Lambda 関数を起動します。この関数は、Amazon SageMaker のエンドポイントを呼び出します。エンドポイントは、出力された要約を Amazon S3 に保存し、アプリケーション間およびアプリケーションから個人への通信のための完全に管理されたメッセージングサービスである Amazon Simple Notification Service (Amazon SNS) で通知を送信します。オプションとして、Amazon Simple Queue Service (Amazon SQS) のキューを、Amazon SNS 通知にサブスクライブして下流のコンシューマーに要約結果をファンアウトすることが可能です。Amazon SQS はマイクロサービス、分散システム、およびサーバーレスアプリケーションのデカップリングとスケーリングを可能にする完全に管理されたメッセージキューイングサービスです。

図2:Amazon S3 に文書がアップロードされると文書要約が開始される非同期文書要約アーキテクチャの例

図2:Amazon S3 に文書がアップロードされると文書要約が開始される非同期文書要約アーキテクチャの例

デプロイのステップ

ここでは、Amazon S3 に保存されたドキュメントを要約する非同期エンドポイントをデプロイする例を説明します。すべてのコードは、この GitHub リポジトリからクローンできるノートブックにあります。

このサンプルに従うには、ML 用の完全統合開発環境である Amazon SageMaker Studio、または Jupyter Notebook App が動作する ML コンピュートインスタンスである Amazon SageMaker notebook インスタンスにアクセスする必要があります。Amazon SageMaker へのオンボーディングの手順は、こちらのドキュメントに記載されています。Hugging Face Hub から事前トレーニングされたモデルをロードする方法は、Amazon SageMaker Hugging Face 推論機能を発表したこちらの記事で説明しているように、いくつかの方法があります。ここでは、少し異なるアプローチを使用します。すなわち、Hugging Face Hub からモデルを手動でダウンロードし、Amazon SageMaker のモデルアーティファクトにパッケージングします。そうすることで、エンドポイントがスケールアウトしたり更新されたりするたびに Hugging Face Hub からロードする代わりに、モデルアーティファクトを独自の Amazon S3 バケットにホスティングすることができます。

以下のシェルコマンドを実行すると、Git Large File Storage (LFS) がインストールされるので、Git を使ってモデルレポジトリーをクローンできるようになります。ここでは、抽象型要約に使用できる distilbart-cnn-12-6 モデルをダウンロードします。

! curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
! apt-get install git-lfs
! git clone https://huggingface.co/sshleifer/distilbart-cnn-12-6

次に、トークナイザーとモデルを一つの model.tar にまとめます。

! cd distilbart-cnn-12-6 && tar --exclude=".*" -cvf  model.tar * && mv model.tar ../model.tar
! rm -r distilbart-cnn-12-6/

次に、推論時にモデルの読み込みと入力処理を行うカスタムエントリーポイントの Python スクリプトを作成します。ここでは、model_fn が事前トレーニング済みモデルをロードする役割を担います。事前に作成された model.tar.gz の内容は model_dir に展開され、model_fn の引数として渡されます。ここから、Hugging Face パイプラインのコンストラクトを使用して要約パイプラインを作成することができます。transform_fn は、エンドポイントが呼び出されたときの入力データを処理する役割を担っています。次の例では、テキストペイロードが要約パイプラインに渡されることを想定しています。

%%writefile src/sum_entrypoint.py
from transformers import BartTokenizer, BartForConditionalGeneration, BartConfig
from transformers import pipeline
import json
def model_fn(model_dir):
    
    tokenizer = BartTokenizer.from_pretrained(model_dir)
    model = BartForConditionalGeneration.from_pretrained(model_dir)
    nlp=pipeline("summarization", model=model, tokenizer=tokenizer)
    
    return nlp
def transform_fn(nlp, request_body, input_content_type, output_content_type="application/json"):
    
    if input_content_type == "text/csv":
        result = nlp(request_body, truncation=True)[0]
    
    else:
        raise Exception(f"Content {input_content_type} type not supported")
    
    return json.dumps(result)

カスタムエントリーポイントスクリプトを使用してエンドポイントをデプロイするには、スクリプトをモデルアーティファクトにパッケージ化する必要があります。次のコードは、エントリーポイントスクリプトを model.tar アーカイブに追加し、それを gzip で圧縮して最終的な model.tar.gz アーティファクトを作成します。

! tar rvf  model.tar code/sum_entrypoint.py
! gzip  model.tar model.tar.gz
! rm model.tar

次に、モデルアーティファクトを Amazon S3 にアップロードし、適切なマネージド推論コンテナイメージを検索する必要があります。Amazon SageMaker Python SDK は、Amazon SageMaker 上で ML モデルをトレーニングおよびデプロイするためのオープンソースライブラリで、高性能ホスティングを提供するフルマネージドコンテナーレジストリである Amazon Elastic Container Registry (Amazon ECR) 上の推論イメージの Amazon リソース名(ARN)を調べることができるヘルパー関数が提供されています。以下のコードでは、ディープラーニングフレームワークとして PyTorch 1.8.1 を基盤とする Hugging Face バージョン 4.6.1 推論イメージの ARN を取得しています。

s3_model_data = sess.upload_data("model.tar.gz", bucket, key_prefix)
inference_image_uri = image_uris.retrieve(
            "huggingface",
            region,
            version="4.6.1",
            py_version="py36",
            instance_type="ml.m5.xlarge",
            image_scope="inference",
            base_framework_version="pytorch1.8.1"
        ) 

Amazon ECR イメージ ARN とアーティファクトの組み合わせで、Amazon SageMaker のモデルリソースを作成するために必要なパーツがすべて揃いました。

sm_client = boto3.client("sagemaker")
smr_client = boto3.client("sagemaker-runtime")
model_name = "document-summarization"
create_model_response = sm_client.create_model(
    ModelName=model_name,
    ExecutionRoleArn=role,
    PrimaryContainer={
        "Image": inference_image_uri,
        "ModelDataUrl": s3_model_data,
        "Environment": {
            "SAGEMAKER_PROGRAM": "sum_entrypoint.py",
            "SAGEMAKER_CONTAINER_LOG_LEVEL": "20",
            "SAGEMAKER_REGION": region,
        },
    },
)
model_arn = create_model_response["ModelArn"]

次に、先に作成したモデルを用いて、エンドポイント構成をデプロイします。

endpoint_config_name = f"{model_name}-config"
endpoint_name = f"{model_name}-endpoint"

endpoint_config_response = sm_client.create_endpoint_config(
    EndpointConfigName=endpoint_config_name,
    ProductionVariants=[
        {
            "VariantName": "variant1",
            "ModelName": model_name,
            "InstanceType": "ml.m5.xlarge",
            "InitialInstanceCount": 1,
        }
    ],
    AsyncInferenceConfig={
        "OutputConfig": {
            "S3OutputPath": f"s3://{bucket}/{key_prefix}/async-output",
            # Optionally specify Amazon SNS topics
            # "NotificationConfig": {
            #   "SuccessTopic": "arn:aws:sns:us-east-2:123456789012:MyTopic",
            #   "ErrorTopic": "arn:aws:sns:us-east-2:123456789012:MyTopic",
            # }
        },
        "ClientConfig": {"MaxConcurrentInvocationsPerInstance": 4},
    },
)

最後に、以下のコードでエンドポイントをデプロイします。

create_endpoint_response = sm_client.create_endpoint(
    EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name
)

要約したいテキスト文書の Amazon S3 のオブジェクトキーを渡すことで、エンドポイントを呼び出すことができます。

response = smr_client.invoke_endpoint_async(
    EndpointName=endpoint_name, 
    InputLocation=f"s3://{bucket}/{key_prefix}/doc1.txt",
    ContentType="text/csv"
)

数秒後、呼び出しの出力を確認することができます。

result = sess.read_s3_file(bucket=bucket, key_prefix="/".join(response["OutputLocation"].split("/")[3:]))
print(result)

Amazon SageMaker Hugging Face の推論機能を発表した先述の記事のテキストに対してモデルを実行すると、以下のような結果が得られます。

{"summary_text": " Hugging Face is the technology startup, with an active open-source
 community, that drove the worldwide adoption of transformer-based models thanks to i
 ts eponymous Transformers library . We discuss different methods to create a 
 SageMaker endpoint for a Hugging face model . We also discuss how to train and 
 deploy models on Amazon SageMaker . Earlier this year, Huging Face and AWS 
 collaborated to enable you to train 10,000 pre-trained models ."}

まとめ

このブログでは、文書要約の様々なアプローチと、それらが M&E 組織にどのような利益をもたらすかを説明しました。Hugging Face Hub で利用できる事前トレーニング済みの要約モデルを Amazon SageMaker の非同期エンドポイントにデプロイする手法について説明しました。そして、そのエンドポイントをサンプル文書でテストし、その機能を実証しました。この機能により、M&E 企業はドキュメントの要約を行うために最先端の自然言語モデルを導入することができます。

Hugging Face 社について

Hugging Face のミッションは、良質で最先端の ML を民主化することです。私たちはこれを、オープンソース、オープンサイエンス、そしてプロダクトとサービスを通じて実現します。現在、Hugging Face は 20,000 以上の最先端のトランスフォーマーモデルと 1,600 以上の無料かつ利用可能なデータセットをオープンソース、そして ML ソリューションとして提供しています。Hugging Face についてもっと知りたい方はこちらをクリックしてください

Hugging Face Icon

翻訳はソリューションアーキテクト 前川 泰毅 が担当しました。原文はこちらです。