概要

以下の記事を参考に、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という仮想環境を作成していますが、この点は必須ではないはずです。

#gc#ps#p#cCidyoidlttuIpBkozhrnonceocsiobelrnetntoooassotn--vltttheamelarsednlathmvvtlprptie/hartnnbe-tpopivirhjssnree:tv/erc/reaqeCt/ancuqDgtvtiuKtiiiri.otoverhnadeTyu-tmhobiedeiu.nensrcfptoeescdmrn.oe/edtmanexmewcntalsecno--idpswemaispemt:rnphotl-veaieswsn/siz-oielnrrasoomn-btmadhedaenm-tifinoniris-tthiruaagltgiironengs--oifunarfcceeersennceee-dweidthb-yawtsh-elaCmDbKdat-ofopre-rhfuogrgmindge-pflaocyem.egnitts:

注意

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

inference/*.py

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

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

"CS"ifnd "oP"mrle #"pD"popf yXom "r-r=h ierb}riLtta fleoegirpn ssdthcjaid "epyutesnpl#qt:to"""rnoseeueens:bnAsnflrexxstomeoi(rtteandra-rneytlyezImevS===up"sode(ets(:pner"nree{Ceo.nsstivvovnncte,needelsoiingnnenpemfmtcPtt"t(,ipioa[[:[teomnr""'eIrretaqt2txn:tnemue0etctxeex0x).Mp-ttrt,t[Iia)ey"'0oTpn:rS]]]r-east)0ll"r[#iiyi0tnsin]seingsPa"eaf)vrfeainmltei:taetress".][A"ltlexRti"g]htsReserved.

inference/Dockerfile

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

FE#A#W#CE#CRNROONM.OVIGSRCPTTDMneKoYRhPcFtDpYi[hYlUIyPsuTuNwR-O"gHdCoifIwsgOeTr$nrNieiNIk{oTlnnIgOiFtmltgOlNnUh=[ifEo_gNebgmaNbDCu"eecCaIdTbiptneOlRiIulyt/DrOidtr.tIaeNl-hehrNrc_tiopaaGgtDmnlnn=oIda3ads"irReg"clfuny}pe,eeotedrrfttn$""m8hod{-be"ieFmy]rsfnU"s#ucN,t-sniChptceT"eyatsIatgiOwpoeoNsrrn_locoDaphfrIme-oRbrcto}dphtahue$rad{inbiFcdurU"lieNelcC]rdtToIbrOyyN_tDhIeR}CDKscript

Deploy

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

cdkdeploy

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

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

{}""}sbto""adlstyacu"bos:erCleo{""d::e""0:P.O92S90I90T8,I8V0E1"9,46640015

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でホスティングし、サーバーレス推論を実現するを紹介しました。間違っている点もあるかもしれませんが、参考になりましたら幸いです。