👌

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

2022/07/17に公開

概要

以下の記事を参考に、Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を行った備忘録です。

https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/

また、Lambdaの関数URLとCloudFrontを用いたAPIの提供までを行います。

Hugging FaceモデルをAWS Lambdaでホスティング

準備

この点については冒頭でも紹介した、以下のドキュメントを参考にしています。

https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/

まず以下のコマンドを実行します。venvという仮想環境を作成していますが、この点は必須ではないはずです。

#Clone the project to your development environment
git clone https://github.com/aws-samples/zero-administration-inference-with-aws-lambda-for-hugging-face.git
cd zero-administration-inference-with-aws-lambda-for-hugging-face

# 仮想環境の作成と有効化
python -m venv venv
source venv/bin/activate

# Install the required dependencies:
pip install -r requirements.txt

# Bootstrap the CDK. This command provisions the initial resources needed by the CDK to perform deployments:
cdk bootstrap

注意

ドキュメントでは、この後にcdk deployをするように記載されています。その結果、deployすることができ、lambdaのテストも実行できました。しかし、後述するlambdaの関数URLを発行して利用した際に、いくつかエラーが発生しました。そのため、次の修正を行います。

inference/*.py

関数URLから利用する場合、パラメータがqueryStringParametersに格納されるため、そのための処理を追加します。postで利用する場合には、さらに修正が必要です。

以下、sentiment.pyの変更例です。pipelineの引数などを変更することで、自作モデルに基づく推論を行うことも可能です。

"""
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: MIT-0
"""

import json
from transformers import pipeline

nlp = pipeline("sentiment-analysis")

def handler(event, context):
        # 追加
    if "queryStringParameters" in event:
        text = event["queryStringParameters"]["text"]
    else:
        text = event["text"]
	
    response = {
        "statusCode": 200,
	# "body": nlp(event['text'])[0]
        "body": nlp(text)[0] # 追加
    }
    return response

inference/Dockerfile

次に、Dockerfileに文字コードの指定を追加します。

...(略)

FROM huggingface/transformers-pytorch-cpu
ENV PYTHONIOENCODING="utf8" # 追加

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Copy in the built dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}

ENTRYPOINT [ "python3", "-m", "awslambdaric" ]

# This will get replaced by the proper handler by the CDK script
CMD [ "sentiment.handler" ]

Deploy

その後、以下を実行してdeployします。

cdk deploy

lambdaの関数URL

以下の記事などが参考になります。

https://dev.classmethod.jp/articles/integrate-aws-lambda-with-cloudfront/

lambdaの画面から、関数URLを作成します。今回は単純に、「関数タイプ」に「NONE」を指定して、「オリジン間リソース共有 (CORS) を設定」を有効化しました。

また、「許可メソッド」は「*(すべて)」を選択しました。

この結果、以下のようなURLから、推論を実行することができます。

https://XXX.lambda-url.us-east-1.on.aws/?text=i am happy

以下のような結果が得られます。

{
  "statusCode": 200,
  "body": {
    "label": "POSITIVE",
    "score": 0.9998801946640015
  }
}

CloudFront

本設定も、先と同様、以下の記事が参考になります。

https://dev.classmethod.jp/articles/integrate-aws-lambda-with-cloudfront/

重要な点は、Origin request settingsにおいて、Query stringsAllにすることです。これを行わないと、URLのクエリ文字列を変更しても同じ結果が返却されてしまいます。

この結果、以下のようなURLから、推論を実行することができます。さらに独自ドメインを与えることも可能です。

https://yyy.cloudfront.net/?text=i am happy

まとめ

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現するを紹介しました。間違っている点もあるかもしれませんが、参考になりましたら幸いです。

Discussion