はじめに
メールアドレスの登録だけで無償で利用できる enebular (https://www.enebular.com/) ですが、今回有償版の機能を利用できる機会をいただいたので、その「事始め」を記事に残しておこうと思います。
無償版と有償版(エンタープライズプラン)との違い
有償版はProject単位で有効化されるようです。同じアカウントで作成したProjectでも無償版Projectではグレーアウトされているメニュー項目がありますが、有償版Projectでは全て選択できるようになります。
Devices、Licenses、Action Historyの機能は以前、enebular スターターキットをいただいた際に試したことがあったので、今回はFilesとAI modelsを試してみることにします。
enebular Files
ドキュメントには「Files では有償デバイスにファイルをデプロイすることが出来ます。」と記載されています。enebular-agent (ver 2.3.0)以上が必要です。
https://docs.enebular.com/ja/Files/Introduction.html
DeviceへDeploy操作をした後、Raspberry PiにログインするとDeployしたファイルが保存されていることを確認できます。
# enebularアカウントで確認
$ ls ~/enebular-runtime-agent/ports/awsiot/assets/
201911.png
こちらは特に迷うことはありませんでした。
enebular AI models と AI node
ドキュメントには「AI Models とは、機械学習・ディープラーニングのモデルをエッジデバイスにデプロイできる機能です。」と記載されています。enebular-agent (ver 2.7.0)以上が必要です。
https://docs.enebular.com/ja/AIModels/Introduction.html
こちらは最初ドキュメントを読んでも良く分からず、ソースコードを見たり試行錯誤しながらようやくイメージが掴めました。
Node-REDフロー上のenebular AI nodeはHTTP REST経由でdocker上で動作しているAI modelへ問い合わせをします。enebular上で登録したAI modelはdocker hubからダウンロードしたdocker image (Python実行環境)で動作します。docker imageはあらかじめいくつか用意されています(GPUリソースを利用できるNVIDIA Jetson TX2用のDocker Imageも用意されている!)が、自分で用意することも可能です。
今回はRaspberry Pi上で動作を確認することにしました。
enebularへのAI modelの登録
まず簡単に動作を確認するため下記のtest2.pyファイルを用意しzipで圧縮します。Node-REDフロー上のenebular AI nodeからは、このhandler関数が呼ばれます。
def handler(img):
return img
$ zip -r test2.zip test2.py
Docker Imageは「Rpi 3B image for Keras v2.2.4 with Tensorflow v1.14 and Python3」を選択します。
Languageは「Python3」を選択します。
Content Typeは「Json」を選択します。
Max Ram (in MB)は「128」とします。
Coresは「1」とします。
Handler Function #1は「handler」とします。
Node-REDフローからenebular AI nodeの実行
enebular AI nodeのプロパティでAI ModelとHandler Functionを選択します。
Node-REDフローのinjectノードのボタンを押してdebugノードにタイムスタンプが表示されれば正常に動作しています。
Raspberry Piにログインして動作を確認します。
# enebularアカウントで確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
enebulardevelopers/rpi-keras latest c41cfd6ab451 5 weeks ago 1.22GB
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc4a2b5ec73a enebulardevelopers/rpi-keras:latest "/usr/bin/entry.sh /…" About an hour ago Up About an hour 0.0.0.0:49153->49153/tcp beautiful_khorana
# enebularアカウントで確認
$ pwd
/home/enebular/enebular-runtime-agent/ports/awsiot/ai-models/.mount/U0HFL2-V
$ ls
__pycache__ test2.py wrapper.py
from flask import Flask, abort, jsonify, request, Response
import json
import test2
app = Flask(__name__)
@app.route('/vCPrWwtz', methods=["POST"])
def handler1():
r = request
data = json.loads(r.data.decode("utf-8"))
predict = test2.handler(data)
return Response(response=json.dumps(predict), status=200, mimetype="application/json")
if __name__ == '__main__':
app.run(host='0.0.0.0',port=49153, debug=True)