Amazon SageMakerのマルチモデルエンドポイントを使用して、TorchServeを使ってGPU上で複数の生成AIモデルを実行し、推論コストを最大75%節約できます

Amazon SageMakerのマルチモデルエンドポイントを使用して、TorchServeを使ってGPU上で複数の生成AIモデルを実行し、推論コストを最大75%節約できます' Using Amazon SageMaker's multi-model endpoint with TorchServe, you can run multiple generative AI models on GPUs and save up to 75% on inference costs.

マルチモデルエンドポイント(MME)は、Amazon SageMakerの強力な機能であり、機械学習(ML)モデルの展開と運用を簡素化するために設計されています。MMEを使用すると、1つのサービングコンテナに複数のモデルをホストし、すべてのモデルを単一のエンドポイントの背後にホストすることができます。SageMakerプラットフォームは、モデルの読み込みとアンロードを自動的に管理し、トラフィックパターンに基づいてリソースをスケーリングするため、大量のモデルを管理するオペレーショナルな負荷を軽減します。この機能は、加速されたコンピュートが必要なディープラーニングと生成AIモデルに特に有益です。リソースの共有と簡素化されたモデル管理により実現されるコスト削減により、SageMaker MMEはAWS上でモデルをスケールしてホストするための優れた選択肢となります。

最近、生成AIアプリケーションが広範な注目と想像力を集めています。顧客はGPU上で生成AIモデルを展開したいという要望がありますが、同時にコストにも配慮しています。SageMaker MMEはGPUインスタンスをサポートし、この種のアプリケーションに最適なオプションです。本日は、TorchServeがSageMaker MMEをサポートすることを発表することをお知らせします。この新しいモデルサーバーサポートにより、TorchServeのお客様が最も馴染みのあるサービングスタックを使用しながら、MMEのすべての利点を活用することができます。この記事では、TorchServeを使用してSageMaker MME上でStable DiffusionやSegment Anything Modelなどの生成AIモデルをホストし、アーティストやコンテンツクリエーターがアートワークをより迅速に開発しイテレーションするのに役立つ言語による編集ソリューションを構築する方法を示します。

ソリューションの概要

言語による編集は、さまざまな業界で共通の生成AIユースケースです。これにより、アーティストやコンテンツクリエーターは、反復的なタスクの自動化、キャンペーンの最適化、エンドカスタマーへのハイパーカスタマイズ体験の提供など、コンテンツの需要に効率的に対応することができます。企業は、コンテンツの出力増加、コスト削減、パーソナライズの改善、および顧客体験の向上の恩恵を受けることができます。本記事では、MME TorchServeを使用して、画像から任意の不要なオブジェクトを消去し、テキストの指示を供給することで画像内の任意のオブジェクトを修正または置換する言語支援の編集機能を構築する方法を示します。

各ユースケースのユーザーエクスペリエンスフローは次のとおりです:

  • 不要なオブジェクトを削除するには、画像からオブジェクトを選択してハイライトします。このアクションはピクセル座標と元の画像を生成AIモデルに送信し、オブジェクトのセグメンテーションマスクを生成します。正しいオブジェクト選択を確認した後、元の画像とマスク画像を2番目のモデルに送信して削除します。このユーザーフローの詳細な説明は以下の通りです。
ステップ1: 画像からオブジェクト(”犬”)を選択する ステップ2: 正しいオブジェクトがハイライトされていることを確認する ステップ3: 画像からオブジェクトを消去する
  • オブジェクトを修正または置換するには、同様のプロセスで目的のオブジェクトを選択してハイライトします。正しいオブジェクト選択を確認した後、元の画像、マスク、およびテキストプロンプトを供給することでオブジェクトを修正することができます。モデルは提供された指示に基づいてハイライトされたオブジェクトを変更します。この2番目のユーザーフローの詳細な説明は以下の通りです。
