Amazon Web Services ブログ

機械学習モデルをサーバーレス API としてデプロイ



機械学習 (ML) のプラクティショナーは、データの収集、アルゴリズムの設計、実験の実行を行い、結果を評価します。機械学習モデルを作成した後は、費用対効果の高いスケールで予測を提供するといった別の問題に直面します。

サーバーレステクノロジーを使用すると、基盤となるインフラストラクチャの管理方法を気にすることなく、モデル予測を提供できます。AWS Lambda などのサービスは、コードの実行時間に対してのみ請求されるため、大幅なコスト削減が可能になります。レイテンシーとメモリの要件に応じて、機械学習モデルを簡単にデプロイするには AWS Lambda が最適です。この記事では、機械学習モデルをサーバーレス API としてエンドユーザーに簡単に公開する方法の例を示します。

このブログ記事について
読む時間 5 分
完了するまでの時間 15 分
完了するためのコスト 無料利用枠または 1 USD 未満 (公開時刻)
学習レベル 中級 (200)

前提条件

このソリューションを実装するには、次のサービスにアクセスできる AWS アカウントが必要です。

ソリューションの概要

次の図は、このソリューションのアーキテクチャを示しています。

 

このソリューションは次のサービスを採用しています。

  • AWS Lambda – サーバーのプロビジョニングや管理を行わずに、機械学習推論コードを実行できます。実行時間のみに対してお支払いいただきます。Lambda 関数はディープラーニングモデルを読み込み、画像内のオブジェクトを検出します。Lambda レイヤーには、複数の関数にわたってインポートできるパッケージ化されたコードが含まれています。
  • AWS CodeBuild – アプリケーションの必須依存関係をインストールし、Lambda レイヤーパッケージを Amazon S3 にアップロードするコマンドを実行できます。テンプレートは、Apache MXNet、Keras-MXNet、Scikit-Learn、PIL、GluonCV、GluonNLP など、機械学習で一般的に使用されるパッケージをビルドします。ビルドプロセスの完了にかかる時間 (分単位) に対してのみ料金が発生します。
  • Amazon S3 – レイヤーパッケージと、ディープラーニングオブジェクト検出モデルをテストできるフロントエンドサイトを保存します。
  • Amazon API Gateway – フロントエンドに REST API を提供し、ディープラーニング Lambda 関数と整合します。
  • Amazon CloudFront – Amazon S3 から静的フロントエンドサイトを提供します。これにより、画像の URL をアップロードして、モデルが検出するオブジェクトを確認できます。

API の構築

次の CloudFormation テンプレートを起動して、US-East-1 でサーバーレス機械学習 API の例を構築するか、この URL を使用してご使用のリージョンで起動します。この例は、多くの組み込み Amazon SageMaker アルゴリズムによって作成されたカスタム機械学習モデルまたはアーティファクトをデプロイするための開始点として使用できます。CloudFormation テンプレートは、ユーザーが提供する画像内のオブジェクトを検出するフロントエンドも提供します。

API の起動

CloudFormation テンプレートを起動した後、デフォルト設定を使用するか、AWS Lambda 推論コードと Amazon S3 フロントエンドに別のパスを提供してデプロイメントをカスタマイズできます。フロントエンドコードで、テキスト API_GATEWAY_ENDPOINT_URL を AWS CloudFormation による API Gateway エンドポイントの URL に置き換えます。

CloudFormation スタックを作成した後、カスタムオブジェクトを検出するためのサイトへのリンクが AWS CloudFormation コンソールの [出力] タブに表示されます。

リンクをクリックすると、画像の URL を入力してモデルが検出したオブジェクトを確認できる単純なウェブサイトが表示されます。次のスクリーンショットは、オブジェクトが強調表示された画像の例を示しています。

