「パットスナップが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はこの機能を追加することでエンドユーザーの利便性を向上させると信じています。
- 「Amazon EC2 Inf1&Inf2インスタンス上のFastAPIとPyTorchモデルを使用して、AWS Inferentiaの利用を最適化する」
- 「GoogleやOpenAIなどの主要なテック企業がAIの安全性に関する取り組みを約束」
- 「Llama 2の機能を実世界のアプリケーションに活用する:FastAPI、Celery、Redis、およびDockerを使用したスケーラブルなチャットボットの構築」
しかし、最近の実験では、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つの手順に従います:
- GPT-2の分析。現時点では、NVIDIAの変換ツールはHugging FaceのGPT-2モデルのみをサポートしています。現在のGPT-2モデルが元のバージョンではない場合は、それに合わせて修正する必要があります。Hugging FaceのオリジナルのGPT-2実装からカスタムコードを取り除くことをおすすめします。これは変換に非常に役立ちます。
- 必要なPythonパッケージのインストール。変換プロセスはまずPyTorchベースのモデルをONNXモデルに変換し、次にONNXベースのモデルをTensorRTベースのモデルに変換します。この2つのステップの変換には、次のPythonパッケージが必要です:
tabulate
toml
torch
sentencepiece==0.1.95
onnx==1.9.0
onnx_graphsurgeon
polygraphy
transformers
- モデルの変換。以下のコードには、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でテストする方法を説明します。
独自のコンテナをビルドする
コンテナのファイルディレクトリは以下のコードで示されています。具体的には、Dockerfile
とbuild.sh
はDockerコンテナをビルドするために使用されます。gpt2
とpredictor.py
はモデルと推論APIを実装しています。serve
、nginx.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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「汗をかくロボットが、人々が高温による影響を理解するのを助けるかもしれない」という記事がありました
- 「他のAIを教えるAI」
- 「Googleによる無料の生成AIコース」
- 「AIの責任ある適用を促進するための社会的なコンテキスト知識の活用」
- フェイブルスタジオは、TV番組の完全に新しいエピソードを書き、制作し、監督し、アニメーション化し、さらには声を担当できるAIプラットフォームであるSHOW-1をリリースしました
- 「Appleの次の動き:『Apple GPT』の開発と最先端の生成型AIツールの開発によるOpenAIへの挑戦」
- 生産性のパラノイアを打破する:Microsoft 365コパイロットには賛成ですか?