Amazon SageMakerマルチモデルエンドポイントを使用して、複数のTensorFlowコンピュータービジョンモデルをホストします

ソースノード: 1853804

アマゾンセージメーカー データ サイエンティストと開発者は、ML 専用の幅広い機能セットをまとめることで、高品質の機械学習 (ML) モデルを迅速に準備、構築、トレーニング、デプロイできます。 SageMaker は、ラベル付け、データ準備、特徴エンジニアリング、統計的バイアス検出、AutoML、トレーニング、チューニング、ホスティング、説明可能性、モニタリング、ワークフローの自動化など、ML 開発のすべてのステップに専用のツールを提供することで、組織内のイノベーションを加速します。

企業はますます、個々のユーザー データに基づいて ML モデルをトレーニングしています。 たとえば、インターネット上の情報を発見できるように設計された画像共有サービスは、各ユーザーのアップロードされた画像と閲覧履歴に基づいてカスタム モデルをトレーニングし、そのユーザーのおすすめをパーソナライズします。 同社は、トピックごとに画像を推奨するために、検索トピックに基づいてカスタム モデルをトレーニングすることもできます。 ユースケースごとにカスタム ML モデルを構築すると、推論の精度が向上しますが、モデルのデプロイと管理のコストが増加します。 これらの課題は、すべてのモデルが同じ速度でアクセスされるわけではなく、常に利用可能である必要がある場合に、より顕著になります。

セージメーカー マルチモデル エンドポイント クラウドに多数の ML モデルをデプロイするためのスケーラブルで費用対効果の高い方法を提供します。 SageMaker マルチモデルエンドポイントを使用すると、単一のエンドポイントの背後に複数の ML モデルをデプロイし、単一のサービスコンテナーを使用してそれらを提供できます。 低レイテンシー、高スループットの推論を実現するには、アプリケーションにこのエンドポイントへのターゲット モデルを使用した API 呼び出しを含めるだけです。 単一のモデルごとに個別のエンドポイントに料金を支払う代わりに、単一のエンドポイントの料金で多くのモデルをホストできます。 SageMaker マルチモデルエンドポイントの詳細については、次を参照してください。 Amazon SageMakerマルチモデルエンドポイントを使用して推論コストを節約.

この投稿では、SageMaker マルチモデルエンドポイントを使用して、異なるモデルアーキテクチャと画像分類用のデータセットを持つ XNUMX つのコンピュータービジョンモデルをホストする方法を示します。 実際には、何万ものモデルをマルチモデル エンドポイントにデプロイできます。

ソリューションの概要

SageMaker マルチモデルエンドポイントは、TensorFlow、PyTorch、MXNet、sklearn などのいくつかのフレームワークと連携し、次のことができます。 マルチモデル サーバーで独自のコンテナーを構築します。 マルチモデルエンドポイントは、次の一般的な SageMaker 組み込みアルゴリズムでもネイティブにサポートされています。 XGブースト, 線形学習者, ランダムカットフォレスト (RCF)、および K 最近傍法 (KNN). これらのアルゴリズムを使用しながら、独自のカスタムコンテナを構築することなく、SageMaker が提供するコンテナを直接使用できます。

次の図は、SageMaker マルチモデルエンドポイントを使用して複数 (この投稿では XNUMX つ) のモデルをホストする方法を簡略化した図です。 実際には、マルチモデル エンドポイントは、エンドポイントの背後にある数百から数万の ML モデルに対応できます。 私たちのアーキテクチャでは、次の場所に保存されているモデル アーティファクトを使用してより多くのモデルをホストする場合、 Amazon シンプル ストレージ サービス (Amazon S3)、マルチモデル エンドポイントは、新しいモデルに対応するために、最も使用されていないモデルの一部を動的にアンロードします。

