Amazon Web Services ブログ

Amazon SageMaker Serverless Inference — サーバーレスで推論用の機械学習モデルをデプロイ可能に

2021 年 12 月、Amazon SageMaker の新しいオプションとして Amazon SageMaker Serverless Inference (プレビュー中) を導入しました。これにより、基盤となるインフラストラクチャを設定または管理しなくても、推論用の機械学習 (ML) モデルをデプロイできるようになりました。2022 年4 月 21 日(米国時間)、Amazon SageMaker Serverless Inference が一般公開 (GA) になったことをお知らせいたします。

ML 推論のユースケースが異なれば、モデルホスティングインフラストラクチャの要件も異なります。広告配信、不正検出、パーソナライズされた製品レコメンデーションなどのユースケースに取り組む場合、応答時間が数ミリ秒と短い API ベースのオンライン推論を探している可能性が最も高いでしょう。コンピュータービジョン (CV) アプリケーションなどの大規模な ML モデルを扱う場合、大きなペイロードサイズで推論を数分で実行するように最適化されたインフラストラクチャが必要になることがあります。データセット全体、またはより大きなバッチのデータに対して予測を実行する場合は、モデル提供エンドポイントをホストする代わりに、オンデマンドの 1 回限りのバッチ推論ジョブを実行することをお勧めします。また、chatbot サービスや、フォームを処理したり、ドキュメントからデータを分析したりするアプリケーションなど、断続的なトラフィックパターンを持つアプリケーションがあるとしたらどうでしょうか。 この場合、推論リクエストの量に基づいてコンピューティングキャパシティを自動的にプロビジョニングおよびスケーリングできるオンライン推論オプションが必要になる場合があります。また、アイドル時間中は、課金されないように、コンピューティングキャパシティを完全にオフにできる必要があります。

フルマネージド型 ML サービスである Amazon SageMaker は、こうしたユースケースすべてをサポートするために、さまざまなモデル推論オプションを提供しています。

Amazon SageMaker Serverless Inference の詳細
ML 実践者との多くの対話の中で、私は完全にフルマネージド ML 推論オプションを求めることを取り上げました。これにより、すべてのモノのインフラストラクチャを管理しながら、推論コードの開発に集中できます。SageMaker Serverless Inference により、こうしたデプロイが容易になりました。

SageMaker Serverless Inference は、モデルが受け取る推論リクエストの量に基づいて、コンピューティングキャパシティーのプロビジョニング、スケーリング、オフを自動的に行います。その結果、推論コードを実行するためのコンピューティング時間と処理されたデータ量に対してのみ課金され、アイドル時間に対して料金は発生しません。

SageMaker の組み込みアルゴリズムと ML フレームワークを提供するコンテナを使用して、モデルを Serverless Inference エンドポイントにデプロイしたり、独自のコンテナを持ち込むことを選択したりできます。トラフィックが予測可能で安定したら、コンテナイメージに変更を加えることなく、Serverless Inference エンドポイントから SageMaker リアルタイムエンドポイントに簡単に更新できます。Serverless Inference を使用すると、呼び出し回数、障害、レイテンシー、ホストメトリクス、Amazon CloudWatch のエラーなどの組み込みメトリクスなど、SageMaker の機能も活用できます。

SageMaker Serverless Inference は、プレビュー版のリリース以降、SageMaker Python SDKモデルレジストリのサポートを追加しました。SageMaker Python SDK は、SageMaker で ML モデルを構築およびデプロイするためのオープンソースライブラリです。SageMaker モデルレジストリを使用すると、モデルのカタログ化、バージョン管理、実稼働環境へのデプロイが可能になります。

GA リリースの新機能として、SageMaker Serverless Inference により、エンドポイントあたりの最大同時呼び出し数の上限が 200 (プレビュー時は 50) に引き上げられ、トラフィックの多いワークロードに Amazon SageMaker Serverless Inference を使用できるようになりました。Amazon SageMaker Serverless Inference は、Amazon SageMaker が利用可能なすべての AWS リージョンで利用できるようになりました。ただし、AWS GovCloud (米国) および AWS 中国リージョンを除きます。

SageMaker Serverless Inference のメリットを既に享受し始めているお客様もいます。

Bazaarvoice は機械学習を活用してユーザー生成コンテンツをモデレートし、タイムリーで信頼できる方法でシームレスなショッピング体験をお客様に提供します。しかし、多様なクライアントベースでグローバル規模で運用するには、多種多様なモデルが必要であり、その多くはあまり使用されないか、コンテンツの大幅なバーストのために迅速に拡張する必要があります。Amazon SageMaker Serverless Inference は両方の長所を提供します。コンテンツのバースト時に迅速かつシームレスにスケーリングし、使用頻度の低いモデルのコストを削減します。」— Lou Kratz 氏、PhD、Bazaarvoice 主席研究エンジニア

