Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する | アマゾン ウェブ サービス

Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する | アマゾン ウェブ サービス

幅広い業界における生成 AI アプリケーションの成功は、競合他社の成果を再現して超えたり、新しくエキサイティングなユースケースを解決しようとしている世界中の企業の注目と関心を集めています。 これらの顧客は、生成型 AI イノベーションを推進するエンジンとして、TII Falcon、Stable Diffusion XL、OpenAI の GPT-3.5 などの基盤モデルを検討しています。

Foundation モデルは、トレーニングされた膨大な量の非構造化データのおかげで、人間のようなコンテンツを理解して生成できる生成 AI モデルのクラスです。 これらのモデルは、画像生成、翻訳、質問応答など、さまざまなコンピューター ビジョン (CV) および自然言語処理 (NLP) タスクに革命をもたらしました。 これらは多くの AI アプリケーションの構成要素として機能し、高度なインテリジェント システムの開発において重要なコンポーネントとなっています。

ただし、基盤モデルの展開には、特にコストとリソース要件の点で、重大な課題が伴う場合があります。 これらのモデルは、そのサイズが多くの場合、数億から数十億のパラメーターに及ぶことで知られています。 サイズが大きいため、強力なハードウェアや大量のメモリ容量を含む広範な計算リソースが必要になります。 実際、基礎モデルを展開するには、計算負荷を効率的に処理するために、通常、少なくとも 40 つ (多くの場合はそれ以上) の GPU が必要です。 たとえば、TII Falcon-5.12B Instruct モデルはメモリに正常にロードされるために少なくとも ml.g24xlarge インスタンスを必要としますが、より大きなインスタンスで最高のパフォーマンスを発揮します。 その結果、これらのモデルの導入と保守の投資収益率 (ROI) が低すぎて、特に開発サイクル中や急激なワークロードの場合には、ビジネス価値を証明できない可能性があります。 これは、長時間 (場合によっては 7 時間 XNUMX 日) のセッションで GPU を利用したインスタンスを使用することによるランニング コストが原因です。

今年初めに発表しました アマゾンの岩盤、Amazon および生成 AI パートナーの基盤モデルにアクセスするためのサーバーレス API。 現在プライベート プレビュー段階ですが、サーバーレス API を使用すると、エンドポイントを自分でデプロイすることなく、Amazon、Anthropic、Stability AI、AI21 の基盤モデルを使用できます。 ただし、Hugging Face などのコミュニティのオープンソース モデルは大幅に成長しており、そのすべてが Amazon Bedrock を通じて利用できるようになっているわけではありません。

この投稿では、これらの状況をターゲットにし、大規模な基礎モデルをデプロイすることで高コストのリスクを伴う問題を解決します。 アマゾンセージメーカー 非同期エンドポイント から Amazon SageMaker ジャンプスタート。 これにより、アーキテクチャのコストを削減でき、リクエストがキューにある場合にのみ有効期間が短いエンドポイントを実行できるようになり、サービスを待機しているリクエストが存在しない場合はゼロにスケールダウンできます。 これは多くのユースケースにとって素晴らしいことのように思えます。 ただし、ゼロにスケールダウンしたエンドポイントでは、推論を実行できるようになるまでにコールド スタート時間が発生します。

ソリューションの概要

次の図は、ソリューションアーキテクチャを示しています。

Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。

私たちが導入するアーキテクチャは非常に単純です。

  • ユーザー インターフェイスはノートブックであり、Streamlit または同様のテクノロジーに基づいて構築された Web UI に置き換えることができます。 私たちの場合、ノートブックは Amazon SageMakerスタジオ ノートブック。PyTorch 5 Python 2.0 CPU カーネルを備えた ml.m3.10.large インスタンス上で実行されます。
  • ノートブックは、SageMaker Python SDK、AWS SDK for Python (Boto3)、LangChain の XNUMX つの方法でエンドポイントにクエリを実行します。
  • エンドポイントは SageMaker 上で非同期的に実行されており、エンドポイント上に Falcon-40B Instruct モデルをデプロイします。 これは現在、命令モデルの点で最先端のものであり、SageMaker JumpStart で利用できます。 単一の API 呼び出しで、モデルをエンドポイントにデプロイできます。

SageMaker 非同期推論とは

SageMaker 非同期推論は、リアルタイム エンドポイント、バッチ推論、およびサーバーレス推論とともに、SageMaker の XNUMX つのデプロイメント オプションの XNUMX つです。 さまざまな展開オプションの詳細については、次を参照してください。 推論用のモデルをデプロイする.

