Amazon Web Services ブログ
Amazon SageMaker エンドポイントとAWS Lambdaを使って、YOLOv5の推論をスケールさせる
この記事は “Scale YOLOv5 inference with Amazon SageMaker endpoints and AWS Lambda” を翻訳したものです。
データサイエンティストが要件を満たせる機械学習 (ML) モデルを考案できたら、組織の他のメンバーが推論に簡単にアクセスできるようにモデルを展開する必要があります。しかし、コストおよび計算効率の両面で最適化された状態で大規模にデプロイすることは、困難で面倒な作業になる可能性があります。Amazon SageMaker エンドポイントは、モデルのデプロイのために簡易な方法で、スケーラブルかつコスト最適化されたソリューションを提供します。YOLOv5 モデルはGPLv3 ライセンスの下で配布され、実行時の効率と検出精度の高さで知られる人気のあるオブジェクト検出モデルです。この投稿では、事前に学習済みの YOLOv5 モデルをSageMaker エンドポイントでホストし、AWS Lambda 関数を使用してこれらのエンドポイントを呼び出す方法を示します。
ソリューション概要
以下の画像は YOLOv5 モデルを SageMaker エンドポイントでホスティングし、Lambda を使ってそのエンドポイントを呼び出すためのAWSサービスの構成です。SageMaker ノートブックでは、Amazon Simple Storage Service (Amazon S3) のバケットにある PyTorch 形式の YOLOv5 モデルにアクセスし、それを TensorFlow の SavedModel
形式のYOLOv5モデル に変換してS3 バケットに保存し直します。このモデルは、エンドポイントをホストするときに使用されます。Amazon S3 に画像をアップロードすると、Lambda 関数をトリガーします。この関数はOpenCVの Lambda レイヤーを使用して、アップロードされたイメージを読み取り、エンドポイントを使用して推論を実行します。推論の実行後、必要に応じて推論から得られた結果を使用できます。
この投稿では、まず PyTorch 形式の YOLOv5 のデフォルトモデルを利用し、それを TensorFlow の SavedModel
形式に変換するプロセスについて説明します。変換されたモデルは、SageMaker エンドポイントを使用してホストされます。その後、エンドポイントを呼び出して推論を実行する Lambda 関数を作成して発行します。事前に学習済みの YOLOv5 モデルは GitHub で入手できます。この投稿では yolov5l モデルを使用することとします。
前提条件
前提条件として、以下のように AWS Identity and Access Management (IAM) ロールを SageMaker, Lambda, Amazon S3 への的確なポリシーを設定する必要があります。
- SageMaker IAM ロール – S3へのモデルの格納やアクセスのために
AmazonS3FullAccess
ポリシーのアタッチが必要になります。 - Lambda IAM ロール – このロールには複数のポリシーが必要になります。
- S3に格納された画像へのアクセスのために、以下のポリシーが必要になります。
s3:GetObject
s3:ListBucket
- SageMaker エンドポイントを実行するために、以下のポリシーが必要になります。
sagemaker:ListEndpoints
sagemaker:DescribeEndpoint
sagemaker:InvokeEndpoint
sagemaker:InvokeEndpointAsync
- S3に格納された画像へのアクセスのために、以下のポリシーが必要になります。
以下のリソースやサービスも必要となります。
- Lambdaの作成と設定に、AWS コマンドラインインターフェイス (AWS CLI) が必要になります。
- SageMaker ノートブックインスタンスが必要になります。これらにはDockerが事前インストールされてあり、これを使用してLambda レイヤーを作成します。ノートブックインスタンスを設定するために、以下の手順を完了します。
- SageMaker コンソールにおいて、ノートブックインスタンスを作成し、ノートブックに名前、インスタンスタイプ(この記事では ml.c5.large を用います)、IAM ロール、その他のパラメーターを設定します。
- こちらの公開リポジトリをクローンし、Ultralyticsによって提供されている YOLOv5 リポジトリを追加します。
YOLOv5 を SageMaker エンドポイントにホストする
事前に学習済みの YOLOv5 モデルを SageMaker でホストする前に、model.tar.gz
の中身をエクスポートし正しい構造にパッケージする必要があります。この投稿ではYOLOv5 を SavedModel
形式でホストする方法を示します。YOLOv5 リポジトリには、さまざまな方法でモデルをエクスポートできる export.py
ファイルがあります。YOLOv5リポジトリをのクローンし、コマンドラインから YOLOv5 ディレクトリに入ると、以下のコマンドでモデルをエクスポートできます。
このコマンドは yolov5
ディレクトリの中に yolov5l_saved_model
という新しいディレクトリを作成します。 yolov5l_saved_model
ディレクトリは以下のようになっています。
model.tar.gz
を作成するために、yolov5l_saved_model
の中身を export/Servo/1
に移動します。コマンドラインから以下のコマンドを実行して export
ディレクトリを圧縮し、S3 バケットにアップロードします。
その後、以下のコードを利用してSageMakerノートブックからSageMaker エンドポイントにデプロイすることができます。
上記のスクリプトは、モデルをSageMaker エンドポイントにアップロードするのに約2-3分かかります。デプロイのステータスはSageMakerのコンソール上で確認することができます。モデルのホストが成功すると、モデルは推論の準備が整うことになります。
SageMaker エンドポイントをテストする
SageMaker エンドポイントにモデルを無事にホストしたのち、空白の画像を使って動作検証をすることができます。テストコードは以下のようになります。
レイヤーによる Lambda 、ならびに起動トリガーの設定を行う
OpenCV を利用して画像データを送り、その推論結果を得ることでモデルが動くことを示します。Lambda には事前ビルドされた OpenCV のような外部ライブラリを搭載していないため、Lambda コードを呼び出す前にそれらをビルドしておく必要があります。さらに、Lambda が呼び出されるたびに OpenCV のような外部ライブラリをビルドすることは避けたいです。これらの目的のためLambda は Lambda レイヤーを作成する機能を提供します。レイヤーの中で動くものを定義することができ、Lambda コードが呼ばれるたびに使用することができます。ここでは OpenCV のための Lambda レイヤーの作成方法も示します。この記事では、Amazon Elastic Compute Cloud (Amazon EC2) をレイヤー作成に使います。
レイヤーが準備できたら、レイヤーで使用する Lambda コードを app.py
スクリプトとしてを作成し、推論を実行して結果を取得します。このワークフローを図示すると以下のようになります。
Dockerを利用してOpenCVのLambda レイヤーを作成する
Python3.7 の Docker image を使用してDockerfileを作成すると、以下のようになります。
Dockerをビルドして処理を走らせ、layers
ディレクトリ配下にZIPファイルを設置します。
この処理の後、OpenCV レイヤーのアーティファクトをAmazon S3にアップロードし、Lambda レイヤーを作成します。
以上のコマンドを実行し処理が成功すると、Lambdaコンソール内にOpenCVのレイヤーが存在することを確認できます。
Lambda 関数を作成する
OpenCV を使用するためのスクリプトであるapp.py
を実行する Lambda 関数を作成します。
使用する際には次のコード BUCKET_NAME
と IMAGE_LOCATION
の値を、S3の画像にアクセスする場所に変更してください。
Lambda関数を以下のコードでデプロイします。
Lambda関数にOpenCVレイヤーを取り付ける
Lambda 関数と が準備できたら、レイヤーと関数を以下のように接続します。
レイヤーの設定はLambdaコンソールから確認することができます。
Amazon S3に画像がアップロードされたときにLambdaを起動させる
Amazon S3への画像アップロードをトリガーとしてLambda関数を起動します。この手順については、チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出すを参照ください。
これらの手順を踏むことで、Lambda のコンソールで以下のように関数の詳細が表示されます。
推論を行う
LambdaとSageMaker エンドポイントのセットアップを行ったら、Lambda 関数を呼び出して出力をテストすることができます。Amazon S3への画像アップロードを、Lambda 関数の呼び出し、すなわち推論エンドポイントの呼び出しのトリガーとして使用します。例として、前のセクションで設定した Amazon S3 の場所 <S3 PATH TO IMAGE>/test_image.png
に以下の画像をアップロードします。
画像のアップロードが行われると、Lambda 関数がトリガーされ、画像のダウンロードと読み込みを行い、推論を行うために SageMaker エンドポイントへ送られます。SageMakerエンドポイントからの出力は、その関数からJSONフォーマットで返ってくるので、様々な方法で利用することができます。以下は画像にオーバーレイされた出力例になります。
クリーンアップ
SageMaker ノートブックは、インスタンスタイプによっては、かなりの計算資源の使用とコストが必要になり得ます。不要なコストを排除するために、使用していないときには notebook インスタンスの停止を推奨します。また、Lambda 関数とは呼び出された場合にのみ課金される仕様です。そのため、これらのサービスのクリーンアップは不要です。しかしながら、SageMaker エンドポイントは ‘InService’ 状態で課金が発生するため追加コストを避けるために削除することを推奨します。
結論
この記事では、事前学習された YOLOv5 モデルを SageMaker エンドポイントでホストし、Lambda を利用して推論を呼び出し出力を処理する方法を紹介しました。詳細なコードなどは GitHub でも公開しています。
SageMaker エンドポイントの詳細については、「エンドポイントを作成してモデルをデプロイする 」と「Amazon Sagemaker 推論モデルを構築、テストし、AWS Lambda にデプロイする」を参照してください。YOLOv5 モードのデプロイプロセスを自動化する方法が紹介されています。