前提条件 - Amazon SageMaker

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

前提条件

Amazon SageMaker Inference Recommender を使用するには、まず次のリストの前提条件を満たしていることを確認します。例として、両方のタイプの Amazon SageMaker Inference Recommender レコメンデーションジョブに PyTorch (v1.7.1) ResNet-18 の事前トレーニング済みモデルを使用する方法を示します。ここに示す例では、 を使用しています 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 の IAMロールを作成します SageMaker。

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

  2. 環境を設定します。

    依存関係をインポートし、 、IAMロール (ステップ 1 から) AWS リージョン、 SageMakerおよび 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 イメージを選択し、モデルを SageMaker Model Registry に登録します。以下は、 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 、、Chainer など、最も一般的な機械学習フレームワークの一部の組み込みアルゴリズムMXNet TensorFlow PyTorchと構築済みの Docker イメージ用のコンテナを提供します。利用可能な SageMakerイメージの完全なリストについては、「利用可能な深層学習コンテナイメージ」を参照してください。

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

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

    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 Model Registry に登録して本番稼働用モデルのカタログ化に使用するか、 SageMaker モデルを作成してレコメンデーションジョブを作成するときに ContainerConfig フィールドで指定できます。最初のオプションは、モデルバージョンの管理やモデルのデプロイの自動化など、Model Registry が備えている機能を利用する場合に最適です。2 番目のオプションは、すぐに使い始める必要がある場合に最適です。1 つ目のオプションを選択する場合は、ステップ 7 に進みます。2 つ目のオプションを選択する場合は、ステップ 7 をスキップしてステップ 8 に進みます。

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

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

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

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

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

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

    注記

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

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

      を使用してモデルパッケージグループを作成しますCreateModelPackageGroupAPI。モデルパッケージグループの 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

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

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

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

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

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

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

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

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

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

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

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

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

      # 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 Inference Recommender を使用するにはARN、モデルパッケージが必要です。モデルパッケージARNの を書き留めるか、変数に保存します。

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

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

    1. モデルを作成する

      を使用してモデルを作成しますCreateModelAPI。モデルを SageMaker ホスティングにデプロイするときにこのメソッドを呼び出す例については、「モデルの作成 (AWS SDK for Python (Boto3))」を参照してください。

      前のステップでは、事前トレーニング済みの ResNet18 モデルをダウンロードし、 というディレクトリの 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 ジョブ中にインスタンスタイプの探索空間を制限します。予算に制約がある場合、またはモデルとコンテナイメージをサポートできる特定のインスタンスタイプのセットが存在することがわかっている場合は、このパラメータを使用します。

      次のコード例では、以前に定義したパラメータを とともに使用してNearestModelNameCreateInferenceRecommendationsJob への入力として使用されるディクショナリを定義します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, }