前提条件 - Amazon SageMaker

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

前提条件

Amazon SageMaker Inference Recommender を使用するには、まず以下のリストの前提条件を満たしていることを確認してください。例として、 PyTorch (v1.7.1) ResNet -18 の事前トレーニング済みモデルを、両方のタイプの Amazon SageMaker Inference レコメンダーレコメンダー推奨ジョブに使用する方法を示します。ここに示す例ではを使用しています。 AWS SDK for Python (Boto3)

注記
  • 次のコード例では Python を使用しています。ターミナルまたは AWS CLIで次のコードサンプルのいずれかを実行する場合は、! プレフィックスを削除します。

  • Amazon SageMaker Studio ノートブックの Python 3 (TensorFlow 2.6 Python 3.8 CPU 最適化) カーネルを使用して以下の例を実行できます。Studio の詳細については、を参照してください。Amazon SageMaker Studio

  1. Amazon SageMaker 用の IAM ロールを作成します。

    IAM SageMaker 管理ポリシーがアタッチされている Amazon 用の AmazonSageMakerFullAccess IAM ロールを作成します。

  2. 環境をセットアップします。

    依存関係をインポートし、あなた AWS リージョン、 SageMaker IAM ロール (ステップ 1 から)、 SageMaker クライアントの変数を作成します。

    !pip install --upgrade pip awscli botocore boto3 --quiet from sagemaker import get_execution_role, Session, image_uris import boto3 region = boto3.Session().region_name role = get_execution_role() sagemaker_client = boto3.client("sagemaker", region_name=region) sagemaker_session = Session()
  3. (オプション) Inference Recommender によってベンチマークされた既存のモデルを確認します。

    Inference Recommender は、人気のあるモデルズーのモデルをベンチマークします。Inference Recommender は、まだベンチマークされていないモデルもサポートします。

    ListModelMetaData を使用して、一般的なモデルズーで見つかった機械学習モデルのドメイン、フレームワーク、タスク、モデル名を一覧表示するレスポンスオブジェクトを取得します。

    ドメイン、フレームワーク、フレームワークバージョン、タスク、モデル名を後のステップで使用して、推論 Docker イメージを選択し、モデルを Model Registry に登録します。 SageMaker 以下は、SDK for Python (Boto3) を使用してモデルメタデータを一覧表示する方法を示しています。

    list_model_metadata_response=sagemaker_client.list_model_metadata()

    出力には、次の例のようなモデルの概要 (ModelMetadataSummaries) と応答メタデータ (ResponseMetadata) が含まれます。

    { 'ModelMetadataSummaries': [{ 'Domain': 'NATURAL_LANGUAGE_PROCESSING', 'Framework': 'PYTORCH:1.6.0', 'Model': 'bert-base-cased', 'Task': 'FILL_MASK' }, { 'Domain': 'NATURAL_LANGUAGE_PROCESSING', 'Framework': 'PYTORCH:1.6.0', 'Model': 'bert-base-uncased', 'Task': 'FILL_MASK' }, { 'Domain': 'COMPUTER_VISION', 'Framework': 'MXNET:1.8.0', 'Model': 'resnet18v2-gluon', 'Task': 'IMAGE_CLASSIFICATION' }, { 'Domain': 'COMPUTER_VISION', 'Framework': 'PYTORCH:1.6.0', 'Model': 'resnet152', 'Task': 'IMAGE_CLASSIFICATION' }], 'ResponseMetadata': { 'HTTPHeaders': { 'content-length': '2345', 'content-type': 'application/x-amz-json-1.1', 'date': 'Tue, 19 Oct 2021 20:52:03 GMT', 'x-amzn-requestid': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' }, 'HTTPStatusCode': 200, 'RequestId': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'RetryAttempts': 0 } }

    このデモでは、 PyTorch (v1.7.1) ResNet -18 モデルを使用して画像分類を行います。次の Python コードサンプルでは、フレームワーク、フレームワークのバージョン、ドメイン、タスクを変数に格納して、後で使用できるようにします。

    # ML framework details framework = 'pytorch' framework_version = '1.7.1' # ML model details ml_domain = 'COMPUTER_VISION' ml_task = 'IMAGE_CLASSIFICATION'
  4. Amazon S3 に機械学習モデルをアップロードします。

    事前にトレーニングされた機械学習モデルがない場合は、次の PyTorch (v1.7.1) ResNet -18 モデルを使用してください。

    # Optional: Download a sample PyTorch model import torch from torchvision import models, transforms, datasets # Create an example input for tracing image = torch.zeros([1, 3, 256, 256], dtype=torch.float32) # Load a pretrained resnet18 model from TorchHub model = models.resnet18(pretrained=True) # Tell the model we are using it for evaluation (not training). Note this is required for Inferentia compilation. model.eval() model_trace = torch.jit.trace(model, image) # Save your traced model model_trace.save('model.pth')

    サンプル推論スクリプト inference.py をダウンロードします。code ディレクトリを作成して、推論スクリプトを code ディレクトリに移動します。

    # Download the inference script !wget https://aws-ml-blog-artifacts.s3.us-east-2.amazonaws.com/inference.py # move it into a code/ directory !mkdir code !mv inference.py code/

    Amazon SageMaker では、事前にトレーニングされた機械学習モデルを圧縮された TAR ファイル () *.tar.gz としてパッケージ化することを義務付けています。モデルと推論スクリプトを圧縮して次の要件を満たしてください。

    !tar -czf test.tar.gz model.pth code/inference.py

    エンドポイントがプロビジョニングされると、アーカイブ内のファイルが抽出され、エンドポイントの /opt/ml/model/ に抽出されます。

    モデルとモデルのアーティファクトを.tar.gz ファイルとして圧縮したら、それらを Amazon S3 バケットにアップロードします。次の例は、を使用してモデルを Amazon S3 にアップロードする方法を示しています。 AWS CLI

    !aws s3 cp test.tar.gz s3://{your-bucket}/models/
  5. 構築済みの Docker 推論イメージを選択するか、独自の推論 Docker イメージを作成する。

    SageMaker には、組み込みアルゴリズム用のコンテナと、Apache MXNet、、、Chainerなどの最も一般的な機械学習フレームワーク用のビルド済みDockerイメージが用意されています。 TensorFlow PyTorch SageMaker利用可能なイメージの全リストについては、「利用可能なDeep Learning Containers イメージ」を参照してください。

    SageMaker 既存のコンテナーがどれもニーズを満たすものではなく、独自のコンテナーも存在しない場合は、新しい Docker イメージを作成してください。Docker イメージを作成する方法については、「独自の推論コードの使用」を参照してください。

    以下は、Python SDK PyTorch を使用してバージョン 1.7.1 の推論イメージを取得する方法を示しています。 SageMaker

    from sagemaker import image_uris ## Uncomment and replace with your own values if you did not define ## these variables a previous step. #framework = 'pytorch' #framework_version = '1.7.1' # Note: you can use any CPU-based instance here, # this is just to set the arch as CPU for the Docker image instance_type = 'ml.m5.2xlarge' image_uri = image_uris.retrieve(framework, region, version=framework_version, py_version='py3', instance_type=instance_type, image_scope='inference')

    SageMaker 利用可能なインスタンスのリストについては、Amazon SageMaker 料金表を参照してください

  6. サンプルペイロードアーカイブを作成します。

    SageMaker ロードテストツールがエンドポイントに送信できる個別のファイルを含むアーカイブを作成します。推論コードは、サンプルペイロードからファイル形式を読み取り可能である必要がります。

    以下では、この例では後のステップで ResNet -18 モデルで使用する.jpg イメージをダウンロードします。

    !wget https://cdn.pixabay.com/photo/2020/12/18/05/56/flowers-5841251_1280.jpg

    サンプルペイロードを tarball として圧縮します。

    !tar -cvzf payload.tar.gz flowers-5841251_1280.jpg

    サンプルペイロードを Amazon S3 にアップロードし、Amazon S3 URI を書き留めます。

    !aws s3 cp payload.tar.gz s3://{bucket}/models/

    Amazon S3 URI は後のステップで必要になるため、変数に格納します。

    bucket_prefix='models' bucket = '<your-bucket-name>' # Provide the name of your S3 bucket payload_s3_key = f"{bucket_prefix}/payload.tar.gz" sample_payload_url= f"s3://{bucket}/{payload_s3_key}"
  7. レコメンデーションジョブ向けにモデルの入力を準備します。

    最後の前提条件として、モデルの入力を準備するための 2 つのオプションがあります。 SageMaker モデルをモデルレジストリに登録して実稼働用のモデルをカタログ化することも、 SageMaker ContainerConfigモデルを作成してレコメンデーションジョブの作成時にフィールドで指定することもできます。最初のオプションは、モデルバージョンの管理やモデルのデプロイの自動化など、Model Registry が備えている機能を利用する場合に最適です。2 番目のオプションは、すぐに使い始める必要がある場合に最適です。1 つ目のオプションを選択する場合は、ステップ 7 に進みます。2 つ目のオプションを選択する場合は、ステップ 7 をスキップしてステップ 8 に進みます。

  8. オプション 1: モデルをモデルレジストリに登録します

    SageMaker Model Registryでは、本番環境向けにモデルをカタログ化したり、モデルバージョンを管理したり、メタデータ (トレーニングメトリクスなど) をモデルに関連付けたり、モデルの承認ステータスを管理したり、モデルを本番環境にデプロイしたり、CI/CD を使用してモデルデプロイを自動化したりできます。

    SageMaker モデルレジストリを使用してモデルを追跡および管理すると、モデルパッケージグループ内のバージョン管理されたモデルパッケージとして表示されます。バージョン管理外のモデルパッケージはモデルグループには含まれません。モデルパッケージグループは、モデルの複数のバージョンまたはイテレーションを保持します。レジストリ内のすべてのモデルに対してそれらを作成する必要はありませんが、それらはすべて同じ目的を持つさまざまなモデルを整理し、自動バージョニングを提供するのに役立ちます。

    Amazon SageMaker Inference Recommender を使用するには、バージョン管理されたモデルパッケージが必要です。バージョン対応モデルパッケージは、 AWS SDK for Python (Boto3) または Amazon SageMaker Studio Classic を使用してプログラムで作成できます。バージョン管理されたモデルパッケージをプログラムで作成するには、まずモデルパッケージグループを CreateModelPackageGroup API で作成します。次に、CreateModelPackage API を使用してモデルパッケージを作成します。このメソッドを呼び出すと、バージョン管理されたモデルパッケージが作成されます。

    モデルグループを作成するモデルバージョンを登録するモデルパッケージグループをプログラムおよびインタラクティブに作成する方法、および Amazon Studio Classic を使用してバージョン管理されたモデルパッケージを作成する方法の詳細については、 AWS SDK for Python (Boto3) それぞれおよびを参照してください。 SageMaker

    次のコードサンプルは、 AWS SDK for Python (Boto3)を使用して、バージョン管理されたモデルパッケージを作成する方法を示します。

    注記

    Inference Recommender ジョブを作成するために、モデルパッケージを承認する必要はありません。

    1. モデルパッケージグループを作成する

      CreateModelPackageGroup API を使用して、モデルパッケージグループを作成します。モデルパッケージグループの ModelPackageGroupName に名前を付け、必要に応じてモデルパッケージの説明を ModelPackageGroupDescription フィールドに指定します。

      model_package_group_name = '<INSERT>' model_package_group_description = '<INSERT>' model_package_group_input_dict = { "ModelPackageGroupName" : model_package_group_name, "ModelPackageGroupDescription" : model_package_group_description, } model_package_group_response = sagemaker_client.create_model_package_group(**model_package_group_input_dict)

      に渡すことができるオプション引数と必須引数の全リストについては、Amazon SageMaker API リファレンスガイドをご覧くださいCreateModelPackageGroup

      推論コードを実行する Docker イメージとモデルアーティファクトの Amazon S3 の場所を指定してモデルパッケージを作成し、の値を指定します。InferenceSpecification InferenceSpecificationこのモデルパッケージに基づくモデルで実行できる推論ジョブについて、以下を含む推論ジョブに関する情報が含まれている必要があります。

      • 推論コードを実行するイメージの Amazon ECR パス。

      • (オプション) トランスフォームジョブと推論に使用されるリアルタイムエンドポイントについて、モデルパッケージがサポートするインスタンスタイプ。

      • モデルパッケージが推論でサポートする入力および出力コンテンツ形式。

      モデルパッケージを作成するときは、次のパラメータも指定する必要があります。

      • Domain: モデルパッケージとそのコンポーネントの機械学習ドメイン。一般的な機械学習ドメインは、コンピュータビジョンと自然言語処理が含まれます。

      • Task: モデルパッケージが実行する機械学習タスク。一般的な機械学習タスクには、物体検出とイメージ分類が含まれます。API リファレンスガイドに記載されているどのタスクもユースケースを満たさない場合は、「OTHER」を指定してください。サポートされている機械学習タスクのリストについては、Task API フィールドの説明を参照してください。

      • SamplePayloadUrl: サンプルペイロードが保存されている Amazon Simple Storage Service (Amazon S3) のパス。このパスは、単一の GZIP 圧縮 TAR アーカイブ (.tar.gz サフィックス) を指している必要があります。

      • Framework: モデルパッケージコンテナイメージの機械学習フレームワーク。

      • FrameworkVersion: モデルパッケージコンテナイメージのフレームワークバージョン。

      推論をリアルタイムで生成するために使用するインスタンスタイプの許可リストを指定するとSupportedRealtimeInferenceInstanceTypes、Inference Recommender はジョブ中のインスタンスタイプの検索スペースを制限します。Default予算に制約がある場合、またはモデルとコンテナイメージをサポートできる特定のインスタンスタイプのセットが存在することがわかっている場合は、このパラメータを使用します。

      前のステップでは、事前にトレーニングされた ResNet 18 モデルをダウンロードし、Amazon S3 models バケットというディレクトリに保存しました。 PyTorch (v1.7.1) ディープラーニングコンテナの推論イメージを取得し、URI をという変数に保存しました。image_uri次のコードサンプルでこれらの変数を使用して、API への入力として使用されるディクショナリを定義します。CreateModelPackage

      # Provide the Amazon S3 URI of your compressed tarfile # so that Model Registry knows where to find your model artifacts bucket_prefix='models' bucket = '<your-bucket-name>' # Provide the name of your S3 bucket model_s3_key = f"{bucket_prefix}/test.tar.gz" model_url= f"s3://{bucket}/{model_s3_key}" # Similar open source model to the packaged model # The name of the ML model as standardized by common model zoos nearest_model_name = 'resnet18' # The supported MIME types for input and output data. In this example, # we are using images as input. input_content_type='image/jpeg' # Optional - provide a description of your model. model_package_description = '<INSERT>' ## Uncomment if you did not store the domain and task in an earlier ## step #ml_domain = 'COMPUTER_VISION' #ml_task = 'IMAGE_CLASSIFICATION' ## Uncomment if you did not store the framework and framework version ## in a previous step. #framework = 'PYTORCH' #framework_version = '1.7.1' # Optional: Used for optimizing your model using SageMaker Neo # PyTorch uses NCHW format for images data_input_configuration = "[[1,3,256,256]]" # Create a dictionary to use as input for creating a model pacakge group model_package_input_dict = { "ModelPackageGroupName" : model_package_group_name, "ModelPackageDescription" : model_package_description, "Domain": ml_domain, "Task": ml_task, "SamplePayloadUrl": sample_payload_url, "InferenceSpecification": { "Containers": [ { "Image": image_uri, "ModelDataUrl": model_url, "Framework": framework.upper(), "FrameworkVersion": framework_version, "NearestModelName": nearest_model_name, "ModelInput": {"DataInputConfig": data_input_configuration} } ], "SupportedContentTypes": [input_content_type] } }
    2. モデルパッケージを作成します。

      CreateModelPackage API を使用してモデルパッケージを作成します。前のステップで定義した入力ディクショナリを渡します。

      model_package_response = sagemaker_client.create_model_package(**model_package_input_dict)

      Amazon SageMaker 推論レコメンダーを使用するには、モデルパッケージ ARN が必要です。モデルパッケージの ARN を書き留めるか、変数に格納します。

      model_package_arn = model_package_response["ModelPackageArn"] print('ModelPackage Version ARN : {}'.format(model_package_arn))
  9. オプション 2: モデルを作成して ContainerConfig フィールドを設定します

    推論レコメンデーションジョブを開始する際、モデルをモデルレジストリに登録する必要がない場合は、このオプションを使用します。以下のステップでは、でモデルを作成し、ContainerConfigそのフィールドをレコメンデーションジョブの入力として設定します。 SageMaker

    1. モデルを作成する

      CreateModel API を使用してモデルを作成します。 SageMaker Hosting にモデルをデプロイする際にこのメソッドを呼び出す例については、「Create a Model (AWS SDK for Python (Boto3))」を参照してください。

      前のステップでは、事前にトレーニングされた ResNet 18 モデルをダウンロードし、Amazon S3 models バケットというディレクトリに保存しました。 PyTorch (v1.7.1) ディープラーニングコンテナの推論イメージを取得し、URI をという変数に保存しました。image_uriこれらの変数を次のコードサンプルで使用します。ここでは、CreateModel API への入力として使用するディクショナリを定義します。

      model_name = '<name_of_the_model>' # Role to give SageMaker permission to access AWS services. sagemaker_role= "arn:aws:iam::<region>:<account>:role/*" # Provide the Amazon S3 URI of your compressed tarfile # so that Model Registry knows where to find your model artifacts bucket_prefix='models' bucket = '<your-bucket-name>' # Provide the name of your S3 bucket model_s3_key = f"{bucket_prefix}/test.tar.gz" model_url= f"s3://{bucket}/{model_s3_key}" #Create model create_model_response = sagemaker_client.create_model( ModelName = model_name, ExecutionRoleArn = sagemaker_role, PrimaryContainer = { 'Image': image_uri, 'ModelDataUrl': model_url, })
    2. ContainerConfig フィールドを設定する

      次に、ContainerConfig作成したモデルでフィールドを設定し、その中に次のパラメーターを指定する必要があります。

      • Domain: モデルとそのコンポーネント (コンピュータビジョンや自然言語処理など) の機械学習ドメイン。

      • Task: イメージ分類やオブジェクトの検出など、モデルが実行する機械学習タスク。

      • PayloadConfig: レコメンデーションジョブのペイロードの構成。サブフィールドの詳細については、「RecommendationJobPayloadConfig」を参照してください。

      • Framework: コンテナイメージの機械学習フレームワーク (など) PyTorch。

      • FrameworkVersion: コンテナイメージのフレームワークバージョン。

      • (オプション) SupportedInstanceTypes: 推論をリアルタイムで生成するために使用されるインスタンスタイプのリスト。

      SupportedInstanceTypes パラメータを使用すると、Inference Recommender は Default ジョブ中にインスタンスタイプの探索空間を制限します。予算に制約がある場合、またはモデルとコンテナイメージをサポートできる特定のインスタンスタイプのセットが存在することがわかっている場合は、このパラメータを使用します。

      次のコードサンプルでは、以前に定義したパラメータを NearestModelName と共に使用して、CreateInferenceRecommendationsJob API への入力として使用するディクショナリを定義します。

      ## Uncomment if you did not store the domain and task in a previous step #ml_domain = 'COMPUTER_VISION' #ml_task = 'IMAGE_CLASSIFICATION' ## Uncomment if you did not store the framework and framework version in a previous step #framework = 'PYTORCH' #framework_version = '1.7.1' # The name of the ML model as standardized by common model zoos nearest_model_name = 'resnet18' # The supported MIME types for input and output data. In this example, # we are using images as input input_content_type='image/jpeg' # Optional: Used for optimizing your model using SageMaker Neo # PyTorch uses NCHW format for images data_input_configuration = "[[1,3,256,256]]" # Create a dictionary to use as input for creating an inference recommendation job container_config = { "Domain": ml_domain, "Framework": framework.upper(), "FrameworkVersion": framework_version, "NearestModelName": nearest_model_name, "PayloadConfig": { "SamplePayloadUrl": sample_payload_url, "SupportedContentTypes": [ input_content_type ] }, "DataInputConfig": data_input_configuration "Task": ml_task, }