More than 1 year has passed since last update.

この記事を3行で

  • AWS Lambda環境においてTensorFlowを使った小さなコードが動作しました。
  • 環境一式を含んだZIPファイルはgist:9b11f081186b98fe130eに置いています。
  • 本格的な検証はまだこれから。

1. 動機

勉強会で『TensorFlowを使ってテキストをクラス分類してみた』と題して発表しました。
それなりの結果を得ることができたので、それならば本格的に使ってみようと考え、大好きなAWS LambdaAmazon API Gatewayを使ってAPIを構築してみることにしました。

2. 結果

TensorFlowを使って「1 + 2」を計算し、正しく「3」という結果を得ることができました。
少なくとも、AWS Lambda環境においてTensorFlowがimportできることを確認できました。

3. 実験方法

3.1. Amazon EC2環境でネイティブモジュールの準備

AWS LambdaはAmazon Linux上で動作しています。
具体的な環境については公式ページの『Lambda 実行環境と利用できるライブラリ - AWS Lambda』にて確認できます。

今回は東京リージョンで動作させたいので、前述のページからami-383c1956を使えば良いことが分かります。AMIはリージョン毎に異なることにご注意ください。
Amazon EC2上にami-383c1956t2.microインスタンスを作成し、ネイティブモジュールを準備しました。

完成したZIPファイルはami-383c1956-python2.7-tensorflow0.7.1-20160320.zipとしてgist:9b11f081186b98fe130eに置いています。
ファイルサイズは約23MiB、SHA-1ハッシュ値は3157f010853fee1769a1149afbed15383bf2be96です。

構築の手順は以下の通りです。

# 環境を確認
$ uname -a
Linux ip-xxx-xxx-xxx-xxx 4.1.10-17.31.amzn1.x86_64 #1 SMP Sat Oct 24 01:31:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/system-release
Amazon Linux AMI release 2015.09

# パッケージをアップデート、インストール
$ sudo yum -y update
$ sudo yum -y upgrade
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install python27-devel python27-pip gcc

# virtualenvを準備
$ export ENV_ROOT=~/env
$ virtualenv ${ENV_ROOT}
$ source ${ENV_ROOT}/bin/activate

# Pythonのバージョン、パスを確認
(env)$ python2.7 --version
Python 2.7.10
(env)$ which python2.7
~/env/bin/python2.7
(env)$ which pip2.7
~/env/bin/pip2.7

# TensorFlowと依存ライブラリをインストール
(env)$ pip2.7 install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
Successfully installed numpy-1.10.4 protobuf-3.0.0b2 setuptools-20.3.1 six-1.10.0 tensorflow-0.7.1 wheel-0.29.0

(env)$ deactivate

# ZIPファイルを作成する
$ export OUT_FILE=~/ami-383c1956-python2.7-tensorflow0.7.1-20160320.zip
$ cd ${ENV_ROOT}/lib/python2.7/site-packages
$ touch google/__init__.py
$ zip -r9v ${OUT_FILE} . --exclude \*.pyc
$ cd ${ENV_ROOT}/lib64/python2.7/site-packages
$ zip -r9v ${OUT_FILE} . --exclude \*.pyc
$ sha1sum ${OUT_FILE}
3157f010853fee1769a1149afbed15383bf2be96  /home/ec2-user/ami-383c1956-python2.7-tensorflow0.7.1-20160320.zip

3.2. AWS Lambdaのデプロイパッケージを準備

今回は以下のコードを用いました。「1 + 2」を計算するだけのとてもシンプルなコードです。

main.py
import tensorflow as tf

def lambda_handler(event, context):
    a = tf.constant(1)
    b = tf.constant(2)
    with tf.Session() as sess:
        return str(sess.run(a + b))

ami-383c1956-python2.7-tensorflow0.7.1-20160320.zipをコピーし、main.pyを追加することで、デプロイパッケージを作成しました。

$ cd /project/path/tensorflow
$ cp ami-383c1956-python2.7-tensorflow0.7.1-20160320.zip test.zip

$ cd /project/path/tensorflow/lambda
$ vi main.py
$ zip -r9v ../test.zip . --exclude \*.pyc

3.3. AWS Lambdaのデプロイパッケージをアップロード

今回はWebコンソールからLambda関数を作成し、test.zipをアップロードしました。
メモリサイズはデフォルトの128MBのまま。タイムアウト値は10秒に延長しました。

3.4. AWS Lambdaの実行

Webコンソールから「Test」ボタンを押下し、Lambda関数を実行すると、正しく「3」という結果を得ることができました。
少なくとも2回目以降は100ms以下の実行時間、最大メモリ使用量は33MBでした。

4. 参考文献

以下、参考にしたページです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.