SageMaker の非同期推論は、受信リクエストをキューに入れて非同期で処理するため、このオプションは最大 1 GB までの大きなペイロード サイズ、長い処理時間、およびほぼリアルタイムのレイテンシー要件を持つリクエストに最適です。 ただし、大規模な基礎モデルを扱う場合、特に概念実証 (POC) または開発中に提供される主な利点は、リクエストがない場合にインスタンス数をゼロにスケールインするように非同期推論を構成できる機能です。プロセスを実行し、コストを節約します。 SageMaker 非同期推論の詳細については、以下を参照してください。 非同期推論. 次の図は、このアーキテクチャを示しています。

Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。

非同期推論エンドポイントをデプロイするには、 AsyncInferenceConfig 物体。 作成する場合 AsyncInferenceConfig 引数を指定しない場合、デフォルト S3OutputPath なります s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-outputs/{UNIQUE-JOB-NAME} および S3FailurePath なります s3://sagemaker-{REGION}-{ACCOUNTID}/async-endpoint-failures/{UNIQUE-JOB-NAME}.

SageMaker JumpStart とは

私たちのモデルは、事前トレーニングされたモデル、ソリューション テンプレート、サンプル ノートブックを提供することで機械学習 (ML) の取り組みを加速する SageMaker の機能である SageMaker JumpStart から来ています。 これにより、さまざまな問題タイプに対応する幅広い事前トレーニング済みモデルへのアクセスが提供され、強固な基盤から ML タスクを開始できるようになります。 SageMaker JumpStart は、一般的なユースケース用のソリューション テンプレートと学習用のサンプル ノートブックも提供します。 SageMaker JumpStart を使用すると、ワンクリックでソリューションを起動し、実践的な ML 体験のための包括的なリソースを利用して、ML プロジェクトを開始するのに必要な時間と労力を削減できます。

次のスクリーンショットは、SageMaker JumpStart UI で利用可能なモデルのほんの一部の例を示しています。

Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。

モデルを展開する

最初のステップは、モデルを SageMaker にデプロイすることです。 これを行うには、SageMaker JumpStart の UI または SageMaker Python SDK を使用できます。これは、モデルを非同期エンドポイントにデプロイするために使用できる API を提供します。

%%time
from sagemaker.jumpstart.model import JumpStartModel, AsyncInferenceConfig
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer model_id, model_version = "huggingface-llm-falcon-40b-instruct-bf16", "*"
my_model = JumpStartModel(model_id=model_id)
predictor = my_model.deploy( initial_instance_count=0, instance_type="ml.g5.12xlarge", async_inference_config=AsyncInferenceConfig()
)

この通話が完了するまでに約 10 分かかる場合があります。 この間、エンドポイントがスピンアップされ、コンテナとモデル アーティファクトがエンドポイントにダウンロードされ、モデル設定が SageMaker JumpStart からロードされ、非同期エンドポイントが DNS エンドポイント経由で公開されます。 エンドポイントをゼロにスケールダウンできるようにするには、Application Auto Scaling を使用して非同期エンドポイントで自動スケーリングを構成する必要があります。 まずエンドポイント バリアントを Application Auto Scaling に登録し、スケーリング ポリシーを定義してから、そのスケーリング ポリシーを適用する必要があります。 この構成では、次のカスタム メトリックを使用します。 CustomizedMetricSpecification ApproximateBacklogSizePerInstance、次のコードに示すように。 詳細なリストについては、 アマゾンクラウドウォッチ 非同期推論エンドポイントで利用可能なメトリクスについては、を参照してください。 CloudWatch によるモニタリング.

import boto3 client = boto3.client("application-autoscaling")
resource_id = "endpoint/" + my_model.endpoint_name + "/variant/" + "AllTraffic" # Configure Autoscaling on asynchronous endpoint down to zero instances
response = client.register_scalable_target( ServiceNamespace="sagemaker", ResourceId=resource_id, ScalableDimension="sagemaker:variant:DesiredInstanceCount", MinCapacity=0, # Miminum number of instances we want to scale down to - scale down to 0 to stop incurring in costs MaxCapacity=1, # Maximum number of instances we want to scale up to - scale up to 1 max is good enough for dev
) response = client.put_scaling_policy( PolicyName="Invocations-ScalingPolicy", ServiceNamespace="sagemaker", # The namespace of the AWS service that provides the resource. ResourceId=resource_id, # Endpoint name ScalableDimension="sagemaker:variant:DesiredInstanceCount", # SageMaker supports only Instance Count PolicyType="TargetTrackingScaling", # 'StepScaling'|'TargetTrackingScaling' TargetTrackingScalingPolicyConfiguration={ "TargetValue": 5.0, # The target value for the metric. - here the metric is - SageMakerVariantInvocationsPerInstance "CustomizedMetricSpecification": { "MetricName": "ApproximateBacklogSizePerInstance", "Namespace": "AWS/SageMaker", "Dimensions": [{"Name": "EndpointName", "Value": my_model.endpoint_name}], "Statistic": "Average", }, "ScaleInCooldown": 600, # The amount of time, in seconds, after a scale in activity completes before another scale in activity can start. "ScaleOutCooldown": 300, # ScaleOutCooldown - The amount of time, in seconds, after a scale out activity completes before another scale out activity can start. # 'DisableScaleIn': True|False - indicates whether scale in by the target tracking policy is disabled. # If the value is true, scale in is disabled and the target tracking policy won't remove capacity from the scalable resource. },
)