ステップ1: 画像からオブジェクト(”花瓶”)を選択する ステップ2: 正しいオブジェクトがハイライトされていることを確認する ステップ3: オブジェクトを修正するためにテキストプロンプト(”未来的な花瓶”)を提供する

このソリューションを動かすために、3つの生成型AIモデルを使用しています:Segment Anything Model (SAM)、Large Mask Inpainting Model (LaMa)、および Stable Diffusion Inpaint (SD)。以下はこれらのモデルがユーザーエクスペリエンスのワークフローでどのように利用されているかの説明です:

不要なオブジェクトを削除するために オブジェクトを変更または置換するために
  1. Segment Anything Model (SAM) は、興味のあるオブジェクトのセグメントマスクを生成するために使用されます。Meta Research によって開発された SAM は、画像内の任意のオブジェクトをセグメント化することができるオープンソースのモデルです。このモデルは SA-1B として知られる巨大なデータセットでトレーニングされており、11百万枚の画像と 11 億枚のセグメンテーションマスクから構成されています。SAM の詳細については、公式ウェブサイトや研究論文を参照してください。
  2. LaMa は、イメージ内の任意の不要なオブジェクトを除去するために使用されます。LaMa は、不規則なマスクを使用してイメージの欠損部分を埋めるための専門技術を持つ生成対抗ネットワーク(GAN)モデルです。このモデルのアーキテクチャには、イメージ全体のグローバルコンテキストとフーリエ畳み込みを使用した単一ステップのアーキテクチャが組み込まれており、高速で最先端の結果を実現しています。LaMa の詳細については、公式ウェブサイトや研究論文をご覧ください。
  3. SD 2 inpaint モデルは、Stability AI によって開発されたモデルで、イメージ内のオブジェクトを変更または置換するために使用されます。このモデルでは、テキストプロンプトを提供することで、マスク領域内のオブジェクトを編集することができます。inpaint モデルはテキストからイメージへの変換 SD モデルに基づいており、シンプルなテキストプロンプトで高品質なイメージを生成することができます。オリジナル画像やマスク画像などの追加引数も提供されており、既存のコンテンツの迅速な修正と復元が可能です。AWS 上での Stable Diffusion モデルについての詳細は、Create high-quality images with Stable Diffusion models and deploy them cost-efficiently with Amazon SageMaker を参照してください。

これらの3つのモデルは、SageMaker MME 上でホストされており、複数のエンドポイントを管理するという運用の負担を軽減します。また、MME を使用することで、特定のモデルが活用されていないという懸念も解消されます。改善されたインスタンスの利用効率により、コストの削減につながる利点が得られます。以下のアーキテクチャ図は、TorchServe を使用して SageMaker MME を介して提供される3つのモデルの構成を示しています。

このソリューションアーキテクチャを実装するためのコードは、GitHub リポジトリに公開されています。この記事の残りを進めるには、ノートブックファイルを使用してください。SageMaker ノートブックインスタンス上で conda_python3(Python 3.10.10)カーネルを使用してこの例を実行することをおすすめします。

TorchServe コンテナを拡張する

最初のステップは、モデルホスティングコンテナを準備することです。SageMaker は、次のコードスニペットを使用して取得できる管理された PyTorch Deep Learning コンテナ(DLC)を提供しています:

# SageMaker PyTorch DLC をベースイメージとして使用する
baseimage = sagemaker.image_uris.retrieve(
    framework="pytorch",
    region=region,
    py_version="py310",
    image_scope="inference",
    version="2.0.0",
    instance_type="ml.g5.2xlarge",
)
print(baseimage)

モデルにはベース PyTorch DLC に存在しないリソースや追加のパッケージが必要なため、Docker イメージをビルドする必要があります。このイメージは Amazon Elastic Container Registry (Amazon ECR) にアップロードされ、SageMaker から直接アクセスできるようになります。カスタムにインストールされたライブラリは Docker ファイルにリストされています:

ARG BASE_IMAGE

FROM $BASE_IMAGE

