😀

【Lambda Arm64】KinesisVideoStreamsの最新画像をLambdaで切り出したときのパフォーマンス

2021/10/12に公開

はじめに

確認したいこと

  • x86_64版とarm64版のメモリ使用量
  • x86_64版とarm64版のコールドスタート時のレスポンス時間
  • x86_64版とarm64版のウォームスタート時のレスポンス時間

準備

Lambda Layer作成

  • armプロセッサのEC2を立てます
    • 無料期間中のt4g.microインスタンスを利用
    • AMIはAmazon Linux 2 AMI (HVM), SSD Volume Type
  • 標準でインストールされているPythonが3.7なのでPython3.8をインストールします
    • Lambdaのarm64ではPython3.8とPython3.9がサポートされておりPython3.7は対象外のため
sudo amazon-linux-extras install python3.8
sudo pip3.8 install -U pip
  • ↑pipをupgradeしないとopencv-python-headlessのインストールでエラーになりました
  • 一旦、ログインしなおしてpipとpythonのバージョンを念のため確認します
    • pip 21.3 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
mkdir -p python/lib/python3.8/site-packages
pip3.8 install -t python/lib/python3.8/site-packages opencv-python-headless
zip -r opencv-python3.8_arm64.zip python
  • 前回の記事で作成したx86版のzipが53MBなのに対して、arm版は36MBほどとかなり小さくなってます(期待大)
  • 作成したzipをs3にアップロードして、Lambda Layerを作成します
    • 「互換性のあるランタイム」にPython 3.8を指定
    • 「互換性のあるアーキテクチャ・オプション」にarm64を指定

Lambda関数の作成

  • 前回の記事と全く同じコードを使います
  • API Gatewayなども同様に設定していきます

結果

  • あくまでこのアプリに関しての計測ですので、値や傾向については参考として捉えてください(特にx86_64はPython3.7環境なのでその影響が出ている可能性もあります)
  • 前回の記事とは測定した時間や動画の内容が異なるので、x86の場合のレスポンス時間も少し異なっています

最大メモリ使用量

arm64 x86_64
151MB 159MB
  • opencv-python-headless のサイズが小さいお陰か、arm64の方が約10MBくらい少ない結果になっています

コールドスタート時のレスポンス

メモリ arm64 x86_64
128MB 6.0秒 7.2秒
256MB 3.5秒 4.5秒
512MB 2.2秒 2.8秒
1024MB 1.8秒 2.4秒
2048MB 1.5秒 1.8秒
  • 同一メモリ割り当ての場合、凡そ20%程度arm64の方が速くなっています

ウォームスタート時のレスポンス

メモリ arm64 x86_64
128MB 2.0秒 2.0秒
256MB 1.0秒 1.0秒
512MB 0.6秒 0.6秒
1024MB 0.4秒 0.4秒
2048MB 0.35秒 0.35秒
  • 同一メモリ割り当ての場合、arm64でもx86_64でもほとんど差がありませんでした

まとめ

  • 本ケースにおいては、起動後の実処理の時間についてはほとんど差がないものの、コールドスタートにかかる時間が大幅に短縮されていました
  • 同一メモリ割り当ての場合は、x86に対してarm64の方が20%安い
  • よって、単純にarm版に置き換えることで、20%のコスト削減とコールドスタートの20%改善を実現できそうです(AWSが公式で言っている 20%低いコストで19%優れたパフォーマンス とも乖離はなさそう)

Discussion