この投稿では、単一の SageMaker マルチモデルエンドポイントの背後で TensorFlow フレームワークを使用してトレーニングされた XNUMX つのコンピュータービジョンモデルをホストする方法を示します。 私たちは使用します TensorFlowサービング これらのモデルをホストするためのマルチモデル エンドポイントに対応したコンテナー。 最初のモデルでは、より小さなバージョンをトレーニングします。 アレックスネット CNN から画像を分類します。 CIFAR-10 データセット。 XNUMX 番目のモデルでは、 VGG16 で事前学習された CNN モデル ImageNet データセットと微調整 手話数字データセット 手のシンボル画像を分類します。 また、完全な機能を提供します ノート すべての手順を示します。

モデル 1: CIFAR-10 画像分類

CIFAR-10 は、コンピューター ビジョンと ML における画像分類のベンチマーク データセットです。 CIFAR 画像は、オブジェクトの表示方法が劇的に変化する色 (32 つのチャネル) で表示されます。 32 クラスの 10 × 6,000 カラー画像で構成され、クラスあたり 50,000 枚の画像があります。 10,000 個のトレーニング画像と XNUMX 個のテスト画像が含まれています。 次の画像は、ラベルでグループ化された画像のサンプルを示しています。

画像分類器を構築するために、古典的な AlexNet CNN の簡略化されたバージョンを使用します。 ネットワークは、XNUMX つの畳み込み層とプーリング層、および XNUMX つの完全に接続された層で構成されています。 簡素化されたアーキテクチャは、XNUMX つの畳み込み層と XNUMX つの完全に接続された (高密度) 層をスタックします。

最初のステップは、データセットをトレーニング オブジェクトとテスト オブジェクトにロードすることです。 TensorFlow フレームワークは、load_data() メソッドを使用してロードするための CIFAR データセットを提供します。 次に、ピクセル値を 255 で割って入力画像を再スケーリングします: [0,255] ⇒ [0,1]。 を使用してラベルを準備する必要もあります ワンホットエンコーディング。 ホット エンコーディングの XNUMX つは、カテゴリ変数を数値形式に変換するプロセスです。 次のコード スニペットは、これらの手順を実際に示しています。

from tensorflow.keras.datasets import cifar10 # load dataset
(X_train, y_train), (X_test, y_test) = cifar10.load_data() # rescale input images
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255 # one hot encode target labels
num_classes = len(np.unique(y_train))
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

データセットが準備され、トレーニングの準備ができたら、SageMaker で使用できるように Amazon S3 に保存します。 画像分類器のモデル アーキテクチャとトレーニング コードは、トレーニング スクリプトにアセンブルされます (cifar_train.py)。 トレーニング プロセス用のテンソル画像データのバッチを生成するには、ImageDataGenerator を使用します。 これにより、回転、幅、高さのシフトなどのデータ拡張変換をトレーニング データに適用できます。

次のステップでは、トレーニングスクリプトを使用して、SageMaker SDK を使用して TensorFlow エスティメーターを作成します (次のコードを参照)。 推定器を使用して、CIFAR-10 入力の CNN モデルを当てはめます。 トレーニングが完了すると、モデルは Amazon S3 に保存されます。

from sagemaker.tensorflow import TensorFlow model_name = 'cifar-10' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'cifar_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'model_dir': f'/opt/ml/model', 'role': role, 'hyperparameters': hyperparameters, 'output_path': f's3://{BUCKET}/{PREFIX}/cifar_10/out', 'base_job_name': f'mme-cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_1 = TensorFlow(**estimator_parameters) estimator_1.fit(inputs)

その後、XNUMX 番目のモデル (手話数字分類子) と一緒に SageMaker マルチモデルエンドポイントを使用して、このモデルをホストする方法を示します。

モデル2:手話桁分類

0 番目のモデルでは、手話の数字のデータセットを使用します。 このデータセットは、手話の数字を 9 ~ XNUMX で区別します。 次の画像は、データセットのサンプルを示しています。

