直近この手の記事を連投していますが、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にコンテナイメージを読み込ませる。
それぞれデプロイ等の運用が変わってしまうため、そのスイッチングコストを加味して、これらの方法は見送りました。しかし、特に後者の方法は色々と応用が効きそうですので、どこかのタイミングで検証してみたいと思います。
同じ事象で悩んでいる人の参考になれば!