AWS GreengrassにKerasのモデルをデプロイしてみた

AWS GreengrassにKerasのモデルをデプロイしてみました。

きっかけ

Re:Invent 2017で発表された新サービス「AWS Greengrass ML Inference」にプレビュー申請したところ、残念ながら結果はNot Approved。

GAまで待つのもちょっと悔しいので、普通のGreengrassにkerasのモデルをデプロイしてみることにしました。

必要なもの

  • AWSアカウント
  • Raspberry Pi

作業概要

  1. Kerasの環境準備(Mac)
  2. greengrassチュートリアル実施
  3. Raspberry PiにKeras等をインストール
  4. Kerasのモデル作成
  5. デプロイ用のLambda作成
  6. Greengrassへデプロイ
  7. 動作テスト

1. Kerasの環境準備(Mac)

MacにKerasの環境を準備します。

$ brew upgrade pyenv
$ pyenv install 2.7.14
$ pyenv virtualenv 2.7.14 keras
$ cd hoge/huga
$ pyenv local keras
$ pip install tensorflow jupyter keras h5py

2. Greengrassチュートリアル実施

Raspberry Piの環境構築を兼ねて、AWSドキュメントにあるGreengrassのチュートリアルを実施します。

「モジュール 3-I: AWS Greengrass での AWS Lambda」までの実施でOKです。

3. Raspberry PiにKeras等をインストール

こちらの記事を参考にさせて頂きました。
Raspberry Piにsshでログインしてインストールします。
熱暴走するかもとの事だったので、自分はUSB扇風機で風を当てながら一晩熟成させました。

$ sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly-pi/lastStableBuild/artifact/output-artifacts/tensorflow-1.5.0rc1-cp27-none-any.whl
$ sudo pip install keras
$ sudo apt-get install python-h5py

4. Kerasのモデル作成

今回はkerasのexampleからMNISTの文字分類のソースコードを拝借して、Kerasのモデルを作成します。

1. 上記ソースコードをダウンロードする
2. 下記3行を追記して用意した環境で実行する

model.save('mnist_mlp.h5')
np.save('x_test.npy', x_test)
np.save('y_test.npy', y_test)

3. 実行後、下記3ファイルが生成される

  • mnist_mlp.h5 (Kerasのモデル)
  • x_test.npy (画像データ)
  • y_test.npy (画像データに対応する正解ラベル)

5. デプロイ用のLambda作成

GreengrassへデプロイするLambdaを作成します。

1. BlueprintsからLambdaを作成する
AWSマネジメントコンソールでLambdaを選択後、blueprintsから「greengrass-hello-world」を選択して、Lambdaを作成します。
ロールはチュートリアルで作成したものを指定してください。
2. ソースコードを置き換える
AWSマネジメントコンソール上で、Lambdaのコードを下記へ置き換えます。

from __future__ import print_function


import greengrasssdk
from threading import Timer
import time
import keras
from keras.models import load_model
import numpy as np
import random

client = greengrasssdk.client('iot-data')
x_test = np.load('x_test.npy')
y_test = np.load('y_test.npy')
x_test = x_test.reshape(10000, 784).astype('float32') / 255
model = load_model('mnist_mlp.h5')


def greengrass_keras_prediction_run():
    r = random.randrange(10000)
    prediction = model.predict(x_test[r].reshape(1, 784))
    predicted_value = np.argmax(prediction[0])
    answer = y_test[r]

    message = 'predicted value: {0}, answer:{1}'.format(predicted_value, answer)
    client.publish(topic='keras/prediction', payload=message)

    Timer(5, greengrass_keras_prediction_run).start()


greengrass_keras_prediction_run()


def function_handler(event, context):
    return

3. デプロイメントパッケージをダウンロードする
AWSマネジメントコンソールから、Lamdbaのデプロイメントパッケージをダウンロードします。
4. mnist_mlp.h5 / x_test.npy / y_test.npyの3ファイルをデプロイメントパッケージに含める
ダウンロードしたデプロイメントパッケージを展開後、3ファイルを含めて再度zip圧縮します。
zipファイルにはフォルダを含めないように注意してください。

$ zip -r ../keras_prediction.zip *

5. デプロイメントパッケージをアップロードして、Lambdaを更新する
6. 新しいバージョンを発行して、発行したバージョンに対しエイリアスを作成する
手順はGreengrassのチュートリアルと同じです。

6. Greengrassへデプロイ

手順はGreengrassのチュートリアルと同じです。Greengrassのコンソール画面から操作します。
1. Lamdbaを登録する
一覧から作成したLambdaを選択後、Lambdaのエイリアスを指定して登録します。
2. Lamdbaの設定を変更する

  • タイムアウト:25秒
  • ライフサイクル:Make this function long-lived and keep it running indefinitely

3. subscriptionを追加する

  • ソース:Lambda
  • ターゲット:IoT Cloud
  • トピック:keras/prediction

subscription.png

7. 動作テスト

1. Greengrassのコンソール画面の左側のTestをクリック
2. Subscription Topicにkeras/predictionを指定
3. Subscribe to topicをクリック
下記が表示されれば成功です。
test2.png

雑感

AWS Greengrass ML Inferenceでは、上記のように煩雑でなく簡単に学習モデルがデプロイできるようになるでしょうか。
似たようなサービスにAzure IoT Edge(こちらも未だプレビュー)がありますが、今度はこっちをさわってみたいと思います。

続きを読む

ハイブリィド 株式会社

クライアント企業におけるクラウド環境の構築支援を行っていくインフラエンジニアを募集しています。具体的には、AWS、Azure、Google Cloud Platformといった各種クラウドサービスのコンサルティング、設計、構築を行います。 特定サービスの固定的な構築作業ではなく、適切なソリューションの選択から、設計・構築を行い、 … 続きを読む

