Amazon SageMaker JumpStartとは
やりたいこと
SageMaker JumpStartを使って学習済みモデルを爆速でデプロイする
ユーザーの作成
SageMaker Studioの起動
JumpStartを使用して学習済みモデルをデプロイ
Amazon API Gateway + AWS LambdaでAPIを作る
Lambda関数の作成
IAMロールの変更
API Gatewayの作成
ローカルで実行してみる
Amazon SageMaker JumpStartとは
💡
簡単に説明
- Amazon SageMaker JumpStartは、Amazonが提供する機械学習のツール
- 機械学習モデルを簡単に作成でき、モデル開発の経験がなくても使えるため、初心者でも簡単に利用できる
- すでに用意された準備済みのツールやデータがあり、それらを利用することで、機械学習の始め方を手助けしてくれる
やりたいこと
- SageMaker JumpStartを使うことで、学習済み機械学習モデルを作成、デプロイする
- さらに、AWS LambdaとAmazon API Gatewayを使って機械学習APIを作る
SageMaker JumpStartを使って学習済みモデルを爆速でデプロイする
ユーザーの作成
- SageMakerのコンソールに行き、左のメニューからDomainsを選択
- ドメイン一覧が表示されるので、ユーザーを作成したいドメインを選択
-
「ユーザーを追加」を選択
-
ユーザープロファイルの作成(名前は自分のリソースだと分かればOK)
-
それ以外は全てデフォルトでOK
- 変更せずに「次へ」、「送信」
-
それ以外は全てデフォルトでOK
- ユーザーが作成されていることを確認
SageMaker Studioの起動
- 作成したユーザー名の右側にある、「起動」から、「Studio」を選択
- 別タブで以下のような画面が出るのでしばらく待つ
- SageMaker Studioが起動する
JumpStartを使用して学習済みモデルをデプロイ
- ホーム画面から、JumpStartを選択
- 「Stable Diffusion 2.1 base」を選択
- 以下のような画面に遷移する
-
「Deploy Model」の部分で、「Deploy Configuration」を開き、「Endpoint name」を変更する。それ以外はそのままでOK
- Endpoint name: stable-diffusion-v2-1-base
- 「Deploy」を選択し、デプロイ
- モデルとエンドポイントが作成されるまで待つ(5~10分ほど)
- Endpoint StatusがIn Serviceとなり、モデルとエンドポイントが作成された(後で使うので、Endpoint nameをどこかにメモっておく)
Amazon API Gateway + AWS LambdaでAPIを作る
Lambda関数の作成
- AWS Lambdaのコンソール画面に移動し、「関数の作成」を選択
-
以下のように設定し、それ以外は全てデフォルトで「関数の作成」から、Lambda関数を作成
- 関数名: stable-diffusion-api
- ランタイム: Python 3.10
- 関数が作成されたら、以下のような画面になる
-
以下のソースコードをコピペする
- エンドポイント名: 先ほど作成したエンドポイント名
import json import base64 import boto3 # 入力されたテキストデータから機械学習エンドポイントに対して、リクエストを送信し、結果を返す def query_endpoint(text): client = boto3.client('runtime.sagemaker') endpoint_name = '<エンドポイント名>' encoded_text = text.encode("utf-8") response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-text', Body=encoded_text, Accept='application/json;jpeg') return response # 機械学習エンドポイントからの出力結果のJSONを解析し、画像を返す def parse_response(query_response): response_dict = json.loads(query_response['Body'].read()) return response_dict['generated_image'] # ここが実行される def lambda_handler(event, context): body = json.loads(event['body']) text = body['text'] response = query_endpoint(text) img = parse_response(response) return { 'statusCode': 200, 'headers': { 'Content-Type': "'image/jpeg'", }, 'body': img, 'isBase64Encoded': True }
- Lambda関数の管理画面より、「設定」→「一般設定」から「編集」をクリック。タイムアウトを5分に設定して、保存
IAMロールの変更
- Lambda関数の「設定」→ 「アクセス権限」より、「実行ロール名」のロール名をクリック
- 「許可を追加」から「ポリシーをアタッチ」をクリック
- 検索フォームから「SageMakerFullAccess」と検索して、出てきたポリシーを選択、「許可を追加」で追加する
- 「SageMakerFullAccess」のポリシーが追加されていることを確認する
API Gatewayの作成
- Lambda関数のページから、「トリガーを追加」をクリック
- 「ソースを選択」から「API Gateway」を選択
-
以下のように設定し、「追加」をクリック
- インテント: 新規APIを作成
- APIタイプ: REST API
- セキュリティ: APIキー
- Lambdaの「関数の概要」にAPI Gatewayが追加されていることを確認
- 「設定」→「トリガー」より、API Gatewayが追加されていることを確認し、「APIエンドポイント」と、「APIキー」をメモしておく
ローカルで実行してみる
-
コマンド
curl -X POST <APIエンドポイント> -d "{\\"text\\": \\"1 pomeranian on the sofa\\"}" --header 'x-api-key:<APIキー>' | base64 -d > ~/Downloads/image.jpeg
-
実行結果