概要
以下の記事を参考に、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という仮想環境を作成していますが、この点は必須ではないはずです。
注意
ドキュメントでは、この後にcdk deployをするように記載されています。その結果、deployすることができ、lambdaのテストも実行できました。しかし、後述するlambdaの関数URLを発行して利用した際に、いくつかエラーが発生しました。そのため、次の修正を行います。
inference/*.py
関数URLから利用する場合、パラメータがqueryStringParametersに格納されるため、そのための処理を追加します。postで利用する場合には、さらに修正が必要です。
以下、sentiment.pyの変更例です。pipelineの引数などを変更することで、自作モデルに基づく推論を行うことも可能です。
inference/Dockerfile
次に、Dockerfileに文字コードの指定を追加します。
Deploy
その後、以下を実行して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
以下のような結果が得られます。
CloudFront
本設定も、先と同様、以下の記事が参考になります。
https://dev.classmethod.jp/articles/integrate-aws-lambda-with-cloudfront/
重要な点は、Origin request settingsにおいて、Query stringsをAllにすることです。これを行わないと、URLのクエリ文字列を変更しても同じ結果が返却されてしまいます。
この結果、以下のようなURLから、推論を実行することができます。さらに独自ドメインを与えることも可能です。
https://yyy.cloudfront.net/?text=i am happy
まとめ
Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現するを紹介しました。間違っている点もあるかもしれませんが、参考になりましたら幸いです。