トランスフォーマーが機械学習を変えました。Hugging Face は、自然言語処理から始まり、現在はオーディオとコンピュータービジョンで、企業全体で採用を促進しています。世界中の機械学習チームの新たなフロンティアは、大規模で強力なモデルを費用対効果の高い方法でデプロイすることです。Amazon SageMaker Serverless Inference をテストし、インフラストラクチャを抽象化しながら、断続的なトラフィックのワークロードのコストを大幅に削減することができました。Hugging Face モデルを SageMaker Serverless Inference でそのまま使えるようにし、お客様が機械学習のコストをさらに削減できるようにしました。」—Jeff Boudier 氏Hugging Face 製品担当ディレクター

それでは、SageMaker Serverless Inference を始める方法を見てみましょう。

このデモでは、「I love this product!」などの電子商取引の顧客レビューを表示するテキスト分類子を作成しました。ポジティブ (1)、ニュートラル (0)、ネガティブ (-1) のセンチメントに変換します。女性の E コマース衣料品レビューデータセットを使用して、Hugging Face Transformer からライブラリとモデルハブの RoBERTa モデルを微調整しました。ここでは、トレーニング済みモデルを Amazon SageMaker Serverless Inference エンドポイントにデプロイする方法を説明します。

Amazon SageMaker Serverless Inference エンドポイントにモデルをデプロイする
SageMaker コンソール、AWS SDK、SageMaker Python SDK、AWS CLI、または AWS CloudFormation を使用して、Serverless Inference エンドポイントを作成、更新、記述、および削除できます。この最初の例では、SageMaker Python SDK を使用します。これは、抽象化によってモデルのデプロイワークフローを単純化するためです。SageMaker Python SDK を使用して、ペイロードをリクエストに沿って渡すことでエンドポイントを呼び出すこともできます。少しだけお見せします。

まず、目的のサーバーレス構成でエンドポイント構成を作成しましょう。メモリサイズと同時呼び出しの最大数を指定できます。SageMaker Serverless Inference は、選択したメモリに比例してコンピューティングリソースを自動的に割り当てます。より大きなメモリサイズを選択すると、コンテナはより多くの vCPU にアクセスできるようになります。一般的な経験則として、メモリサイズは少なくともモデルサイズと同じ大きさでなければなりません。選択できるメモリサイズは、1024 MB、2048 MB、3072 MB、4096 MB、5120 MB、および 6144 MB です。私の RoBERTa モデルでは、メモリサイズを 5120 MB に設定し、最大で 5 つの同時呼び出しを設定してみましょう。

import sagemaker
from sagemaker.serverless import ServerlessInferenceConfig

serverless_config = ServerlessInferenceConfig(
	memory_size_in_mb=5120,
	max_concurrency=5
)

では、モデルをデプロイしましょう。 estimator.deploy () メソッドを使用して、Serverless Inference エンドポイント設定とともに SageMaker トレーニング推定器から直接モデルをデプロイできます。この例では、カスタム推論コードも提供します。


endpoint_name="roberta-womens-clothing-serverless-1"

estimator.deploy(
	endpoint_name = endpoint_name,
	entry_point="inference.py",
	serverless_inference_config=serverless_config
)

SageMaker Serverless Inference では、AWS SDK for Python (Boto3) を使用する場合、モデルレジストリもサポートされます。モデルレジストリからモデルをデプロイする方法については、この記事の後半で説明します。

Serverless Inference エンドポイントの設定とデプロイ状況を確認してみましょう。SageMaker コンソールに移動し、デプロイされた推論エンドポイントを参照します。

SageMaker コンソールで Amazon SageMaker サーバーレスエンドポイントの設定を確認する

SageMaker コンソールから、必要に応じて Serverless Inference エンドポイントを作成、更新、または削除することもできます。Amazon SageMaker Studio で、[エンドポイント] タブとServerless Inference エンドポイントを選択して、エンドポイント設定の詳細を確認します。

SageMaker Studio で Amazon SageMaker サーバーレスエンドポイントの設定を確認する

エンドポイントのステータスがInService になったら、推論リクエストの送信を開始できます。

ここで、いくつかのサンプル予測を実行してみましょう。微調整された私の RoBERTa モデルでは、JSON Lines 形式の推論リクエストとレビューテキストが入力フィーチャとして分類されることを想定しています。JSON Lines テキストファイルは複数の行で構成され、各行は有効な JSON オブジェクトで、改行文字で区切られます。これは、モデル推論などで、一度に 1 レコードずつ処理されるデータを保存するのに理想的な形式です。推論用の JSON 行やその他の一般的なデータ形式の詳細については、 Amazon SageMaker デベロッパーガイドを参照してください。次のコードは、モデルで受け入れられる推論リクエストの形式によって外観が異なる場合があることに注意してください。


from sagemaker.predictor import Predictor
from sagemaker.serializers import JSONLinesSerializer
from sagemaker.deserializers import JSONLinesDeserializer

sess = sagemaker.Session(sagemaker_client=sm)

inputs = [
    {"features": ["この商品が大好きです!"]},
    {"features": ["OK、でも良くない。"]},
    {"features": ["これは適切な製品ではありません。"]},
]

predictor = Predictor(
    endpoint_name=endpoint_name,
    serializer=JSONLinesSerializer(),
    deserializer=JSONLinesDeserializer(),
    sagemaker_session=sess
)

