「パットスナップがAmazon SageMaker上で低遅延と低コストでGPT-2推論を使用した方法」

Method of using low-latency and low-cost GPT-2 inference with PatSnap on Amazon SageMaker

このブログ投稿は、Patsnapのシニア自然言語処理エンジニアであるZilong Baiによって共同執筆され、導入部分も含まれています。

GoogleやAmazonで何かを検索する際に、オートコンプリートの提案機能には馴染みがあるかもしれません。これらのシナリオでの検索キーワードは、一般的なキーワードや日常生活で使用する表現であることが多いですが、場合によってはシナリオに特化した非常に具体的な検索キーワードもあります。特許検索はその1つです。最近、AWS Generative AI Innovation CenterはPatsnapと協力して、イノベーションの探索として検索キーワードの自動提案機能を実装し、プラットフォーム上のユーザーエクスペリエンスを向上させるための機能を提供しました。

Patsnapは、特許検索、分析、管理のためのグローバルなワンストッププラットフォームを提供しています。彼らは過去の検索クエリの履歴などのビッグデータを使用して、多くの強力で使いやすい特許ツールを提供しています。これらのツールにより、Patsnapのグローバルな顧客は特許の理解を深め、最新の技術進歩を追跡し、イノベーションのトレンドを特定し、リアルタイムで競合他社を分析することができるようになりました。

同時に、Patsnapは機械学習(ML)の力を活用して、プラットフォーム上のユーザーエクスペリエンスを継続的に改善する機能を開発しています。最近の取り組みの1つは、最先端のテキスト生成モデルを使用して特許検索クエリの自動入力を行うことで、検索式の構築の難しさを簡素化することです。Patsnapはこの目的のためにカスタマイズされたGPT-2モデルを訓練しました。特許検索エンジンにはこのような既存の機能がないため(彼らの知る限りでは)、Patsnapはこの機能を追加することでエンドユーザーの利便性を向上させると信じています。

しかし、最近の実験では、PyTorchベースのGPT-2モデルの推論レイテンシと秒間クエリ数(QPS)が、そのビジネス価値を正当化するための特定の基準を満たすことができませんでした。この課題に取り組むために、AWS Generative AI Innovation Centerの科学者たちは、GPT-2の推論パフォーマンスを最適化するためのさまざまなソリューションを探求し、モデルのレイテンシを平均50%削減し、QPSを200%向上させる結果を得ました。

大規模言語モデルの推論の課題と最適化アプローチ

一般的に、実世界のプロダクション環境でこのような大規模なモデルを適用することは容易ではありません。PyTorchベースのGPT-2の計算コストとレイテンシは、ビジネス運用の観点から広く採用されることを難しくしています。このプロジェクトでは、妥当な計算コストでレイテンシを大幅に改善することを目的としています。具体的には、Patsnapは次のことを要求しています:

  • リアルタイム検索シナリオでの検索式の生成のためのモデル推論の平均レイテンシを600ミリ秒以内に制御する必要があります
  • ピーク時のビジネス時間中に大量の検索を行うために、モデルには高いスループットとQPSが必要です

この投稿では、Amazon Elastic Compute Cloud(Amazon EC2)インスタンスを使用したGPUベースのインスタンス、NVIDIA TensorRTを使用した技術的な詳細と、顧客の現状に基づく主要なメトリクスとの比較を紹介します。

続けて、WebTextデータセット(800万のウェブページを含む)でトレーニングされた1.5 billionパラメータを持つOpen AIのGPT-2モデルについて説明します。GPT-2は、与えられたテキスト内のすべての前の単語を考慮して、次の単語を予測するという単純な目標でトレーニングされています。データセットの多様性により、この単純な目標には、多くのタスクの自然発生的なデモンストレーションが含まれます。GPT-2は、入力をプライムし、長い続きを生成させることで、前例のない品質の条件付き合成テキストサンプルを生成する能力を持っています。この状況では、検索クエリの生成に利用します。GPTモデルがますます大きくなるにつれて、推論コストも増え続けており、適切なコストでこれらのモデルを展開する必要性が高まっています。

TensorRTを使用してGPUインスタンスで低レイテンシを実現する

TensorRTは、NVIDIAのGPUおよびディープラーニングアクセラレータ上で高性能な推論を行うためのC++ライブラリであり、PyTorchやTensorFlowなどの主要なディープラーニングフレームワークをサポートしています。以前の研究では、モデルのレイテンシに関して非常に優れたパフォーマンス改善が示されています。そのため、NVIDIAのGPU上でターゲットモデルのレイテンシを削減するためにTensorRTベースのモデルを使用することは理想的な選択肢です。

TensorRTベースのモデルを使用することで、NVIDIAのGPU上でGPT-2モデルの推論レイテンシを大幅に削減することができました。TensorRTベースのモデルは、パフォーマンステストのためにSageMakerを介して展開されています。この投稿では、元のPyTorchベースのGPT-2モデルをTensorRTベースのモデルに変換する手順を紹介します。