# 追加のライブラリをインストールする
RUN pip install segment-anything-py==1.0
RUN pip install opencv-python-headless==4.7.0.68
RUN pip install matplotlib==3.6.3
RUN pip install diffusers
RUN pip install tqdm
RUN pip install easydict
RUN pip install scikit-image
RUN pip install xformers
RUN pip install tensorflow
RUN pip install joblib
RUN pip install matplotlib
RUN pip install albumentations==0.5.2
RUN pip install hydra-core==1.1.0
RUN pip install pytorch-lightning
RUN pip install tabulate
RUN pip install kornia==0.5.0
RUN pip install webdataset
RUN pip install omegaconf==2.1.2
RUN pip install transformers==4.28.1
RUN pip install accelerate
RUN pip install ftfy

シェルコマンドファイルを実行して、カスタムイメージをローカルにビルドし、Amazon ECRにプッシュします:

%%capture build_output

reponame = "torchserve-mme-demo"
versiontag = "genai-0.1"

# 自分自身のDockerイメージをビルドする
!cd workspace/docker && ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}

モデルアーティファクトの準備

TorchServeサポートを備えた新しいMMEの場合、モデルアーティファクトの準備方法が異なります。コードリポジトリは、TorchServe用の必要なファイルを配置するための各モデル(modelsフォルダ)に対してスケルトンフォルダを提供します。各モデルの.tarファイルを準備するために、同じ4つのステップを踏みます。以下のコードは、SDモデル用のスケルトンフォルダの例です:

workspace
|--sd
   |-- custom_handler.py
   |-- model-config.yaml

最初のステップは、モデルの事前学習済みチェックポイントをmodelsフォルダにダウンロードすることです:

import diffusers
import torch
import transformers

pipeline = diffusers.StableDiffusionInpaintPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-inpainting", torch_dtype=torch.float16
)

sd_dir = "workspace/sd/model"
pipeline.save_pretrained(sd_dir)

次のステップは、custom_handler.pyファイルを定義することです。これは、モデルがリクエストを受け取ったときのモデルの振る舞いを定義するために必要です。例えば、モデルのロード、入力の前処理、出力の後処理などです。handleメソッドはリクエストのメインエントリポイントであり、リクエストオブジェクトを受け取り、レスポンスオブジェクトを返します。このメソッドは事前学習済みのモデルのチェックポイントをロードし、入力データと出力データにpreprocessメソッドとpostprocessメソッドを適用します。以下のコードスニペットは、custom_handler.pyファイルの簡単な構造を示しています。詳細については、TorchServeハンドラAPIを参照してください。

def initialize(self, ctx: Context):

def preprocess(self, data):

def inference(self, data):

def handle(self, data, context):
    requests = self.preprocess(data)
    responses = self.inference(requests)

    return responses

TorchServeに必要な最後のファイルはmodel-config.yamlです。このファイルは、モデルサーバーの設定(ワーカーの数、バッチサイズなど)を定義します。この設定はモデルごとに行われ、以下のコードに示す例の設定ファイルがあります。パラメータの完全なリストについては、GitHubリポジトリを参照してください。

minWorkers: 1
maxWorkers: 1
batchSize: 1
maxBatchDelay: 200
responseTimeout: 300

最後のステップは、torch-model-archiverモジュールを使用してすべてのモデルアーティファクトを単一の.tar.gzファイルにパッケージ化することです:

!torch-model-archiver --model-name sd --version 1.0 --handler workspace/sd/custom_handler.py --extra-files workspace/sd/model --config-file workspace/sam/model-config.yaml --archive-format no-archive!cd sd && tar cvzf sd.tar.gz .

マルチモデルエンドポイントの作成

SageMaker MMEを作成する手順は以前と同じです。この具体的な例では、SageMaker SDKを使用してエンドポイントを起動します。まず、Amazon Simple Storage Service(Amazon S3)の場所とホスティングコンテナを定義します。このS3の場所は、SageMakerが呼び出しパターンに基づいてモデルを動的にロードする場所です。ホスティングコンテナは、前のステップでビルドしてAmazon ECRにプッシュしたカスタムコンテナです。以下のコードを参照してください:

