はじめに
こんにちは、ニフティのいかりがわです。
ニフティでは毎年、新卒エンジニア向けのOJTとしてエンジニア定例という勉強会を開催しています。
私は機械学習の講師を務めていて、講義の中でAmazon SageMakerを使ったハンズオン実習を行うことにしました。そのために、いろいろな勉強をして準備を進めていました。
その中で、Amazon SageMaker JumpStartが学習済みのモデルをボタンポチポチで簡単にデプロイできて楽しいなぁと思ったので紹介させていただきます!
Amazon SageMaker JumpStartとは
まず、Amazon SageMakerを簡単に説明すると以下のようになります。
- Amazon SageMaker JumpStartは、Amazonが提供する機械学習のツール
- 事前準備されたリソースを活用して、目的に合わせた機械学習の実行を容易にしてくれる
- 機械学習モデルを簡単に作成できるため、モデル開発の経験がない初心者でも簡単に使うことができる
Amazon SageMaker JumpStartはAmazon SageMakerの一つの機能である、Amazon SageMaker Studioから利用することができます。
また、GUIでの操作で簡単に実施することができ、数回のクリックだけで機械学習ソリューションの展開や学習済みモデルのデプロイ、ファインチューニング等を簡単に実行することができます!
やりたいこと
今回の記事では以下のことを行います。
- SageMaker JumpStartを使うことで、学習済み機械学習モデルを作成、デプロイする!
- さらに、LambdaとAPI Gatewayを使って機械学習APIを作成する!
SageMaker JumpStartで学習済み機械学習モデルをデプロイする
SageMaker Studioを立ち上げるために必要なドメインやユーザープロファイルはすでに設定済みとします。
作成方法は公式チュートリアルよりご参照ください。
SageMaker Studioの起動
ユーザー名の右側にある、「起動」から「Studio」を選択すると、SageMaker Studioが起動します。
JumpStartを使用して学習済みモデルをデプロイ
2. 使用したい機械学習モデルを選択します。(今回はStable Diffusion 2.1 base)
3. こんな感じの画面に遷移します。
4. 「Deploy」を選択し、デプロイ!
5. モデルとエンドポイントが作成されるまで5~10分ほど待機…
しばらく待つと、Endpoint StatusがIn Serviceとなりモデルとエンドポイントが作成されました!(Endpoint nameは後で使います。)
API Gateway + Lambdaで機械学習APIを作る
Lambdaの作成
1. Lambdaのコンソール画面に移動し、「関数の作成」を選択します。
2. 作成画面では以下のように設定し、それ以外はそのままで「関数の作成」をクリック 。
- 関数名: 任意
- ランタイム: Python 3.10
3. 関数が作成されたら、以下のソースコードをコピペ。
- コード内の<エンドポイント名>は、先ほどSageMaker Studioで作成したEndpoint nameを入れてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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 } |
4. タイムアウトを5分に設定。
5. IAMロールの変更。
- 「設定」→ 「アクセス権限」→「実行ロール名」のロール名をクリックすると設定できます
- 「許可を追加」から「ポリシーをアタッチ」をクリック。
6. 検索フォームから「SageMakerFullAccess」と検索して出てきたポリシーを選択、「許可を追加」で追加し、ポリシーが追加されていることを確認します。
API Gatewayの作成
1. Lambda関数のページから、「トリガーを追加」をクリックし、「ソースを選択」から「API Gateway」を選択します。
2. 以下のように設定し、「追加」をクリック。
- インテント: 新規APIを作成
- APIタイプ: REST API
- セキュリティ: APIキー
3. Lambdaの「関数の概要」にAPI Gatewayが追加されていることを確認します。
4. 「設定」→「トリガー」より、API Gatewayが追加されていることを確認し、「APIエンドポイント」と「APIキー」をメモしておきます
ローカルで実行!
ここまできたらドキドキの実行タイムです!
- curlコマンドなどでAPIを叩いてみてください!
<Stable Diffusionに読ませたい文字>には好きな文字を記述してください。
1 2 3 |
curl -X POST <APIエンドポイント> \ -d "{\\"text\\": \\"<Stable Diffusionに読ませたい文字>\\"}" \ --header 'x-api-key:<APIキー>' | base64 -d > ~/Downloads/image.jpeg |
おわりに
今回は、Amazon SageMaker JumpStartを使用して学習済みの機械学習モデルを作成、デプロイし、LambdaとAPI Gatewayを使って機械学習APIを作成する方法を紹介しました。
Amazon SageMaker JumpStartを使えば機械学習についてあまり詳しくない初心者でも簡単に機械学習のAPIを作成することができます!
また、自分で持っている画像を使ってファインチューニングしたモデルを作成することもできますので、機械学習に詳しい方でも色々使えると思いますのでぜひ活用してみてください!
最後に、作成したAPIに「1 pomeranian on the sofa」と入力した結果を貼っておきます!
かわいいですね!