SageMaker を使用して Amazon でモデルを作成する ModelBuilder - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

SageMaker を使用して Amazon でモデルを作成する ModelBuilder

SageMaker エンドポイントにデプロイするモデルの準備には、モデルイメージの選択、エンドポイント設定のセットアップ、サーバーとクライアントとの間でデータを転送するためのシリアル化および逆シリアル化関数のコーディング、モデルの依存関係の特定、Amazon S3 へのアップロードなど、複数のステップが必要です。 ModelBuilder は、初期セットアップとデプロイの複雑さを軽減し、1 つのステップでデプロイ可能なモデルを作成するのに役立ちます。

ModelBuilder は、次のタスクを自動的に実行します。

  • XGBoost や などのさまざまなフレームワークを使用してトレーニングされた機械学習モデル PyTorch を、1 ステップでデプロイ可能なモデルに変換します。

  • モデルフレームワークに基づいてコンテナの自動選択を実行するため、コンテナを手動で指定する必要はありません。独自の URI を に渡すことで、独自のコンテナを持ち込むことができますModelBuilder

  • データをサーバーに送信して、サーバーから返される結果の推論と逆シリアル化を行う前に、クライアント側でデータのシリアル化を処理します。データは、手動処理なしで正しくフォーマットされます。

  • 依存関係の自動キャプチャを有効にし、モデルサーバーの期待に応じてモデルをパッケージ化します。 の依存関係ModelBuilderの自動キャプチャは、依存関係を動的にロードするためのベストエフォート型のアプローチです。(自動キャプチャをローカルでテストし、ニーズに合わせて依存関係を更新することをお勧めします)。

  • 大規模言語モデル (LLM) のユースケースでは、 はオプションでサービングプロパティのローカルパラメータチューニングを実行し、 SageMaker エンドポイントでホストするときにパフォーマンスを向上させるためにデプロイできます。

  • 、Triton TorchServe、DJLServing、TGI コンテナなどの一般的なモデルサーバーとコンテナのほとんどをサポートします。

でモデルを構築する ModelBuilder

ModelBuilder は、XGBoost や などのフレームワークモデル PyTorch、またはユーザーが指定した推論仕様を受け取り、デプロイ可能なモデルに変換する Python クラスです。 ModelBuilderは、デプロイ用のアーティファクトを生成するビルド関数を提供します。生成されるモデルアーティファクトはモデルサーバーに固有であり、入力の 1 つとして指定することもできます。ModelBuilder クラスの詳細については、「」を参照してくださいModelBuilder

次の図は、 を使用する場合のモデル作成ワークフロー全体を示していますModelBuilder。 は、モデルまたは推論の仕様をスキーマとともにModelBuilder受け入れ、デプロイ前にローカルでテストできるデプロイ可能なモデルを作成します。

を使用したモデルの作成とデプロイのフローの図ModelBuilder。このイメージは、 がスキーマとモデル (または推論仕様) ModelBuilderを受け取り、 にデプロイする前にローカルでテストできるデプロイ可能なModelオブジェクトを作成する方法を示しています SageMaker。

ModelBuilder は、適用するカスタマイズを処理できます。ただし、フレームワークモデルをデプロイするために、モデルビルダーは少なくともモデル、サンプル入出力、および ロールを想定しています。次のコード例では、 ModelBuilderがフレームワークモデルと最小引数SchemaBuilderを持つ のインスタンスで呼び出されます (エンドポイントの入出力をシリアル化および逆シリアル化するための対応する関数を推測するため)。コンテナが指定されておらず、パッケージ化された依存関係も渡されません。モデルの構築時にこれらのリソースSageMaker が自動的に推測されます。

from sagemaker.serve.builder.model_builder import ModelBuilder from sagemaker.serve.builder.schema_builder import SchemaBuilder model_builder = ModelBuilder( model=model, schema_builder=SchemaBuilder(input, output), role_arn="execution-role", )

次のコードサンプルは、追加のカスタマイズModelBuilderをしながら、モデルの代わりに推論仕様 (InferenceSpecインスタンスとして) を使用して を呼び出します。この場合、Model Builder への呼び出しには、モデルアーティファクトを保存するパスが含まれ、使用可能なすべての依存関係の自動キャプチャも有効になります。の詳細についてはInferenceSpec、「」を参照してくださいリクエストのモデルのロードと処理をカスタマイズする

model_builder = ModelBuilder( mode=Mode.LOCAL_CONTAINER, model_path=model-artifact-directory, inference_spec=your-inference-spec, schema_builder=SchemaBuilder(input, output), role_arn=execution-role, dependencies={"auto": True} )

シリアル化と逆シリアル化の方法を定義する

