🚀 ニフティ’s Notion

SageMaker JumpStartを使って学習済みモデルを爆速でデプロイする

Amazon SageMaker JumpStartとは

💡
簡単に説明
  • Amazon SageMaker JumpStartは、Amazonが提供する機械学習のツール
  • 機械学習モデルを簡単に作成でき、モデル開発の経験がなくても使えるため、初心者でも簡単に利用できる
  • すでに用意された準備済みのツールやデータがあり、それらを利用することで、機械学習の始め方を手助けしてくれる

やりたいこと

  • SageMaker JumpStartを使うことで、学習済み機械学習モデルを作成、デプロイする
  • さらに、AWS LambdaとAmazon API Gatewayを使って機械学習APIを作る

SageMaker JumpStartを使って学習済みモデルを爆速でデプロイする

ユーザーの作成
  1. SageMakerのコンソールに行き、左のメニューからDomainsを選択
  2. ドメイン一覧が表示されるので、ユーザーを作成したいドメインを選択
  3. 「ユーザーを追加」を選択

  4. ユーザープロファイルの作成(名前は自分のリソースだと分かればOK)
    image block
    • それ以外は全てデフォルトでOK
      • 変更せずに「次へ」、「送信」
  5. ユーザーが作成されていることを確認
SageMaker Studioの起動
  1. 作成したユーザー名の右側にある、「起動」から、「Studio」を選択
    image block
  2. 別タブで以下のような画面が出るのでしばらく待つ
    image block
  3. SageMaker Studioが起動する
    image block
JumpStartを使用して学習済みモデルをデプロイ
  1. ホーム画面から、JumpStartを選択
  2. 「Stable Diffusion 2.1 base」を選択
  3. 以下のような画面に遷移する
    image block
    image block
    image block
  4. 「Deploy Model」の部分で、「Deploy Configuration」を開き、「Endpoint name」を変更する。それ以外はそのままでOK
    • Endpoint name: stable-diffusion-v2-1-base
      image block

  1. 「Deploy」を選択し、デプロイ
  2. モデルとエンドポイントが作成されるまで待つ(5~10分ほど)
  3. Endpoint StatusがIn Serviceとなり、モデルとエンドポイントが作成された(後で使うので、Endpoint nameをどこかにメモっておく)
    image block

Amazon API Gateway + AWS LambdaでAPIを作る

Lambda関数の作成
  1. AWS Lambdaのコンソール画面に移動し、「関数の作成」を選択
  2. 以下のように設定し、それ以外は全てデフォルトで「関数の作成」から、Lambda関数を作成
    • 関数名: stable-diffusion-api
    • ランタイム: Python 3.10
    image block
  3. 関数が作成されたら、以下のような画面になる
    image block
  4. 以下のソースコードをコピペする
    • エンドポイント名: 先ほど作成したエンドポイント名
    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
        }
    
  5. Lambda関数の管理画面より、「設定」→「一般設定」から「編集」をクリック。タイムアウトを5分に設定して、保存

IAMロールの変更
  1. Lambda関数の「設定」→ 「アクセス権限」より、「実行ロール名」のロール名をクリック
  2. 「許可を追加」から「ポリシーをアタッチ」をクリック
  3. 検索フォームから「SageMakerFullAccess」と検索して、出てきたポリシーを選択、「許可を追加」で追加する
    image block
  4. 「SageMakerFullAccess」のポリシーが追加されていることを確認する
    image block
API Gatewayの作成
  1. Lambda関数のページから、「トリガーを追加」をクリック
  2. 「ソースを選択」から「API Gateway」を選択
  3. 以下のように設定し、「追加」をクリック
    • インテント: 新規APIを作成
    • APIタイプ: REST API
    • セキュリティ: APIキー
    image block
  4. Lambdaの「関数の概要」にAPI Gatewayが追加されていることを確認
    image block
  5. 「設定」→「トリガー」より、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
  • 実行結果
    image block