このポリシーが正常に設定されたことを確認するには、SageMaker コンソールに移動して、 エンドポイント推論 ナビゲーション ペインで、先ほどデプロイしたエンドポイントを探します。

Amazon SageMaker 非同期エンドポイントを使用して Amazon SageMaker JumpStart 基盤モデルのデプロイメントコストを最適化する |アマゾン ウェブ サービス PlatoBlockchain データ インテリジェンス。垂直検索。あい。

非同期エンドポイントを呼び出す

エンドポイントを呼び出すには、リクエスト ペイロードを Amazon シンプル ストレージ サービス (Amazon S3) の一部としてこのペイロードへのポインターを提供します。 InvokeEndpointAsync リクエスト。 呼び出し時に、SageMaker は処理リクエストをキューに入れ、識別子と出力場所を応答として返します。 処理時に、SageMaker は結果を Amazon S3 の場所に配置します。 オプションで、成功またはエラーの通知を受け取ることを選択できます。 Amazon シンプル通知サービス (AmazonSNS)。

SageMaker Python SDK

デプロイメントが完了すると、 AsyncPredictor 物体。 非同期推論を実行するには、データを Amazon S3 にアップロードし、 predict_async() S3 URI を入力として使用するメソッド。 返されます AsyncInferenceResponse オブジェクトを使用して結果を確認できます。 get_response() 方法。

あるいは、結果を定期的にチェックし、生成時に結果を返したい場合は、 predict() 方法。 この XNUMX 番目のメソッドを次のコードで使用します。

import time # Invoking the asynchronous endpoint with the SageMaker Python SDK
def query_endpoint(payload): """Query endpoint and print the response""" response = predictor.predict_async( data=payload, input_path="s3://{}/{}".format(bucket, prefix), ) while True: try: response = response.get_result() break except: print("Inference is not ready ...") time.sleep(5) print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {response[0]['generated_text']}") query_endpoint(payload)

ボト3

では、次のことを調べてみましょう invoke_endpoint_async Boto3 のメソッド sagemaker-runtime クライアント。 これにより、開発者は SageMaker エンドポイントを非同期的に呼び出し、進行状況の追跡と後で応答を取得するためのトークンを提供できるようになります。 Boto3 には、SageMaker Python SDK のように非同期推論が完了するのを待つ方法がありません。 get_result() 手術。 したがって、Boto3 が推論出力を Amazon S3 に保存するという事実を利用します。 response["OutputLocation"]。 次の関数を使用して、推論ファイルが Amazon S3 に書き込まれるのを待機できます。

import json
import time
import boto3
from botocore.exceptions import ClientError s3_client = boto3.client("s3") # Wait until the prediction is generated
def wait_inference_file(bucket, prefix): while True: try: response = s3_client.get_object(Bucket=bucket, Key=prefix) break except ClientError as ex: if ex.response['Error']['Code'] == 'NoSuchKey': print("Waiting for file to be generated...") time.sleep(5) next else: raise except Exception as e: print(e.__dict__) raise return response

この関数を使用して、エンドポイントをクエリできるようになりました。

# Invoking the asynchronous endpoint with the Boto3 SDK
import boto3 sagemaker_client = boto3.client("sagemaker-runtime") # Query the endpoint function
def query_endpoint_boto3(payload): """Query endpoint and print the response""" response = sagemaker_client.invoke_endpoint_async( EndpointName=my_model.endpoint_name, InputLocation="s3://{}/{}".format(bucket, prefix), ContentType="application/json", Accept="application/json" ) output_url = response["OutputLocation"] output_prefix = "/".join(output_url.split("/")[3:]) # Read the bytes of the file from S3 in output_url with Boto3 output = wait_inference_file(bucket, output_prefix) output = json.loads(output['Body'].read())[0]['generated_text'] # Emit output print(f"33[1m Input:33[0m {payload['inputs']}") print(f"33[1m Output:33[0m {output}") query_endpoint_boto3(payload)

ラングチェーン