SageMaker エンドポイントを呼び出すと、データは異なる MIME タイプの HTTP ペイロードを介して送信されます。例えば、推論のためにエンドポイントに送信されるイメージは、クライアント側でバイトに変換し、HTTP ペイロードを介してエンドポイントに送信する必要があります。エンドポイントはペイロードを受け取ると、バイト文字列をモデルで想定されるデータ型に逆シリアル化する必要があります (サーバー側の逆シリアル化とも呼ばれます)。モデルが予測を完了したら、結果を HTTP ペイロードを介してユーザーまたはクライアントに送信できるバイトにシリアル化する必要もあります。クライアントが応答バイトデータを受信すると、クライアント側の逆シリアル化を実行してバイトデータを JSON などの想定されるデータ形式に戻す必要があります。少なくとも、次のタスクのデータを変換する必要があります。

  1. 推論リクエストのシリアル化 (クライアントによって処理)

  2. 推論リクエストの逆シリアル化 (サーバーまたはアルゴリズムによって処理)

  3. ペイロードに対してモデルを呼び出し、レスポンスペイロードを送り返す

  4. 推論レスポンスのシリアル化 (サーバーまたはアルゴリズムによって処理)

  5. 推論レスポンスの逆シリアル化 (クライアントによって処理)

次の図は、エンドポイントを呼び出すときに発生するシリアル化および逆シリアル化プロセスを示しています。

クライアントからサーバーへのデータのシリアル化と逆シリアル化の図。

にサンプル入力と出力を指定するとSchemaBuilder、スキーマビルダーは入力と出力をシリアル化および逆シリアル化するための対応するマーシャリング関数を生成します。を使用して、シリアル化関数をさらにカスタマイズできますCustomPayloadTranslator。ただし、ほとんどの場合、次のような単純なシリアライザーが機能します。

input = "How is the demo going?" output = "Comment la démo va-t-elle?" schema = SchemaBuilder(input, output)

の詳細についてはSchemaBuilder、「」を参照してくださいSchemaBuilder

次のコードスニペットは、クライアント側とサーバー側でシリアル化関数と逆シリアル化関数の両方をカスタマイズする例を示しています。を使用して独自のリクエストとレスポンスのトランスレーターを定義CustomPayloadTranslatorし、これらのトランスレーターを に渡すことができますSchemaBuilder

トランスレーターに入力と出力を含めることで、モデルビルダーはモデルが期待するデータ形式を抽出できます。例えば、サンプル入力が未加工の画像で、カスタムトランスレーターが画像をトリミングし、トリミングした画像をテンソルとしてサーバーに送信するとします。 は、クライアント側とサーバー側の両方でデータを変換する方法を導き出すために、未加工の入力とカスタムの前処理または後処理コードの両方ModelBuilderを必要とします。

from sagemaker.serve import CustomPayloadTranslator # request translator class MyRequestTranslator(CustomPayloadTranslator): # This function converts the payload to bytes - happens on client side def serialize_payload_to_bytes(self, payload: object) -> bytes: # converts the input payload to bytes ... ... return //return object as bytes # This function converts the bytes to payload - happens on server side def deserialize_payload_from_stream(self, stream) -> object: # convert bytes to in-memory object ... ... return //return in-memory object # response translator class MyResponseTranslator(CustomPayloadTranslator): # This function converts the payload to bytes - happens on server side def serialize_payload_to_bytes(self, payload: object) -> bytes: # converts the response payload to bytes ... ... return //return object as bytes # This function converts the bytes to payload - happens on client side def deserialize_payload_from_stream(self, stream) -> object: # convert bytes to in-memory object ... ... return //return in-memory object

次の例に示すように、 SchemaBuilder オブジェクトを作成するときに、サンプルの入力と出力を、以前に定義したカスタムトランスレータとともに渡します。

my_schema = SchemaBuilder( sample_input=image, sample_output=output, input_translator=MyRequestTranslator(), output_translator=MyResponseTranslator() )

次に、サンプル入出力を、前に定義したカスタムトランスレータとともに SchemaBuilder オブジェクトに渡します。

my_schema = SchemaBuilder( sample_input=image, sample_output=output, input_translator=MyRequestTranslator(), output_translator=MyResponseTranslator() )

以下のセクションでは、 を使用してモデルを構築しModelBuilder、サポートクラスを使用してユースケースのエクスペリエンスをカスタマイズする方法について詳しく説明します。

リクエストのモデルのロードと処理をカスタマイズする

を通じて独自の推論コードInferenceSpecを提供すると、カスタマイズレイヤーが追加されます。を使用するとInferenceSpec、モデルのロード方法と受信推論リクエストの処理方法をカスタマイズでき、デフォルトのロードと推論処理のメカニズムを回避できます。この柔軟性は、非標準モデルやカスタム推論パイプラインで作業する場合に特に便利です。invoke メソッドをカスタマイズして、モデルが受信リクエストを前処理および後処理する方法を制御できます。invoke メソッドは、モデルが推論リクエストを正しく処理することを確実にします。次の例ではInferenceSpec、 を使用して HuggingFace パイプラインでモデルを生成します。の詳細についてはInferenceSpec、「」を参照してくださいInferenceSpec