この記事では、GluonCV のオブジェクト検出モデルが画像の推論を実行します。カスタムモデルをデプロイするには、前述のオブジェクト検出例のように、Lambda 関数のコードを含めてモデルをダウンロードします。または、次の例のように、モデルパラメータファイルを AWS Lambda コードパッケージに直接含めることで、レイテンシーを改善できます。

API のカスタマイズ

カスタムモデルをデプロイするには、次の手順を完了します。

  1. AWS Lambda コンソールで、serverless-ml-Inference-xxxxxxxxxxxx という形式の関数を選択します。次のコードは、推論が 25 行未満のコードで実行されることを示しています。
    from mxnet.image import imdecode
    from gluoncv import model_zoo, data, utils
    import requests
    from io import BytesIO
    import json
    import base64
    
    net = model_zoo.get_model('yolo3_mobilenet1.0_coco', pretrained=True, root='/tmp/')
    
    def lambda_handler(event, context):
        try:
            url = event['img_url']
            response = requests.get(url)
            img = imdecode(response.content)
            x, img = data.transforms.presets.yolo.transform_test([img], short=320)
            class_IDs, scores, bounding_boxs = net(x)
            output = utils.viz.plot_bbox(img, bounding_boxs[0], scores[0],
                                class_IDs[0], class_names=net.classes)
            output.axis('off')
            f = BytesIO()
            output.figure.savefig(f, format='jpeg', bbox_inches='tight')
            return base64.b64encode(f.getvalue())
        except Exception as e:
            raise Exception('ProcessingError')
    

    オブジェクト検出を実行する代わりに、次の GitHub リポジトリの Amazon SageMaker サンプルからトレーニングされたカスタムモデルを使用してカスタム推論コードをアップロードできます。これは、文章に肯定的な感情または否定的な感情があるかどうかを検出します。

  2. AWS Lambda IDE にファイル inference.zip をアップロードします。次のスクリーンショットは、AWS Lambda コンソールの関数コードセクションを示しています。
  3. ユーザーに感情分析モデルを提示するフロントエンドインターフェイスの frontend.html 機械学習をダウンロードします。
  4. API Gateway エンドポイントの URL を見つけるには、API Gateway コンソールで、[Machine Learning REST API] を選択します。
  5. [本稼働ステージエディタ] セクションで、[Invoke URL] を見つけます。
  6. frontend.html ファイルを開き、テキスト API_GATEWAY_ENDPOINT_URL を API Gateway エンドポイントの URL に置き換えます。次は元のコードです。
    xhr.open("POST", ‘API_GATEWAY_ENDPOINT_URL’, true);

    以下は、更新されたコードです。

    xhr.open("POST", ‘https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Production/’, true);

    これで、S3 バケット内の frontend.html ファイルを新規ファイルに置き換える準備ができました。

  7. Amazon S3 コンソールで、serverless-ml-inferenceapp-xxxxxxxxxxxx という形式のバケットを選択します。
  8. 新しい frontend.html ファイルをバケットにドラッグします。
  9. [アップロード] を選択します。

サンプルウェブサイトの URL にアクセスすると、感情分析が実行されます。そのスクリーンショットを次に示します。

AWS Lambda のフロントエンドコードと推論コードが用意できたので、代わりに CloudFormation テンプレートを再起動して、BuildCodeFrontendCode、および InferenceCode の新規ファイルへのリンクを入力できます。

まとめ

この記事では、機械学習モデルをサーバーレス API としてデプロイするために必要な構成要素を起動する方法をお見せしました。そのために、機械学習コードの依存関係を Lambda 関数にインポートできるようにする Lambda レイヤーを構築するプロセスを作成しました。REST API とフロントエンドを備えたサンプルアプリケーションもデプロイしました。これにより、予測を提供するための簡単かつスケーラブルで費用対効果の高い方法を提供することで、機械学習モデルの構築に専念できます。

その他の参考資料


著者について

Anders Christiansen は AWS プロフェッショナルサービスのデータサイエンティストであり、お客様がビジネスに機械学習ソリューションを実装するよう支援しています。