# これがS3上でMMEがモデルを読み込む場所です。
multi_model_s3uri = output_path

次に、モデルの場所、ホスティングコンテナ、およびアクセス許可などのすべての属性をキャプチャするMulitDataModelを定義します:

print(multi_model_s3uri)
model = Model(
    model_data=f"{multi_model_s3uri}/sam.tar.gz",
    image_uri=container,
    role=role,
    sagemaker_session=smsess,
    env={"TF_ENABLE_ONEDNN_OPTS": "0"},
)

mme = MultiDataModel(
    name="torchserve-mme-genai-" + datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),
    model_data_prefix=multi_model_s3uri,
    model=model,
    sagemaker_session=smsess,
)
print(mme)

deploy()関数はエンドポイントの設定を作成し、エンドポイントをホストします。

mme.deploy(
    initial_instance_count=1,
    instance_type="ml.g5.2xlarge",
    serializer=sagemaker.serializers.JSONSerializer(),
    deserializer=sagemaker.deserializers.JSONDeserializer(),
)

提供した例では、SDKを使用してモデルをリストし、新しいモデルを動的に追加する方法も示しています。 add_model()関数は、ローカルモデルの.tarファイルをMMEのS3の場所にコピーします。

# Only sam.tar.gz visible!
list(mme.list_models())

models = ["sd/sd.tar.gz", "lama/lama.tar.gz"]
for model in models:
    mme.add_model(model_data_source=model)

モデルの呼び出し

これで、MMEにホストされている3つのモデルを順番に呼び出して、言語支援編集機能を構築することができます。各モデルを呼び出すには、predictor.predict()関数のtarget_modelパラメータを指定します。モデル名は、アップロードしたモデルの.tarファイルの名前です。以下は、SAMモデルの例コードスニペットです。このコードは、ピクセル座標、ポイントのラベル、および拡張カーネルサイズを受け取り、ピクセル位置のオブジェクトのセグメンテーションマスクを生成します。

img_file = "workspace/test_data/sample1.png"
img_bytes = None

with Image.open(img_file) as f:
    img_bytes = encode_image(f)

gen_args = json.dumps(dict(point_coords=[750, 500], point_labels=1, dilate_kernel_size=15))

payload = json.dumps({"image": img_bytes, "gen_args": gen_args}).encode("utf-8")

response = predictor.predict(data=payload, target_model="/sam.tar.gz")
encoded_masks_string = json.loads(response.decode("utf-8"))["generated_image"]
base64_bytes_masks = base64.b64decode(encoded_masks_string)

with Image.open(io.BytesIO(base64_bytes_masks)) as f:
    generated_image_rgb = f.convert("RGB")
    generated_image_rgb.show()

SAMから生成されたセグメンテーションマスクを使用して、画像から不要なオブジェクトを削除するには、元の画像とLaMaモデルにセグメンテーションマスクをフィードします。以下の画像は、その例を示しています。

サンプル画像 SAMからのセグメンテーションマスク LaMaを使用して犬を消去

画像の任意のオブジェクトをテキストプロンプトで変更または置換するには、SAMからのセグメンテーションマスクを元の画像とテキストプロンプトとともにSDモデルにフィードします。以下はその例です。

! !
サンプル画像 SAMからのセグメンテーションマスク

SDモデルを使用してテキストプロンプトで置換

「ベンチにいるハムスター」

コスト削減

SageMaker MMEの利点は、モデルの統合の規模に応じて増加します。次の表は、この記事の3つのモデルのGPUメモリ使用量を示しています。これらは、1つのg5.2xlargeインスタンス上に1つのSageMaker MMEを使用して展開されます。

モデル GPUメモリ (MiB)
セグメントアニシングモデル 3,362
ペイントでの安定した拡散 3,910
Lama 852