クラウドエンジニア(AWS・GCP・Azure)

クラウドエンジニア(AWS・GCP・Azure)◇設計構築◇. 仕事内容. □当社が持つ各顧客のクラウド案件の提案、要件定義、設計構築をお任せします□ 増々オンプレからクラウドへの移行が行われていますのでその波に一緒に乗れる仲間を募集してます。 <ここがポイント> クラウド化に伴いインフラエンジニアの守備範囲は … 続きを読む

meltdownのパッチでAWSのPostgreSQLがやられた

この脆弱性が緊急度が高く、Azure、AWSなど一部クラウド環境には事前にパッチが適用されたのだが、そのパッチが担当システムにて影響がでてサーバ自体がダメになってしまったのだ。やっと今日すべて事業が通常に戻ったので久方ぶりにビール飲みつつこれを書いている。 原因と結果を端的に書くとこれだけ。ただ仕事と … 続きを読む

【緊急開催決定!】AWS・Azureとの違いを知りたい方へ。Google Cloud Platform セミナー(大阪 …

あと10人参加できます。 シェア · ツイート. 2016年11月8日、Google Cloud Platformの東京リージョンの開設が発表されました!東京リージョンの開設により、GCPはさらに進化を遂げます。導入をご検討中の方、ぜひご参加いただければと思います。 今回のセミナーでは、今となってはなかなか聞けないGCPのはどんなものな … 続きを読む

AWSとAzureとGCPを比較してみる – FaaS編

FaaSについてAWSとAzureとGCPを比較してみました。

注)

1. FaaS比較表

AWS Azure GCP
Lambda Functions Cloud Functions***
言語 Python,
node.js,
java,
C#,
go
ランタイムバージョン1.X
C#,
JavaScript,
F#,
Python*,
PHP*,
TypeScript*,
バッチ (.cmd、.bat)*,
Bash*,
PowerShell*

ランタイムバージョン2.X
C#**,
JavaScript**,
Java**
node.js***
最大実行時間 5分 10分 (従量課金プラン)
無制限 (App Serviceプラン)
9分
直接HTTPアクセスを受け付けるか 受け付けない(API Gatewayと連携必要) 受け付ける 受け付ける
トリガー Amazon S3,
Amazon DynamoDB,
Amazon Kinesis Data Streams,
Amazon Simple Notification Service,
Amazon Simple Email Service,
Amazon Cognito,
AWS CloudFormation,
Amazon CloudWatch Logs,
Amazon CloudWatch Events,
AWS CodeCommit,
スケジュールされたイベント (Amazon CloudWatch Events を使用),
AWS Config,
Amazon Alexa,
Amazon Lex,
Amazon API Gateway,
AWS IoT ボタン,
Amazon CloudFront,
Amazon Kinesis Data
Blob Storage,
Cosmos DB,
Event Hubs,
HTTP,
Microsoft Graph Events(2.Xのみ),
Queue storage,
Service Bus,
Timer,
Webhooks(1.Xのみ)
HTTP,
Cloud Storage,
Cloud Pub/Sub

*試験段階
**プレビュー
***ベータ

2. 対応言語の比較

言語の種類は試験段階とプレビューを含めればAzureが一番多いのですが、正式リリースされたものに限定すればAWSの方が種類が多いです。
一方GCPは機能自体がベータリリースなので、まだこれからといった感じでしょうか。

AzureはBashにも対応しているのが特徴です。運用系のシェルスクリプトをFaaS化すれば、スクリプト用のサーバが不要になりますね。

3. 最大実行時間

最大実行時間はAzureの10分(要host.jsonのfunctionTimeoutプロパティ変更)、GCPの9分に対しAWS Lamdbaは5分と約半分です。実際にAWS Lambdaを利用していると5分の壁を結構感じます。この点は他クラウドが羨ましいですね。
2017年のRe:InventでAWSはFargateというコンテナのサービスをリリースしましたが、このサービスがlambdaが5分以上実行できないことに対するAWSからの回答のように感じます。

4. 直接HTTPアクセスを受け付けるか

AWS lambdaだけ直接HTTPアクセスを受け付けることができません。HTTPアクセスを受け付けるには、API Gatewayと連携する必要がありますが、多機能な分やや設定が面倒な印象です。(但しAPI経由でLambdaを起動することは可能)

まとめ

AWS Lambdaのリリース後、Azure・GCP・Bluemix(現IBM Cloud)は超特急で追従しました。AWS LambdaがIT業界に与えたインパクトはとても大きかったと思います。
現在は「FaaS無ければばクラウドにあらず」といったところでしょうか。

また、AWS GreengrassやAzure IoT Edge**というエッジにデプロイするサービスも出てきています。
将来AWS LambdaがiPhoneやApple Watchにデプロイできるようにならないかなーと妄想中です。

**プレビュー

続きを読む

AI、マシンラーニングにおけるAWS、Azure、GCP、IBMの技術動向

みなさん、こんにちは。今年も元気いっぱい佐藤です。 昨年に引き続きAI、マシンラーニングはもちろんのこと、ブロックチェーン、コンテナ、音声UIは今年も熱くなりそうです。 昨年行われたAWS re:Inventでも多くのAI、マシンラーニング系新サービス、Echoのビジネスエコシステムが発表されました。 ブロックチェーン関連が出る … 続きを読む

金融業界でAzure採用が進んでいる理由

2017年のクラウド界隈最大の話題は、三菱UFJフィナンシャル・グループ(MUFG)が1月にAmazon Web Services(AWS)を採用する方針を公表したことだった。セキュリティに厳しいメガバンクによる本格的なAWSの採用宣言は、国内企業のクラウド導入を後押しした。 しかしながら2017年を振り返ると、銀行や同じく … 続きを読む