PyTorchベースのGPT-2をTensorRTベースのモデルに変換するのは、NVIDIAが提供する公式ツールを使用すれば難しくありません。また、このようなシンプルな変換によるモデルの精度の低下は観察されていません。一般的には、以下の3つの手順に従います:

  1. GPT-2の分析。現時点では、NVIDIAの変換ツールはHugging FaceのGPT-2モデルのみをサポートしています。現在のGPT-2モデルが元のバージョンではない場合は、それに合わせて修正する必要があります。Hugging FaceのオリジナルのGPT-2実装からカスタムコードを取り除くことをおすすめします。これは変換に非常に役立ちます。
  2. 必要なPythonパッケージのインストール。変換プロセスはまずPyTorchベースのモデルをONNXモデルに変換し、次にONNXベースのモデルをTensorRTベースのモデルに変換します。この2つのステップの変換には、次のPythonパッケージが必要です:
tabulate
toml
torch
sentencepiece==0.1.95
onnx==1.9.0
onnx_graphsurgeon
polygraphy
transformers
  1. モデルの変換。以下のコードには、2つのステップの変換のための関数が含まれています:
def torch2onnx():
    metadata = NetworkMetadata(variant=GPT2_VARIANT, precision=Precision(fp16=True), other=GPT2Metadata(kv_cache=False))
    gpt2 = GPT2TorchFile(model.to('cpu'), metadata)
    onnx_path = ('ONNXベースのモデルを保存するパスを指定') # 例: ./model_fp16.onnx
    gpt2.as_onnx_model(onnx_path, force_overwrite=False)
    return onnx_path, metadata
   
def onnx2trt(onnx_path, metadata):
    trt_path = 'TensorRTベースのモデルを保存するパスを指定' # 例: ./model_fp16.onnx.engine
    batch_size = 10
    max_sequence_length = 42
    profiles = [Profile().add(
        "input_ids",
        min=(1, 1),
        opt=(batch_size, max_sequence_length // 2),
        max=(batch_size, max_sequence_length),
    )]
    gpt2_engine = GPT2ONNXFile(onnx_path, metadata).as_trt_engine(output_fpath=trt_path, profiles=profiles)
    gpt2_trt = GPT2TRTDecoder(gpt2_engine, metadata, config, max_sequence_length=42, batch_size=10)

レイテンシの比較:PyTorch vs. TensorRT

このプロジェクトではパフォーマンスベンチマークとしてJMeterを使用しています。JMeterは、さまざまなサービスのパフォーマンスを分析・計測するための負荷テストツールとして使用できるApacheプロジェクトです。AWS P3.2xlargeインスタンス上で、元のPyTorchベースのモデルと変換されたTensorRTベースのGPT-2モデルのQPSとレイテンシを記録しています。後の記事で示すように、TensorRTの強力な加速能力により、GPT-2のレイテンシが大幅に低下しています。リクエストの同時実行数が1の場合、平均レイテンシは274ミリ秒(2.9倍高速)低下しました。QPSの観点からは、元のPyTorchベースのモデルと比較して、2.4から7に増加しています。さらに、同時実行数が増えるにつれて、QPSも増加しています。これは、受け入れ可能なレイテンシの増加(元のモデルよりもはるかに高速)とともに、より低いコストを示唆しています。

次の表は、レイテンシを比較しています:

. 同時実行数 QPS 最大レイテンシ 最小レイテンシ 平均レイテンシ
カスタムPyTorchバージョン(p3.2xlarge上) 1 2.4 632 105 417
2 3.1 919 168 636
3 3.4 1911 222 890
4 3.4 2458 277 1172
AWS TensorRTバージョン(p3.2xlarge上) 1 7 (+4.6) 275 22 143 (-274 ms)
2 7.2 (+4.1) 274 51 361 (-275 ms)
3 7.3 (+3.9) 548 49 404 (-486 ms)
4 7.5 (+4.1) 765 62 531 (-641 ms)

TensorRTベースのGPT-2をSageMakerとカスタムコンテナで展開する

TensorRTベースのGPT-2は比較的最新のTensorRTバージョンが必要ですので、モデルを展開するためにSageMakerのBring Your Own Container (BYOC)モードを選択します。BYOCモードでは、モデルの展開方法を柔軟に選ぶことができ、独自のDockerコンテナ内でカスタマイズされた環境を構築することができます。このセクションでは、独自のコンテナをビルドし、独自のGPT-2モデルを展開し、SageMakerエンドポイントAPIでテストする方法を説明します。

独自のコンテナをビルドする

コンテナのファイルディレクトリは以下のコードで示されています。具体的には、Dockerfilebuild.shはDockerコンテナをビルドするために使用されます。gpt2predictor.pyはモデルと推論APIを実装しています。servenginx.conf、およびwsgi.pyはNGINXウェブサーバーの設定を提供します。

container
├── Dockerfile    # このファイルを基にDockerコンテナをビルドする
├── build.sh      # 独自のイメージを作成してAmazon ECRにプッシュする
├── gpt2          # モデルディレクトリ
├── predictor.py  # モデルの呼び出しのためのバックエンド関数
├── serve         # ウェブサーバーの設定ファイル
├── nginx.conf    # ウェブサーバーの設定ファイル
└── wsgi.py       # ウェブサーバーの設定ファイル

コンテナをビルドするには、sh ./build.shを実行できます。

SageMakerエンドポイントに展開する

TensorRTベースのGPT-2を実行するためのコンテナをビルドした後、SageMakerエンドポイントを介してリアルタイムの推論を有効にすることができます。以下のコードスニペットを使用して、エンドポイントを作成し、モデルをエンドポイントに展開します。

import boto3from time import gmtime, strftime
from sagemaker import get_execution_role

sm_client = boto3.client(service_name='sagemaker')
runtime_sm_client = boto3.client(service_name='sagemaker-runtime')
account_id = boto3.client('sts').get_caller_identity()['Account']
region = boto3.Session().region_name
s3_bucket = '${S3バケット}'
role = get_execution_role()
model_name = '${モデル名}'
# まず、コンテナをS3にアップロードする必要があります
container = '${イメージパス}'
instance_type = 'ml.p3.2xlarge'
container = {
    'Image': container
}
create_model_response = sm_client.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    Containers = [container])
    