データセットには RGB カラーの 100 x 100 の画像が含まれ、10 のクラス (数字 0 ~ 9) があります。 トレーニング セットには 1,712 の画像、検証セット 300、テスト セット 50 が含まれています。

このデータセットは非常に小さいです。 この小さなデータセットでネットワークをゼロからトレーニングしても、良い結果は得られません。 より高い精度を達成するために、私たちは使用します 転送 学習. 通常、転移学習は、分類プロジェクトを開始するとき、特にトレーニング データがあまりない場合に、頼りになるアプローチです。 ソース データセットから学習した知識をターゲット データセットに移行して、トレーニング時間と計算コストを節約します。

このモデルをトレーニングするには、ImageNet データセットでトレーニングされた事前トレーニング済みの VGG16 CNN モデルを使用し、手話数字データセットで動作するように微調整します。 事前トレーニング済みモデルは、大規模なデータセット (通常は大規模な画像分類タスク) で事前にトレーニング済みのネットワークです。 使用する VGG16 モデル アーキテクチャには、合計 13 の畳み込み層があります。 手話データセットの場合、そのドメインは ImageNet データセットのソース ドメインとは異なるため、最後のいくつかのレイヤーのみを微調整します。 ここでの微調整とは、特徴抽出に使用されるいくつかのネットワーク層を凍結し、凍結されていない層と事前トレーニング済みモデルの新しく追加された分類器層の両方を共同でトレーニングすることを指します。

トレーニング スクリプト (手話言語_train.py) モデル アーキテクチャと手話数字分類子のトレーニング ロジックをカプセル化します。 まず、ImageNet データセットでトレーニングされた VGG16 ネットワークから事前トレーニング済みの重みをロードします。 次に、特徴抽出部分の一部をフリーズしてから、新しい分類子レイヤーを追加します。 最後に、ネットワークをコンパイルし、トレーニング プロセスを実行して、より小さなデータセット用にモデルを最適化します。

次に、このトレーニングスクリプトを使用して、SageMaker SDK を使用して TensorFlow エスティメーターを作成します。 この推定器は、指定された入力に手話数字分類子を当てはめるために使用されます。 トレーニングが完了すると、モデルは Amazon S3 に保存され、SageMaker マルチモデル エンドポイントによってホストされます。 次のコードを参照してください。

model_name = 'sign-language' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'sign_language_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'hyperparameters': hyperparameters, 'model_dir': f'/opt/ml/model', 'role': role, 'output_path': f's3://{BUCKET}/{PREFIX}/sign_language/out', 'base_job_name': f'cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_2 = TensorFlow(**estimator_parameters) estimator_2.fit({'train': train_input, 'val': val_input})

マルチモデル エンドポイントをデプロイする

SageMaker マルチモデルエンドポイントは、多数のモデルをデプロイするためのスケーラブルで費用対効果の高いソリューションを提供します。 複数のモデルをホストできる共有サービス コンテナーを使用します。 これにより、単一モデルのエンドポイントを使用する場合と比較してエンドポイントの使用率が向上するため、ホスティング コストが削減されます。 また、SageMaker はモデルをメモリにロードし、それらへのトラフィックパターンに基づいてモデルをスケーリングすることを管理するため、デプロイのオーバーヘッドも削減されます。

マルチモデルエンドポイントを作成するには、まず、個々のエスティメータ (1 および 2) のトレーニング済みモデルを、保存された S3 の場所からマルチモデルエンドポイントで使用できる共通の S3 プレフィックスにコピーする必要があります。

tf_model_1 = estimator_1.model_data
output_1 = f's3://{BUCKET}/{PREFIX}/mme/cifar.tar.gz' tf_model_2 = estimator_2.model_data
output_2 = f's3://{BUCKET}/{PREFIX}/mme/sign-language.tar.gz' !aws s3 cp {tf_model_1} {output_1}
!aws s3 cp {tf_model_2} {output_2}