from sagemaker.serve.spec.inference_spec import InferenceSpec from transformers import pipeline class MyInferenceSpec(InferenceSpec): def load(self, model_dir: str): return pipeline("translation_en_to_fr", model="t5-small") def invoke(self, input, model): return model(input) inf_spec = MyInferenceSpec() model_builder = ModelBuilder( inference_spec=your-inference-spec, schema_builder=SchemaBuilder(X_test, y_pred) )

次の例は、前の例のよりカスタマイズされたバリエーションを示しています。モデルは、依存関係を持つ推論仕様で定義されます。この場合、推論仕様のコードは、言語セグメントパッケージによって異なります。の 引数には、Git を使用して lang-segment をインストールするようビルダーに指示する ステートメントdependenciesが含まれています。モデルビルダーは依存関係をカスタムインストールするようにユーザーによって指示されるため、autoキーは依存関係の自動キャプチャをオフにFalseすることです。

model_builder = ModelBuilder( mode=Mode.LOCAL_CONTAINER, model_path=model-artifact-directory, inference_spec=your-inference-spec, schema_builder=SchemaBuilder(input, output), role_arn=execution-role, dependencies={"auto": False, "custom": ["-e git+https://github.com/luca-medeiros/lang-segment-anything.git#egg=lang-sam"],} )

モデルの構築とデプロイ

build 関数を呼び出して、デプロイ可能なモデルを作成します。このステップでは、スキーマの作成、入力と出力のシリアル化と逆シリアル化の実行、およびユーザーが指定した他のカスタムロジックの実行に必要なコードを含む推論コードを ( としてinference.py) 作業ディレクトリに作成します。

整合性チェックとして、 はModelBuilder、ビルド機能の一部としてデプロイに必要なファイルを SageMaker パッケージ化して選択します。このプロセス中に、 は pickle ファイルの HMAC 署名 SageMaker も作成し、 deploy (または ) 中に CreateModel API のシークレットキーを環境変数として追加しますcreate。エンドポイントの起動では、 環境変数を使用して pickle ファイルの整合性を検証します。

# Build the model according to the model server specification and save it as files in the working directory model = model_builder.build()

モデルの既存のdeployメソッドを使用してモデルをデプロイします。このステップでは、 は、受信リクエストの予測を開始するときにモデルをホストするエンドポイント SageMaker を設定します。はモデルのデプロイに必要なエンドポイントリソースをModelBuilder推測しますが、これらの見積もりを独自のパラメータ値で上書きできます。次の例では、 に 1 つのml.c6i.xlargeインスタンスにモデルをデプロイ SageMaker するように指示します。から構築されたモデルModelBuilderでは、追加機能としてデプロイ中のライブログ記録が可能になります。

predictor = model.deploy( initial_instance_count=1, instance_type="ml.c6i.xlarge" )

モデルに割り当てられたエンドポイントリソースをよりきめ細かく制御したい場合は、 ResourceRequirements オブジェクトを使用できます。ResourceRequirements オブジェクトを使用すると、デプロイするモデルの CPUs、アクセラレーター、コピーの最小数をリクエストできます。メモリの最小制限と最大制限 (MB) をリクエストすることもできます。この機能を使用するには、エンドポイントタイプを に指定する必要がありますEndpointType.INFERENCE_COMPONENT_BASED。次の例では、4 つのアクセラレーター、最小メモリサイズ 1024 MB、モデルの 1 つのコピーを タイプのエンドポイントにデプロイするようにリクエストしますEndpointType.INFERENCE_COMPONENT_BASED

resource_requirements = ResourceRequirements( requests={ "num_accelerators": 4, "memory": 1024, "copies": 1, }, limits={}, ) predictor = model.deploy( mode=Mode.SAGEMAKER_ENDPOINT, endpoint_type=EndpointType.INFERENCE_COMPONENT_BASED, resources=resource_requirements, role="role" )

独自のコンテナ

独自のコンテナ ( SageMaker コンテナから拡張) を持ち込む場合は、次の例に示すように、イメージ URI を指定することもできます。また、モデルサーバーに固有のアーティファクトを生成するModelBuilderには、 のイメージに対応するモデルサーバーを特定する必要があります。

model_builder = ModelBuilder( model=model, model_server=ModelServer.TORCHSERVE, schema_builder=SchemaBuilder(X_test, y_pred), image_uri="123123123123.dkr.ecr.ap-southeast-2.amazonaws.com/byoc-image:xgb-1.7-1") )

