Yura YuLife

ITエンジニアの覚え書き。

AWS Lambda で Python3 + Chainer を使う方法

概要

Python3 + Chainer を使った APIAWSAPI Gateway + Lambda で動かす方法を紹介します。

ちなみに Deep Chord というウェブアプリのバックエンドで使っています。

以下の2点がポイントです。

  • Chalice を使う
  • EC2 の Amazon Linux 上で一旦 Chainer をインストールして、生成されたファイルをダウンロードしてデプロイする

動作環境

  • Python 3.7
  • Chainer 1.12 (バージョンがめちゃくちゃ古いせいか、Chalice ではいい感じにコンパイルできなかった)

方法

EC2 上で Chainer をビルド

Amazon Linux 2 の EC2 インスタンスを立ち上げ、以下のコマンドで Chainer をインストールします。インスタンスは t2.micro などの無料のインスタンスで十分です。

# Lambda で動かす Python のバージョンと合わせます
sudo yum -y install python37 python37-pip

# Chainer のインストール (Numpyなども一緒にインストールされます) 
pip3.7 install chainer==1.12 --user

生成されたファイルのダウンロード

Chalice のプロジェクトの vendor フォルダに上記でビルドされた Chainer とその依存ライブラリをダウンロードします。

# Chalice のプロジェクトを作成(作成済みの場合は省略)
chalice new-project プロジェクト名

# プロジェクト内に vendor フォルダを作成
cd プロジェクト名
mkdir vendor

# vendor フォルダ内に EC2 でビルドしたライブラリをダウンロード
scp -r -i [秘密鍵のパス] ec2-user@[EC2のIPアドレス]:./.local/lib/python3.7/site-packages/ ./vendor/

app.py の作成

Chalice プロジェクトの requirements.txt には chainer は書かず、あとは普通に app.py の中で import chainer すると、vendor フォルダ内の chainer を参照してくれます。

参考情報

numpy とかは requirements.txt に書いておくだけで、例えば Mac 上で開発してても Lambda (というかAmazon Linux) で動くようにいい感じに Chalice がビルドしてデプロイしてくれるらしい。Chainer も最新版なら大丈夫なのかな?

ダウンロードした vendor フォルダを覗いてみたら .so ファイルは Chainer じゃなくて、 Chainer が依存している protobuf とかの中に入ってた。ローカルでのビルドは依存ライブラリ側の方で失敗しているのかも...

参考URL

免責事項

※ 投稿内容は個人的な見解であり、所属する企業を代表するものではありません。