3つのモデルを1つのエンドポイントでホストすると、コスト削減が可能です。さらに、数百または数千のモデルを使用する場合、削減効果はさらに大きくなります。

例えば、100個の安定した拡散モデルを考えてみましょう。それぞれのモデルは、米国東部(北バージニア)リージョンで1つのml.g5.2xlargeエンドポイント(4 GiBメモリ)で提供することができます。これにより、月額で$218,880の費用がかかります。SageMaker MMEを使用すると、1つのエンドポイントでml.g5.2xlargeインスタンスを使用して4つのモデルを同時にホストできます。これにより、本番推論コストを75%削減し、月額$54,720になります。次の表は、この例における単一モデルエンドポイントとマルチモデルエンドポイントの違いをまとめたものです。目標モデルに十分なメモリを持つエンドポイント構成が与えられた場合、すべてのモデルがロードされた後の安定状態の呼び出し遅延は、単一モデルエンドポイントと同様になります。

. 単一モデルエンドポイント マルチモデルエンドポイント
月額エンドポイント料金 $218,880 $54,720
エンドポイントインスタンスタイプ ml.g5.2xlarge ml.g5.2xlarge
CPUメモリ容量(GiB) 32 32
GPUメモリ容量(GiB) 24 24
エンドポイント料金(1時間あたり) $1.52 $1.52
エンドポイントあたりのインスタンス数 2 2
100モデルに必要なエンドポイント数 100 25

クリーンアップ

作業が完了したら、この記事で提供されたノートブックのクリーンアップセクションの手順に従って、不要な料金を回避するためにプロビジョニングされたリソースを削除してください。推論インスタンスのコストについては、Amazon SageMakerの価格情報を参照してください。

結論

この記事では、TorchServeを使用したSageMaker MME上でホストされる生成型AIモデルの言語支援編集機能を紹介しました。共有リソースの活用とシンプルなモデル管理をSageMaker MMEとTorchServeを組み合わせて実現しました。SAM、SD 2 Inpainting、LaMaの3つの深層学習基盤モデルを利用しました。これらのモデルを使用することで、画像から不要なオブジェクトを消去したり、テキストの指示を与えることで画像のオブジェクトを変更または置換するなど、強力な機能を構築することができます。これらの機能は、アーティストやコンテンツクリエイターが繰り返し作業を自動化し、キャンペーンを最適化し、ハイパーカスタマイズされた体験を提供するために効率的に作業するのに役立ちます。この記事で提供された例を探索し、SageMaker MME上のTorchServeを使用して独自のUI体験を構築してみてください。

始めるには、GPUをバックエンドに使用するマルチモデルエンドポイントでサポートされるアルゴリズム、フレームワーク、およびインスタンスを参照してください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI研究

ジョンズ・ホプキンス大学とUCサンタクルーズ校の研究者が、画像ベースのAI学習の画期的な進歩であるD-iGPTを発表しました

“` 自然言語処理(NLP)は、GPTシリーズなどの大規模言語モデル(LLMs)の導入により、さまざまな言語的なタスクに対し...

AIニュース

マルチモーダルAIがデジタルのつながりを作り出す

「複数の要素とデータストリームを組み合わせることにより、マルチモーダルAIはよりスマートで人間らしいシステムの可能性を...

AIニュース

Amazonの後、アメリカの製造業を加速させる野心

ジェフ・ウィルク氏は、Amazonの世界的な消費者ビジネスの元CEOであり、LGOプレイブックを彼の新しい使命である米国の製造業...

AI研究

「ケンブリッジの研究者たちは、機械学習システムに不確実性を組み込むことを開発しています」

不確かな人間の洞察力の世界で、不確実性を受け入れることは、機械と人間がより効果的かつ信頼性の高い方法で協力するのに役...

機械学習

「DreamPose」というAIフレームワークを使用して、ファッション画像を見事な写真のようなビデオに変換します

ファッション写真は、ソーシャルメディアやEコマースのウェブサイトなど、オンラインプラットフォームで広く使われています。...