# エンドポイント設定
endpoint_config_name = '${エンドポイント設定名}'
print('エンドポイント設定名: ' + endpoint_config_name)
create_endpoint_config_response = sm_client.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[{
        'InstanceType': instance_type,
        'InitialInstanceCount': 1,
        'InitialVariantWeight': 1,
        'ModelName': model_name,
        'VariantName': 'AllTraffic'}])
print("エンドポイント設定ARN: " + create_endpoint_config_response['EndpointConfigArn'])

# モデルを展開
endpoint_name = '${エンドポイント名}'
print('エンドポイント名: ' + endpoint_name)
create_endpoint_response = sm_client.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name)
print('エンドポイントARN: ' + create_endpoint_response['EndpointArn'])
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp['EndpointStatus']
print("エンドポイントのステータス: " + status)
print('{}エンドポイントがサービスとして利用可能になるまで待機しています...'.format(endpoint_name))
waiter = sm_client.get_waiter('endpoint_in_service')
waiter.wait(EndpointName=endpoint_name)

展開されたモデルをテストする

モデルが正常に展開された後、SageMakerノートブックインスタンスを介してエンドポイントをテストすることができます。以下のコードを使用して、エンドポイントをテストできます。

import json
import boto3

sagemaker_runtime = boto3.client("sagemaker-runtime", region_name='us-east-2')
endpoint_name = "${エンドポイント名}"
request_body = {"input": "amazon"}
payload = json.dumps(request_body)
content_type = "application/json"
response = sagemaker_runtime.invoke_endpoint(
                            EndpointName=endpoint_name,
                            ContentType=content_type,
                            Body=payload # 自分のデータに置き換えてください
                            )
result = json.loads(response['Body'].read().decode())
print(result)

結論

この投稿では、SageMakerを使用して低遅延のGPT-2推論を有効にする方法について説明しました。具体的には、NVIDIA TensorRTのサポートにより、SageMakerでカスタマイズされたGPT-2モデルに対してNVIDIA GPUインスタンスで2.9倍の高速化を実現することができます。

GenAIモデルの利用を加速するためのお手伝いが必要な場合は、AWS Generative AI Innovation Centerにお問い合わせください。AWS Generative AI Innovation Centerは、アイデアをより迅速かつ効果的に現実化するお手伝いをします。Generative AI Innovation Centerを利用するためのスタートガイドは、こちらをご覧ください。

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

データサイエンス

「偉大なる遺伝子データの漏洩:知っておくべきこと」

A class action lawsuit has been launched against a genetic testing company for the protection of personal genetic dat...

AI研究

「ハロー効果:AIがサンゴ礁保護に深く関与する」

珊瑚礁の急速な衰退が世界中で進んでいる中、ハワイマノア大学の研究者たちは、空から珊瑚礁の健康を監視するAIベースの調査...

AI研究

この脳AIの研究では、安定した拡散を用いて脳波から画像を再現します

人間の視覚システムと似たように、世界を見て認識する人工システムを構築することは、コンピュータビジョンの重要な目標です...

機械学習

このAI論文では、新しい個別化留留過程を紹介していますクローズドソース相手からの適応的な学習により、オープンソースLLMsの強化を行います

シンガポールの南洋理工大学とセールスフォース・リサーチの研究者らは、学生モデルの初期の課題解決の試みと教師モデルによ...

機械学習

「GPT-4V(ビジョン)のコンセプトを理解する:新しい人工知能のトレンド」

OpenAIはAIの最新の進歩において、GPTやDALLEといった非常に優れたモデルを有しています。GPT-3のリリースは、テキストの要約...

AI研究

「Googleの研究者が球面上でのディープラーニングのためのJAX向けのオープンソースライブラリを紹介します」

ディープラーニングは、入力から複雑な表現を自動的に学習する機械学習の一部です。その応用は、言語処理のための画像と音声...