モデルが S3 プレフィックスで指定された共通の場所にコピーされた後、SageMaker SDK の TensorFlowModel クラスを使用してサービングモデルを作成します。 サービス モデルは、マルチモデル エンドポイントでホストされるモデルの 10 つに対して作成されます。 この場合、最初のモデル (CIFAR-1 画像分類器) を使用します。 次に、SageMaker SDK の MultiDataModel クラスを使用して、前のステップで作成した model-XNUMX のサービングモデルを使用してマルチモデルデータモデルを作成します。

from sagemaker.tensorflow.serving import TensorFlowModel
from sagemaker.multidatamodel import MultiDataModel model_1 = TensorFlowModel(model_data=output_1, role=role, image_uri=IMAGE_URI) mme = MultiDataModel(name=f'mme-tensorflow-{current_time}', model_data_prefix=model_data_prefix, model=model_1, sagemaker_session=sagemaker_session)

最後に、 deploy() メソッドを呼び出して MultiDataModel をデプロイし、マルチモデル エンドポイントをサポートするために必要なホスティング インフラストラクチャを作成するために必要な属性を提供します。

predictor = mme.deploy(initial_instance_count=2, instance_type='ml.m5.2xlarge', endpoint_name=f'mme-tensorflow-{current_time}')

deploy 呼び出しは、推論呼び出しを行うために使用できる予測子インスタンスを返します。 これについては、次のセクションで説明します。

リアルタイム推論のためにマルチモデル エンドポイントをテストする

マルチモデル エンドポイントにより、モデル間でメモリ リソースを共有できます。 参照されるモデルがすでにキャッシュされている場合、マルチモデル エンドポイントはすぐに推論を実行します。 一方、リクエストされた特定のモデルがキャッシュされていない場合、SageMaker はモデルをダウンロードする必要があり、その最初のリクエストのレイテンシーが増加します。 ただし、これは、SageMaker でモデルを個別にホストするためにまったく新しいインフラストラクチャ (インスタンス) を起動するのにかかる時間のほんの一部です。 モデルがマルチモデル エンドポイントにキャッシュされた後、後続のリクエストはリアルタイムで開始されます (モデルが削除されない限り)。 その結果、単一のインスタンスから多くのモデルを実行でき、モデルの量とデプロイのコストを効果的に切り離すことができます。 これにより、大規模な ML デプロイの管理が容易になり、エンドポイントとその基盤となるコンピューティング インスタンスの使用率が向上するため、モデルのデプロイ コストが削減されます。 詳細および 90 モデルの例で 1,000% 以上のコスト削減のデモンストレーションについては、 Amazon SageMaker マルチモデルエンドポイントを使用して推論コストを節約.

マルチモデル エンドポイントは、エンドポイントをバッキングするインスタンスがメモリ容量に達し、さらに多くのモデルをコンテナにロードする必要がある場合にも、コンテナから未使用のモデルをアンロードします。 ボリュームが容量に達し、新しいモデルをダウンロードする必要がある場合、SageMaker はインスタンスストレージボリュームから未使用のモデルアーティファクトを削除します。 エンドポイントが Amazon S3 からマルチモデル エンドポイントをサポートするインスタンスのコンテナのメモリにモデルをダウンロードするのに時間がかかるため、新しく追加されたモデルへの最初の呼び出しには時間がかかります。 アンロードされたモデルはインスタンスのストレージ ボリュームに残り、後で S3 バケットから再度ダウンロードすることなくコンテナのメモリにロードできます。

マルチモデル エンドポイントでホストされている CIFAR-10 画像分類子 (model-1) から推論を行う方法を見てみましょう。 まず、クラスの XNUMX つ (飛行機) からサンプル画像を読み込み、前の手順で作成した予測子を使用してマルチモデル エンドポイントに送信する準備をします。