predicted_classes = predictor.predict(inputs)

for predicted_class in predicted_classes:
    print("Predicted class {} with probability {}".format(predicted_class['predicted_label'], predicted_class['probability']))

結果は次のようになります。サンプルレビューは対応するセンチメントクラスに分類されます。


Predicted class 1 with probability 0.9495596289634705
Predicted class 0 with probability 0.5395089387893677
Predicted class -1 with probability 0.7887083292007446

モデルレジストリから SageMaker Serverless Inference エンドポイントにモデルをデプロイすることもできます。これは現在 AWS SDK for Python (Boto3) でのみサポートされています。別の簡単なデモを見ていきましょう。

SageMaker モデルレジストリからのモデルのデプロイ
Boto3 を使用してモデルレジストリからモデルをデプロイするには、まず create_model () メソッドを呼び出して、モデルバージョンからモデルオブジェクトを作成しましょう。次に、モデルバージョンの Amazon リソースネーム(ARN) をモデルオブジェクトのコンテナの一部として渡します。

import boto3
import sagemaker

sm = boto3.client(service_name='sagemaker')
role = sagemaker.get_execution_role()
model_name="roberta-womens-clothing-serverless"

container_list = 
	[{'ModelPackageName': <MODEL_PACKAGE_ARN>}]

create_model_response = sm.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    Containers = container_list
)

次に、Serverless Inference エンドポイントを作成します。SageMaker コンソール、AWS SDK、SageMaker Python SDK、AWS CLI、または AWS CloudFormation を使用して、Serverless Inference エンドポイントを作成、更新、記述、および削除できることを忘れないでください。一貫性のために、この 2 番目の例では Boto3 を使い続けています。

最初の例と同様に、まず、目的のサーバーレス構成を使用してエンドポイント構成を作成します。エンドポイントのメモリサイズは 5120 MB で、同時呼び出しの最大数は 5 回です。

endpoint_config_name="roberta-womens-clothing-serverless-ep-config"

create_endpoint_config_response = sm.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=[{
        'ServerlessConfig':{
            'MemorySizeInMB' : 5120,
            'MaxConcurrency' : 5
        },
        'ModelName':model_name,
        'VariantName':'AllTraffic'}])

次に、create_endpoint() メソッドを呼び出して SageMaker Serverless Inference エンドポイントを作成します。


endpoint_name="roberta-womens-clothing-serverless-2"

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

エンドポイントのステータスがInService になったら、推論リクエストの送信を開始できます。ここでも、一貫性を保つために、Boto3 と SageMaker ランタイムクライアント invoke_endpoint () メソッドを使用してサンプル予測を実行することにしました。

sm_runtime = boto3.client("sagemaker-runtime")
response = sm_runtime.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType="application/jsonlines",
    Accept="application/jsonlines",
    Body=bytes('{"features": ["この商品が大好きです!"]}', 'utf-8')
)

print(response['Body'].read().decode('utf-8'))
{"probability": 0.966135561466217, "predicted_label": 1}

SageMaker Serverless Inference にモデルを最適化する方法
SageMaker Serverless Inference は、リクエストを処理するために、基盤となるコンピューティングリソースを自動的にスケーリングします。エンドポイントがしばらくトラフィックを受信しない場合、コンピューティングリソースはスケールダウンされます。エンドポイントが突然新しいリクエストを受信した場合、エンドポイントがコンピュートリソースをスケールアップしてリクエストを処理するまでに時間がかかることがあります。

このコールドスタート時間は、モデルサイズとコンテナの起動時間に大きく依存します。コールドスタート時間を最適化するために、たとえば、知識抽出量子化モデルプルーニングなどの手法を適用して、モデルのサイズを最小化することができます。

知識抽出では、より大きなモデル (教師モデル) を使用して、同じ課題を解決するためのより小さなモデル (学生モデル) をトレーニングします。量子化は、モデルパラメーターを表す数値の精度を 32 ビット浮動小数点数から 16 ビット浮動小数点または 8 ビット整数にまで下げます。モデルプルーニングでは、学習プロセスにほとんど影響しない冗長なモデルパラメーターが削除されます。

利用可能なリージョンと料金
Amazon SageMaker Serverless Inference は、Amazon SageMaker が利用可能なすべてのAWS リージョンで利用できるようになりました。ただし、AWS GovCloud (米国) および AWS 中国リージョンを除きます。

SageMaker Serverless Inference では、推論リクエストの処理に使用されたコンピューティングキャパシティ (ミリ秒単位) と処理されたデータ量に対してのみお支払いいただきます。コンピューティングキャパシティーの料金は、選択したメモリ構成によっても異なります。詳細な料金情報については、 SageMaker の料金ページをご覧ください。

Amazon SageMaker Serverless Inference を今すぐ始めましょう
Amazon SageMaker Serverless Inference の詳細については、Amazon SageMaker 機械学習推論ウェブページを参照してくださいSageMaker Serverless Inference のサンプルノートブックは、すぐに使い始めるのに役立ちます。SageMaker コンソールから試して、ご意見をお聞かせください。

Antje

原文はこちらです。