ローカルモードで ModelBuilder を使用する

mode 引数を使用して、ローカルテストとエンドポイントへのデプロイを切り替えることで、モデルをローカルにデプロイできます。次のスニペットに示すように、モデルアーティファクトを作業ディレクトリに保存する必要があります。

model = XGBClassifier() model.fit(X_train, y_train) model.save_model(model_dir + "/my_model.xgb")

モデルオブジェクト、SchemaBuilderインスタンスを渡し、モードを に設定しますMode.LOCAL_CONTAINERbuild 関数を呼び出すと、 はサポートされているフレームワークコンテナModelBuilderを自動的に識別し、依存関係をスキャンします。次の例は、ローカルモードで XGBoost モデルを使用してモデルを作成する方法を示しています。

model_builder_local = ModelBuilder( model=model, schema_builder=SchemaBuilder(X_test, y_pred), role_arn=execution-role, mode=Mode.LOCAL_CONTAINER ) xgb_local_builder = model_builder_local.build()

次のスニペットに示すように、 deploy関数を呼び出してローカルにデプロイします。インスタンスタイプまたは数にパラメータを指定すると、これらの引数は無視されます。

predictor_local = xgb_local_builder.deploy()

ローカルモードのトラブルシューティング

個々のローカル設定によっては、環境でModelBuilderスムーズに動作しない問題が発生する場合があります。直面する可能性のある問題とその解決方法については、次のリストを参照してください。

  • 既に使用中: Address already in use エラーが発生する可能性があります。この場合、Docker コンテナがそのポートで実行されているか、別のプロセスがそのポートを利用している可能性があります。Linux ドキュメントで説明されているアプローチに従ってプロセスを特定し、ローカルプロセスをポート 8080 から別のポートに適切にリダイレクトするか、Docker インスタンスをクリーンアップできます。

  • IAM アクセス許可の問題: Amazon ECR イメージをプルしたり、Amazon S3 にアクセスしようとすると、アクセス許可の問題が発生する可能性があります。この場合、ノートブックまたは Studio Classic インスタンスの実行ロールに移動して、 SageMakerFullAccess またはそれぞれの API アクセス許可のポリシーを確認します。

  • EBS ボリューム容量の問題: 大規模言語モデル (LLM) をデプロイすると、ローカルモードで Docker を実行している間に領域が不足したり、Docker キャッシュの領域制限が発生したりする可能性があります。この場合、十分なスペースがあるファイルシステムに Docker ボリュームを移動してみてください。Docker ボリュームを移動するには、次のステップを実行します。

    1. 次の出力に示すように、ターミナルを開き、 dfを実行してディスク使用量を表示します。

      (python3) sh-4.2$ df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 195928700 0 195928700 0% /dev tmpfs 195939296 0 195939296 0% /dev/shm tmpfs 195939296 1048 195938248 1% /run tmpfs 195939296 0 195939296 0% /sys/fs/cgroup /dev/nvme0n1p1 141545452 135242112 6303340 96% / tmpfs 39187860 0 39187860 0% /run/user/0 /dev/nvme2n1 264055236 76594068 176644712 31% /home/ec2-user/SageMaker tmpfs 39187860 0 39187860 0% /run/user/1002 tmpfs 39187860 0 39187860 0% /run/user/1001 tmpfs 39187860 0 39187860 0% /run/user/1000
    2. デフォルトの Docker ディレクトリを から /dev/nvme0n1p1に移動/dev/nvme2n1して、256 GB の SageMaker ボリュームを最大限に活用できるようにします。詳細については、「Docker ディレクトリの移動方法に関するドキュメント」を参照してください。

    3. 次のコマンドを使用して Docker を停止します。

      sudo service docker stop
    4. を既存の JSON BLOB に追加するdaemon.json/etc/dockerか、既存の BLOB に追加します。

      { "data-root": "/home/ec2-user/SageMaker/{created_docker_folder}" }
    5. 次のコマンド/var/lib/docker/home/ec2-user/SageMakerを使用して、 の Docker ディレクトリを に移動します。

      sudo rsync -aP /var/lib/docker/ /home/ec2-user/SageMaker/{created_docker_folder}
    6. 次のコマンドを使用して Docker を起動します。

      sudo service docker start
    7. 次のコマンドを使用してゴミ箱をクリーンアップします。

      cd /home/ec2-user/SageMaker/.Trash-1000/files/* sudo rm -r *
    8. SageMaker ノートブックインスタンスを使用している場合は、Docker 準備ファイルにある手順に従って、Docker をローカルモード用に準備できます。

ModelBuilder 例

ModelBuilder を使用してモデルを構築するその他の例については、ModelBuilder「 サンプルノートブック」を参照してください。