LangChain は、Harrison Chase によって 2022 年 XNUMX 月に開始されたオープンソース フレームワークです。 さまざまなシステムやデータ ソースとの統合を提供することで、大規模言語モデル (LLM) を使用したアプリケーションの開発を簡素化します。 LangChain を使用すると、ドキュメント分析、要約、チャットボット作成、コード分析などが可能になります。 何百もの開発者からの貢献とベンチャー企業からの多額の資金提供により、人気が高まりました。 LangChain を使用すると、LLM と外部ソースとの接続が可能になり、動的でデータ応答性の高いアプリケーションを作成できるようになります。 開発プロセスを合理化するためのライブラリ、API、およびドキュメントを提供します。

LangChain は、そのフレームワークで SageMaker エンドポイントを使用するためのライブラリとサンプルを提供し、SageMaker でホストされている ML モデルをチェーンの「頭脳」として簡単に使用できるようにします。 LangChain が SageMaker とどのように統合されるかについて詳しくは、以下を参照してください。 SageMaker エンドポイント LangChain のドキュメントに記載されています。

LangChain の現在の実装の制限の XNUMX つは、非同期エンドポイントをネイティブにサポートしていないことです。 LangChain に非同期エンドポイントを使用するには、新しいクラスを定義する必要があります。 SagemakerAsyncEndpointを拡張します。 SagemakerEndpoint クラスは LangChain ですでに利用可能です。 さらに、次の情報も提供します。

  • 非同期推論が入力 (および出力) を保存する S3 バケットとプレフィックス
  • タイムアウトするまでに待機する最大秒数
  • An updated _call() エンドポイントをクエリする関数 invoke_endpoint_async() invoke_endpoint()
  • コールド スタート (ゼロにスケールダウン) の場合に非同期エンドポイントをウェイクアップする方法

新しく作成したものを確認するには SagemakerAsyncEndpointには、チェックアウトすることができます sagemaker_async_endpoint.py file GitHubで利用可能.

from typing import Dict
from langchain import PromptTemplate
from langchain.llms.sagemaker_endpoint import LLMContentHandler
from langchain.chains import LLMChain
from sagemaker_async_endpoint import SagemakerAsyncEndpoint class ContentHandler(LLMContentHandler): content_type:str = "application/json" accepts:str = "application/json" len_prompt:int = 0 def transform_input(self, prompt: str, model_kwargs: Dict) -> bytes: self.len_prompt = len(prompt) input_str = json.dumps({"inputs": prompt, "parameters": {"max_new_tokens": 100, "do_sample": False, "repetition_penalty": 1.1}}) return input_str.encode('utf-8') def transform_output(self, output: bytes) -> str: response_json = output.read() res = json.loads(response_json) ans = res[0]['generated_text'] return ans chain = LLMChain( llm=SagemakerAsyncEndpoint( input_bucket=bucket, input_prefix=prefix, endpoint_name=my_model.endpoint_name, region_name=sagemaker.Session().boto_region_name, content_handler=ContentHandler(), ), prompt=PromptTemplate( input_variables=["query"], template="{query}", ),
) print(chain.run(payload['inputs']))

クリーンアップ

エンドポイントからの推論の生成のテストが完了したら、追加料金の発生を避けるために必ずエンドポイントを削除してください。

predictor.delete_endpoint()

まとめ

TII Falcon のような大規模な基礎モデルを導入する場合、コストの最適化が非常に重要です。 これらのモデルには強力なハードウェアと大量のメモリ容量が必要であり、インフラストラクチャのコストが高くなります。 SageMaker 非同期推論は、リクエストを非同期的に処理するデプロイメント オプションであり、保留中のリクエストがない場合にインスタンス数をゼロにスケールすることで経費を削減します。 この投稿では、大規模な SageMaker JumpStart 基盤モデルを SageMaker 非同期エンドポイントにデプロイする方法を説明しました。 非同期エンドポイントを呼び出して結果を取得するさまざまな方法を説明するために、SageMaker Python SDK、Boto3、および LangChain を使用したコード例を提供しました。 これらの技術により、開発者や研究者は高度な言語理解システムの基礎モデルの機能を利用しながらコストを最適化できます。

非同期推論と SageMaker JumpStart について詳しくは、次の投稿をご覧ください。


著者,

ダビデの写真ダビデガリテッリ は、EMEA地域のAI/MLのスペシャリストソリューションアーキテクトです。 彼はブリュッセルを拠点とし、ベネルクス全体の顧客と緊密に協力しています。 彼は幼い頃から開発者であり、7歳でコーディングを始めました。大学でAI / MLを学び始め、それ以来、AI/MLに夢中になっています。

タイムスタンプ:

より多くの AWS機械学習