ユニファ開発者ブログユニファ開発者ブログユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。TensorFlowこんにちは、データエンジニアリングチームの宮崎です。Lambda上でTensorFlowを使用しやすくなりました。Requirementsを利用する方法もあります。コンテナを使う場合は、ロードなどにより処理時間が増えそうでもあり、今後どのように使い分ければ良いのか迷いどころです。Requirementとコンテナイメージ利用、それぞれで処理時間がどのようになるのか計測してみました。使用するソフトウェアのバージョン今回の計測では以下のソフトウェアを使用しました。Requirementsの手法が使えなくなってしまったため、若干古い2.0.0を使用しました。Requirementsを利用した手法については以下にまとめておりますので、ご参照ください。続いて、コンテナイメージを利用したTensorFlowの使用方法になります。Modelを出力します。前処理では画像のリサイズとRGBの正規化、後処理では予測値の整形をそれぞれ行います。Modelが出力されました。Modelを用いて推論を行うLambdaハンドラを作成します。指定されたS3上の画像を読み込み、推論した結果を返します。ModelおよびLambdaハンドラを保持するDockerコンテナを作成します。以下のファイルを同一ディレクトリに保存します。serverless.ymlDockerfileには以下のように記述します。Lambda用のPythonコンテナをベースにし、最後にLambdaハンドラの実行を指定します。["app.handler"]requirements.txtは必要なPythonパッケージを記述します。今回はboto3とtensorflowのみ設定しています。boto3~=1.14.19tensorflow==2.0.0準備が完了したら、Dockerコンテナを作成します。Lambdaから呼び出せるようにするため、ECRにアップロードします。事前にECRにコンテナリポジトリを作成しておきます。続いて、作成したDockerコンテナをアップロードします。LambdaのデプロイいよいよLambdaのデプロイです。Frameworkを使用します。serverless.ymlに以下を定義します。Requirementsを使用する場合に比べ、だいぶシンプルに書けます。S3の画像に対して推論を行うため、S3へのアクセスを許可しています。180serverless.ymlを定義できたら、デプロイします。<Account>.dkr.ecr.<Region>.amazonaws.com/lambda-imagenet-resnet50:latest推論の実行デプロイが完了したら、いよいよ推論です。事前に適当なS3に対象の写真をアップロードしておきます。今回も象の写真を使用しました。}]どうやらこの像はインド像のようです。Lambdaをデプロイし、ようやく準備が整いました。それでは処理時間を比較したいと思います。わかりやすさのため、単位は秒に揃えて丸めています。Lambdaでは状態がコールドスタートとウォームスタートの2段階でしたが、コンテナイメージ利用時はコンテナ更新後が加わりました。Durationをまとめています。Lambdaは2度実行されておりましたのでそれぞれの時間を記載しております。合算値となっております。各計測の試行回数は1回のため、精度にばらつきがあることはご承知おきください。考察コンテナイメージ利用時、コンテナ更新後はコンテナロードのため1分強処理に時間がかかるようでした。一方で、コールドスタート時は若干時間が短くなっております。Requirementsを利用する方式において、パッケージの展開やモデルのロード時間がかかるためと思われます。ウォームスタートではほぼ時間は変わりませんでした。以上の検証から、以下のように使い分けるのが良さそうです。Requirementsを利用する場合、tmp領域の512MB制限により、最新のTensorFlowの利用ができませんでした。LambdaからEFSの利用の導入を検討する必要がありそうです。今回初めてコンテナイメージの利用を行いました。簡単に様々なPythonパッケージを利用できる点が非常に便利だと感じました。一方で以下の注意点がありましたので合わせて記載します。Lambda側も更新する必要があるまた、挙動についても分からない点が多いため、引き続き調査が必要そうです。コンテナロード時になぜ2回実行されるのかコンテナロードはどれくらいの頻度で起きるのかまとめまとめです。Requirementsを利用した場合とコンテナイメージを利用した場合、2つのケースにおいてTensorFlowの処理時間を計測しました。検証結果から、コンテナイメージを利用する場合は、コンテナロードに1分ほど余計に時間がかかるため、要件によって使い分けが必要なことがわかりました。ソースコード検証に使用したソースコードは以下に格納しました。3.0のCIができるようにするWebエンジニアの本間です。最近、急に寒くなりましたね、鍋が...2021-09-22PythonでS3のファイルを読み書きするこんにちは、データエンジニアリングチームの宮崎です。ユニフ...2021-07-20SageMakerを用いたオリジナルTensorFlowモデルの推論こんにちは、データエンジニアリングチームの宮崎です。今...2021-02-08CloudFormationのCustomResourceでデータベースを作ってみたこんにちは、プロダクトエンジニアリング部のちょうです。LocalStackこんにちは。プロダクトエンジニアリング部の杉本です。12引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。