LambdaでLightGBMを動かすためにやったこと

直近この手の記事を連投していますが、AWS LambdaでLightGBMを動かすためにやったことを記録として書いておきます。

LightGBM等のライブラリをLambdaで使えるようにするための方法としてLambdaレイヤーという機能があります。

Lambdaレイヤーとは、あらかじめライブラリのファイル一式をzip化して登録することでLambdaのPythonコードからライブラリを読み込むことができるようになります。

具体的な手順としては以下になります。(参考にしたサイト

mkdir python
pip3 install -t ./python/ numpy
zip -r numpy.zip python
rm -r python

mkdir python
pip3 install -t ./python/ scipy
rm -r ./python/numpy*
zip -r scipy.zip python
rm -r python

mkdir python
pip3 install -t ./python/ pandas
rm -r ./python/numpy*
zip -r pandas.zip python
rm -r python

mkdir python
pip3 install -t ./python/ --no-deps lightgbm --install-option=--nomp
zip -r lightgbm.zip python
rm -r python

しかし、Lambdaレイヤーには色々制約があり、zipファイル1個あたり50MB上限、全てのzipファイルを解凍した際の容量が250MB上限になっています。

250MBなんて簡単に超えないでしょと思うかもしれませんが、機械学習のライブラリを複数読み込もうとすると簡単に250MB超えてしまいます。

その際にテクニックとしては、ライブラリがバージョンアップの度に容量が増えていくこと前提で、ライブラリのバージョンを許容できる範囲で前のものにし、容量を抑えます。しかし、この方法は諸刃の剣で、特定の機能が使えなくなったり、セキュリティ的なリスクもあるので、きちんと内容精査した上で実行しましょう。

ちなみに私が250MBにおさめるために設定したバージョンはこちらです。

  • numpy:1.19.5
  • scipy:1.6.3
  • pandas:1.3.5
  • LightGBM:3.0.0

もし先のテクニックが使えない場合、次の方法があります。

  • 事前にライブラリをEFSにインストールした状態で、LambdaにマウントしてPythonコードからライブラリを読み込む。
  • ライブラリ、Pythonコードを一式にまとめたDockerコンテナを作成し、Lambdaにコンテナイメージを読み込ませる。

それぞれデプロイ等の運用が変わってしまうため、そのスイッチングコストを加味して、これらの方法は見送りました。しかし、特に後者の方法は色々と応用が効きそうですので、どこかのタイミングで検証してみたいと思います。

同じ事象で悩んでいる人の参考になれば!