このプレディクターを使用すると、predict() メソッドを initial_args パラメーターとともに呼び出すことができます。このパラメーターは、呼び出すターゲット モデルの名前を指定します。 この場合、対象モデルは cifar.tar.gz です。 次のスニペットは、このプロセスを詳細に示しています。

img = load_img('./data/cifar_10/raw_images/airplane.png', target_size=(32, 32))
data = img_to_array(img)
data = data.astype('float32')
data = data / 255.0
data = data.reshape(1, 32, 32, 3)
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'cifar.tar.gz'})
predicted_label = CIFAR10_LABELS[np.argmax(y_pred)]
print(f'Predicted Label: [{predicted_label}]')

上記のコードを実行すると、予測出力がラベル飛行機として返されます。これは、提供されたモデルによって正しく解釈されます。

Predicted Label: [airplane]

次に、ターゲット モデルとして sign-language.tar.gz を使用してエンドポイントを呼び出すことにより、手話数字分類子 (model-2) をマルチモデル エンドポイントに動的にロードする方法を見てみましょう。

以下の手印の数字 0 のサンプル画像を使用します。

次のスニペットは、サンプル画像を使用してマルチモデル エンドポイントを呼び出して、正しい応答を返す方法を示しています。

test_path = './data/sign_language/test'
img = mpimg.imread(f'{test_path}/0/IMG_4159.JPG') def path_to_tensor(img_path): # loads RGB image as PIL.Image.Image type img = image.load_img(img_path, target_size=(224, 224)) # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3) x = image.img_to_array(img) # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor return np.expand_dims(x, axis=0) data = path_to_tensor(f'{test_path}/0/IMG_4159.JPG')
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'sign-language.tar.gz'})predicted_label = np.argmax(y_pred)
print(f'Predicted Label: [{predicted_label}]')

次のコードは、ラベル 0 が付いた応答です。

Predicted Label: [0]

まとめ

この投稿では、SageMaker 機能のデモを行いました。 マルチモデル エンドポイント 推論コストを最適化します。 マルチモデル エンドポイントは、数百から数万のモデルを扱っていて、各モデルを個別のエンドポイントとしてデプロイする必要がない場合に便利です。 モデルは、使用量とエンドポイントで使用可能なメモリの量に応じて、動的にロードおよびアンロードされます。

この投稿では、TensorFlow フレームワークを使用してトレーニングされた複数のコンピュータービジョンモデルを XNUMX つの SageMaker マルチモデルエンドポイントでホストする方法について説明しました。 画像分類モデルは異なるモデル アーキテクチャであり、異なるデータセットでトレーニングされました。 は ノート 投稿に含まれている には、モデルのトレーニングとホストに関する詳細な手順が記載されています。

SageMaker マルチモデルエンドポイントをユースケースで試して、コメントにフィードバックを残してください。


著者について

アルンプラサト・シャンカール は、AW​​Sの人工知能と機械学習(AI / ML)スペシャリストソリューションアーキテクトであり、世界中のお客様がクラウドでAIソリューションを効果的かつ効率的に拡張できるよう支援しています。 余暇には、SF映画を見たり、クラシック音楽を聴いたりしています。

マークロイ AWS の主任機械学習アーキテクトであり、AWS のお客様が AI/ML ソリューションを設計および構築するのを支援しています。 Mark の仕事は、コンピューター ビジョン、ディープ ラーニング、企業全体での ML のスケーリングに主な関心を持って、幅広い ML ユース ケースをカバーしています。 彼は、保険、金融サービス、メディアとエンターテイメント、ヘルスケア、公益事業、製造など、多くの業界の企業を支援してきました。 Mark は、ML Specialty 認定を含む 25 つの AWS 認定を保持しています。 AWS に入社する前は、金融サービスでの 19 年間を含む XNUMX 年以上、アーキテクト、開発者、およびテクノロジーリーダーでした。

ソース: https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

タイムスタンプ:

より多くの AWS機械学習ブログ