Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する
概要
以下の記事を参考に、Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を行った備忘録です。
また、Lambdaの関数URLとCloudFrontを用いたAPIの提供までを行います。
Hugging Faceモデルを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 ${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
以下の記事などが参考になります。
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
本設定も、先と同様、以下の記事が参考になります。
重要な点は、Origin request settings
において、Query strings
をAll
にすることです。これを行わないと、URLのクエリ文字列を変更しても同じ結果が返却されてしまいます。
この結果、以下のようなURLから、推論を実行することができます。さらに独自ドメインを与えることも可能です。
https://yyy.cloudfront.net/?text=i am happy
まとめ
Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現するを紹介しました。間違っている点もあるかもしれませんが、参考になりましたら幸いです。
Discussion