FastAPI、AWS Lambda、およびAWS CDKを使用して、大規模言語モデルのサーバーレスML推論エンドポイントを展開します
Using FastAPI, AWS Lambda, and AWS CDK, deploy a serverless ML inference endpoint for large language models.
データサイエンティストにとって、機械学習(ML)モデルを概念証明から本番環境に移行することは、しばしば大きな課題を提供します。主要な課題の1つは、クラウドで推論と他のアプリケーションでの使用のために、パフォーマンスの良いローカルにトレーニングされたモデルを展開することです。プロセスを管理することは手間がかかる場合がありますが、適切なツールを使用すると、必要な労力を大幅に削減できます。
2022年4月に一般提供されたAmazon SageMaker Inferenceは、MLモデルを本番環境に展開してスケールで予測を行うことを簡単にするため、さまざまなMLインフラストラクチャとモデル展開オプションを提供して、あらゆる種類のML推論ニーズを満たすのに役立ちます。 SageMaker Serverless Inferenceエンドポイントを使用して、トラフィックのスパート間にアイドル期間のあるワークロードに対応し、サーバーの選択と管理の重労働を自動化できます。さらに、AWS Lambdaを直接使用して、お好みのオープンソースフレームワークを使用してモデルを公開し、MLアプリケーションを展開できます。これにより、柔軟性が高くコスト効果が高いことが証明されます。
FastAPIは、PythonでAPIを構築するためのモダンで高性能なWebフレームワークです。RESTfulマイクロサービスとML推論をスケールで複数の業界で使用するユースケースを開発する場合には、優れた性能と自動APIドキュメントのような組み込み機能に優れています。 FastAPIのOut-of-the-box機能を使用してルートを定義し、必要に応じてビジネスロジックを拡張してスケールアウトすることができます。ローカルでテストし、Lambdaでホストして、単一のAPIゲートウェイを介して公開することができるため、コードのリファクタリングや重労働なしにオープンソースのWebフレームワークをLambdaにもたらすことができます。
この投稿では、FastAPI、Docker、Lambda、およびAmazon API Gatewayを使用して、MLモデルをエンドポイントとして公開することにより、サーバーレスML推論を簡単にデプロイして実行する方法を紹介します。 AWS Cloud Development Kit(AWS CDK)を使用してデプロイを自動化する方法も示します。
ソリューションの概要
この投稿で展開するソリューションのアーキテクチャを次の図に示します。
前提条件
次の前提条件を満たす必要があります。
- Python3がインストールされており、Pythonで仮想環境を作成および管理するための
virtualenv
がインストールされていること - AWS CDK CLIを使用できるようにするために、システムにaws-cdk v2がインストールされていること
- Dockerがインストールされており、ローカルマシンで実行されていること
必要なソフトウェアがすべてインストールされているかどうかをテストしてください。
-
AWS CLIが必要です。アカウントにログインして、ソリューションを展開するリージョンを選択してください。
-
次のコードを使用して、Pythonのバージョンを確認します。
python3 --version
-
Pythonで仮想環境を作成して管理するために
virtualenv
がインストールされているかどうかを確認します。厳密には、これは必須ではありませんが、これにより、この投稿に沿って簡単に追跡できるようになります。次のコードを使用してください。python3 -m virtualenv --version
-
cdkがインストールされているかどうかを確認します。これは、ソリューションを展開するために使用されます。
cdk --version
-
Dockerがインストールされているかどうかを確認します。ソリューションでは、モデルをLambdaにDockerイメージとして公開します。これをローカルでビルドするためには、Dockerが必要です。
docker --version
-
次のコードを使用して、Dockerが起動していることを確認してください。
docker ps
AWS CDKを使用したFastAPIプロジェクトの構造方法
当社のプロジェクトには、次のディレクトリ構造を使用します(この投稿の文脈では重要でないいくつかのボイラープレートAWS CDKコードを無視しています)。
```
fastapi_model_serving
│
└───.venv
│
└───fastapi_model_serving
│ │ __init__.py
│ │ fastapi_model_serving_stack.py
│ │
│ └───model_endpoint
│ └───docker
│ │ Dockerfile
│ │ serving_api.tar.gz
│
│
│ └───runtime
│ └───serving_api
│ requirements.txt
│ serving_api.py
│ └───custom_lambda_utils
│ └───model_artifacts
│ ...
│ └───scripts
│ inference.py
│
└───templates
│ └───api
│ │ api.py
│ └───dummy
│ dummy.py
│
│ app.py
│ cdk.json
│ README.md
│ requirements.txt
│ init-lambda-code.sh
```
AWS CDKプロジェクトのPython向け推奨構造に従ったディレクトリです。
このリポジトリの最も重要な部分は、fastapi_model_serving
ディレクトリです。これには、AWS CDKスタックを定義し、モデルサービングに使用されるリソースを定義するコードが含まれています。
fastapi_model_serving
ディレクトリには、model_endpoint
サブディレクトリが含まれており、サーバーレスエンドポイントを構成するために必要なすべてのアセットを含みます。つまり、Lambdaが使用するDockerイメージをビルドするためのDockerfile、FastAPIを使用して推論リクエストを処理し、適切なエンドポイントにルーティングするLambda関数コード、展開したいモデルのモデルアーティファクトが含まれます。model_endpoint
には、以下も含まれます。
Docker
– このサブディレクトリには、以下が含まれます。Dockerfile
– これは、Lambda関数のイメージをビルドするために使用され、すべてのアーティファクト(Lambda関数コード、モデルアーティファクトなど)が適切な場所にあるため、問題なく使用できます。serving.api.tar.gz
– これは、Dockerイメージをビルドするために必要なランタイムフォルダからのすべてのアセットを含むtarballです。後でこの投稿で.tar.gz
ファイルを作成する方法について説明します。runtime
– このサブディレクトリには、以下が含まれます。serving_api
– Lambda関数と、requirements.txtファイルで指定された依存関係のコード。custom_lambda_utils
– これには、必要なモデルアーティファクトをロードする推論スクリプトが含まれており、serving_api
に渡され、エンドポイントとして公開されます。
さらに、テンプレートディレクトリがあり、ここでは、前に説明したサンプルに従って、カスタマイズされたコードとAPIを定義するためのフォルダ構造とファイルのテンプレートが提供されます。テンプレートディレクトリには、新しいLambda関数を作成するために使用できるダミーコードが含まれています。
dummy
– Pythonランタイムを使用した通常のLambda関数の構造を実装するコードが含まれています。api
– 既存のAPIゲートウェイにFastAPIエンドポイントをラップするLambda関数を実装するコードが含まれています。
ソリューションをデプロイする
デフォルトでは、コードはeu-west-1リージョン内に展開されます。リージョンを変更する場合は、cdk.json
ファイルのDEPLOYMENT_REGIONコンテキスト変数を変更できます。
ただし、このソリューションは、Lambdaがarm64アーキテクチャの上に展開されることを試みますが、この機能がすべてのリージョンで利用可能でない場合があります。この場合、fastapi_model_serving_stack.py
ファイルのarchitectureパラメータと、Dockerディレクトリ内のDockerfileの最初の行をx86アーキテクチャに変更する必要があります。
ソリューションを展開するには、次の手順を実行します。
-
次のコマンドを実行してGitHubリポジトリをクローンします:
git clone https://github.com/aws-samples/lambda-serverless-inference-fastapi
。ローカルでトレーニングしたモデルアーティファクトでソリューションが動作することを示したいため、serving_api.tar.gz
ファイルに事前にトレーニングされたDistilBERTモデルのサンプルモデルアーティファクトが含まれています。ダウンロードには約3〜5分かかる場合があります。これで、環境を設定しましょう。 -
Hugging Face Model Hubから展開される事前トレーニング済みのモデルを
./model_endpoint/runtime/serving_api/custom_lambda_utils/model_artifacts
ディレクトリにダウンロードします。必要なすべての依存関係を含めた仮想環境を作成します。このコマンドは1回だけ実行する必要があります:make prep
。このコマンドには、モデルアーティファクトをダウンロードする必要があるため、約5分かかる場合があります。 -
モデルアーティファクトを
.tar.gz
アーカイブにパッケージ化し、AWS CDKスタックでビルドされるDockerイメージ内で使用されるようにします。モデルアーティファクトまたはAPI自体に変更を加えるたびに、このコードを実行して、常に最新バージョンのサービングエンドポイントを持つようにします:make package_model
。アーティファクトはすべて揃っています。今度はAWSアカウントにAWS CDKスタックを展開できます。 -
環境(アカウント+リージョンの組み合わせ)にAWS CDKアプリを初めて展開する場合は、cdk bootstrapを実行します:
make cdk_bootstrap
このスタックには、ツールキットの動作に必要なリソースが含まれています。たとえば、スタックには、展開プロセス中にテンプレートとアセットを保存するために使用されるAmazon Simple Storage Service(Amazon S3)バケットが含まれています。
このAWS CDKデプロイメントでDockerイメージをローカルでビルドしているため、AWS CDK CLIを介してこのスタックを展開する前に、Dockerデーモンが実行されていることを確認する必要があります。
-
システムでDockerデーモンが実行されているかどうかを確認するには、次のコマンドを使用します:
docker ps
エラーメッセージが表示されない場合は、ソリューションを展開する準備ができているはずです。
-
次のコマンドでソリューションを展開します:
make deploy
この手順には、Dockerイメージのビルドとプッシュのために約5〜10分かかる場合があります。
トラブルシューティング
Macユーザーの場合、DockerログインでAmazon Elastic Container Registry(Amazon ECR)にログインしようとすると、Error saving credentials ... not implemented
などのエラーが発生する場合があります。例えば:
exited with error code 1: Error saving credentials: error storing credentials - err: exit status 1,...dial unix backend.sock: connect: connection refused
AWS CDK内のDockerコンテナの上でLambdaを使用する前に、~/docker/config.json
ファイルを変更する必要がある場合があります。より具体的には、~/.docker/config.json
のcredsStoreパラメータをosxkeychainに変更する必要があります。これにより、Mac上でのAmazon ECRログインの問題が解決されます。
リアルタイム推論を実行する
AWS CloudFormationスタックが正常にデプロイされた後、AWS CloudFormationコンソールのスタックのOutputsタブに移動し、エンドポイントURLを開きます。これで、モデルはエンドポイントURLを介してアクセス可能になり、リアルタイム推論を実行する準備が整いました。
URLに移動して、「hello world」というメッセージが表示されるかどうかを確認し、アドレスに/docs
を追加して、インタラクティブなswagger UIページが正常に表示されるかどうかを確認します。一部のコールドスタート時間がある場合がありますので、数回待機またはリフレッシュする必要があります。
FastAPI swagger UIページのランディングページにログインした後、ルートの/
または/question
を介して実行できます。
/
からAPIを実行し、「hello world」というメッセージを取得することができます。
/question
からAPIを実行し、デプロイされたモデルで質問応答のケースに対してML推論を実行することができます。例えば、質問は「私の車の色は今何ですか?」で、コンテキストは「私の車は以前は青かったが、赤に塗った」とします。
実行を選択すると、与えられたコンテキストに基づいて、モデルが質問に答え、以下のスクリーンショットに示されるように応答します。
レスポンスボディでは、モデルからの確信度スコアを含む回答が表示されます。他の例を試したり、APIを既存のアプリケーションに埋め込んだりすることもできます。
また、コードを介して推論を実行することもできます。以下は、requests
ライブラリを使用したPythonの例です:
import requests
url = "https://<YOUR_API_GATEWAY_ENDPOINT_ID>.execute-api.<YOUR_ENDPOINT_REGION>.amazonaws.com/prod/question?question=\"What is the color of my car now?\"&context=\"My car used to be blue but I painted red\""
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
このコードは、次のような文字列を出力します:
'{"score":0.6947233080863953,"start":38,"end":41,"answer":"red"}'
AWSでGenerative AIおよび大規模言語モデルをデプロイする方法について詳しく知りたい場合は、こちらをご覧ください:
- OpenLLaMaを使用したAWS LambdaでのサーバーレスGenerative AIのデプロイ
- 大規模なモデル推論コンテナを使用してAWS Inferentia2に大規模な言語モデルをデプロイする
クリーンアップ
リポジトリのルートディレクトリ内で、次のコードを実行してリソースをクリーンアップします:
make destroy
結論
この記事では、Lambdaを使用して、FastAPIなどの好きなWebアプリケーションフレームワークを使用してトレーニングされたMLモデルを展開する方法を紹介しました。デプロイできる詳細なコードリポジトリを提供し、処理するトレーニング済みモデルアーティファクトを切り替える柔軟性を保持します。モデルの実装と展開方法によって性能が異なります。
ぜひ自分で試してみて、フィードバックをお聞かせください!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles