LoginSignup
14
2

More than 1 year has passed since last update.

Elixir Bumblebee を AWS Lambda で動かす(前提条件編)

Last updated at Posted at 2022-12-22

はじめに

以前、 Bumblebee を SageMaker で動かしてみました

しかし、もっと安く、気軽に AWS 上で動かしたいですよね

というわけで今度は AWS Lambda を使います

実用的かどうかは、、、:joy:

長くなりそうなので、この記事では前提条件の説明だけにとどめます

次回ローカル実行、その次にデプロイ、クラウド実行を紹介します

Lambda とは

Lambda はサーバーレスという仕組みで動いています

開発者は関数を書いて Lambda にデプロイしさえすれば、すぐにクラウド上で関数を実行できます

サーバーの構築や保守が不要なのですごく楽です

しかも処理が呼び出されたときに必要な数だけコンテナが起動するようになっているので、使っていないときは何も動いていない状態で、大量アクセスがあればその分だけ大量にコンテナが動いてくれます

つまり可用性が非常に高いです

そして「処理が実行された時間」×「処理に割り当てたメモリ」で課金されるため、呼び出しの回数が少なければ超低価格で運用することが可能です

おまけに無料利用枠まであるのでほぼ無料で使えてしまいます

ただし、呼び出しが非常に多い場合は却って高くつく場合があります

API Gateway + Lambda から EC2 + Elixir に移行することで運用費用が大幅にカットできた、という記事もあります

つまり、利用目的や頻度によってどちらがいいかは変わります

そして、 Lambda は Elixir を公式にサポートしていません

なので Elixir on Lambda というのは、あまり理にかなった実装ではなさそうです

でもあらゆる場面で Elixir を使ってみたい病に罹っているため、一旦そこからは目を逸らして実装してみます

Elixir を Lambda で動かすために

カスタムランタイム

Lambda がサポートしている言語(ランタイム)は以下のリンクで確認できます

2022/12/22 現在では以下のものです

  • Node.js
  • Python
  • Java
  • .NET
  • Ruby
  • カスタム

カスタムは自分で Lambda から呼び出す実行可能ファイルを作る方法です

実はこのカスタムランタイムで Elixir を動かす、という方法もなくはありません

以下の記事はその方法で実装しています

しかし残念ながら、この記事で使っている alertlogic/erllambda のイメージが OTP 21.3 で止まっています

もう一つ、カスタムランタイムを使っているケースがありました

こちらは Docker コンテナ内で erlang や Elixir を入れているため、カスタムすれば好きなバージョンが指定できます

が、実は Lambda にはもう一つ壁があります

Lambda に関数をデプロイする際、実装したコードと依存モジュールを ZIP で圧縮します

aws-cli では、最大で 50MB までしかデプロイできません

また、 S3 にアップロードしてから参照する方法もあるのですが、こちらも展開後のサイズが 250MB 未満でないといけません

今回動かしたいのは Bumblebee です

EXLA などのモジュールを含めないといけません

また、 Bumblebee で読み込むモデルファイルも含んでおく必要があります

関数が起動されてからダウンロードしていたのでは遅すぎるからです

実は上記の方法で途中まで実装していたのですが、このファイルサイズ上限に引っかかってしまいました

従って、カスタムランタイムで動かす方法は使えません

コンテナイメージ

Lambda にはもう一つデプロイ方法があります

コンテナイメージを使う方法です

この場合、 ECR にコンテナイメージを上げさえすれば何でもありです

サーバー構築不要という Lambda の良さをかなぐり捨てていますが

実は以前 Python + TensorFlow でコンテナイメージの Lambda 関数を実装しています

そして、この方法で Elixir on Lambda を実装した先駆者様がいました

Lambda 上で動かすためのモジュールを自分で作るという素晴らしい実装です!

ただし、やはりまだ問題があります

XLA には glibc の 2.31 以上が必要です

しかし、このモジュールで生成されるコンテナイメージは amazon/aws-lambda-provided:al2.2021.07.05.11 になっていて、古いです

実は Amazon Linux の古いバージョンを使うと glibc が 2.26 になっていて、 EXLA が動かないのです(これもやってみて気づきました)

というわけで Amazon Linux のコンテナイメージの最新版をベースに使います

こうすればあとは何でも自由です

まとめ

Elixir Bumblebee を AWS Lambda で動かすための前提条件について説明しました

次回はまずコンテナを実装してローカルで動かします

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2