catch-img

CONEXIOBlackBearで機械学習モデルを動かす(2) AWS Greengrassでデプロイ

はじめに

こんにちは。コネクシオIoTブログ 技術記事担当のHです。

前回はCONEXIOBlackBearで機械学習モデルを動かしました。

今回は、前回作成したプログラムをAWS IoT Greengrassを用いて、クラウドからCONEXIOBlackBearにデプロイし、動作させてみることにします。


0. 実施環境

  • CONEXIOBlackBear OSバージョン 1.1.5
  • Python3.7
  • tensorflow 2.0.0(keras 2.2.4)
  • USB接続のWebカメラ


1. CONEXIOBlackBearへのAWS IoT Greengrass Coreソフトウェアのインストール

以前の記事において、CONEXIOBlackBearへAWS IoT Greengrass Coreソフトウェアv1.9.2をインストールしました。しかし今回は、使用するPythonバージョンの関係上、v1.11.0が必要であるため、以前の手順に従い再インストールしました。


2. プログラムをLambdaへデプロイ

プログラムのソースコードは、前回の記事を少し編集して使用しますが、基本的なロジックは全く同様で、一部のみ変更します。


2.1 Lambda関数作成

Lambdaコンソールにて、新たにGreengrass_HelloWorld2というLambda関数およびエイリアスGG_HellowWorld2を作成しました。


2.2 前回からのコード変更部分

まず、モデルの読み込み先パスを、後述の3.3.2におけるデバイス配置先設定と一致させるように変更しました。

また、whileループの内容を5秒ごとのタイマーで繰り返し実行するように置き換え、推論の結果を、AWS IoTテスト用ゲートウェイにパブリッシュするようにしました。ハンドラ関数lambda_handlerは、3.2で実行時間無制限としているため、中身は空です。

def greengrass_hello_world_run():

    # 画像の取り込み
    frame = capture_image()

    # 形状の変換
    input_array = convert_shape(frame)

    # 推論
    t0 = time.time()
    pred = model.predict(input_array)
    t1 = time.time()

    label = label_names[pred.argmax()]
    score = pred.max()

    # 表示
    print("elapsed_time: {:.3} sec".format(t1 - t0))
    print("scores: %s" % pred)
    print("result: label={}, score={:.3}".format(label, score))

    # 送信
    client.publish(
        topic='hello/world',
        payload="result: label={}, score={:.3}, elapsed_time: {:.3} sec".format(label, score, t1 - t0))

    # Asynchronously schedule this function to be run again in 5 seconds
    Timer(5, greengrass_hello_world_run).start()


# ラベル名
label_names = [
    "airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"
]

# モデルへの入力画像サイズ
input_image_shape = (32, 32, 3)

# Creating a greengrass core sdk client
client = greengrasssdk.client('iot-data')

# カメラ
capture = cv2.VideoCapture(2, cv2.CAP_V4L)

# モデルのロード
model = load_model("/saved_models/keras_cifar10_trained_model.h5", compile=False)
file_write("model loaded")

# Start executing the function above
file_write("started!")
greengrass_hello_world_run()


def lambda_handler(event, context):
    return


3. Greengrassコンソールでの設定

※greengrassコンソールのアップデートにより、2020/12/16時点のコンソール画面では従来からあるグループ/コア/デバイスという画面構成がClassic(v1)という括りで分割されています。本記事では、以前作成したものを再利用するため、Classic(v1)の機能を使用します。


3.1 デバイス/グループの作成

以前作成したデバイス/MyFirstGroupグループを使用するため、手順は省略します。(参考:作成手順は以前の記事の2.1)


3.2 Greengrass_HelloWorld2関数の割り当て

MyFirstGroupグループのLambda関数として、先ほど作成したGreengrass_HelloWorld2関数を参照するため、Greengrassコンソールのグループ > グループを選択 > Lambdaより、Lambdaの追加ボタンを押し、以下のように設定しました。

実行ユーザーはデフォルト、メモリは128MB、ライフサイクルは無制限としています。


3.3 モデルデータのアップロード

次に、学習済みモデルデータをGreengrassによりデバイスへデプロイするための設定を行います。


3.3.1 モデルデータのS3への配置

学習済みモデルデータをAWS上で保持するには、Amazon S3にアップロードするか、AWS SageMakerで学習したものを参照するという2通りがあります。今回はSageMakerを使用していないため、S3を利用することとします。

学習済みモデルデータは、以前の記事の1.3で出力されたkeras_cifar10_trained_model.h5を使用します。

アップロードについての注意点として、以下2つです。

  • Greengrassから参照可能なファイルはzipであるため、アップロードする前にzip圧縮しておく
  • 格納先バケットは以下の2つのいずれかを選択する(参考: https://docs.amazonaws.cn/en_us/greengrass/latest/developerguide/gg-dg.pdf)
    • "greengrass"が含まれるバケット
    • ピリオドが含まれないバケット名のバケット
      • この場合、Greengrassのサービスロールでそのバケットへのアクセス権限を与える必要がある

今回は、名前に"greengrass"が含まれるバケットを作成してzipファイルを配置しました。


3.3.2 機械学習リソースの設定

3.3.1で配置したモデルデータをLambdaから参照するため、Greengrassコンソールで機械学習リソースの作成を行います。

Greengrassコンソールのグループ > グループを選択 > リソース > Machine Learningより、機械学習リソースの追加ボタンを押し、以下のように設定しました。

モデルとして、3.3.1でアップロードしたzipファイルを選択します。ローカルパスは、先述の通り、Lambdaのソースコード上で参照されるパスと一致するようにします。アクセス権限は、モデルデータの編集は必要ないため、読み取り専用としました。


3.4 ローカルリソースの設定

Lambda関数から、CONEXIOBlackBearのUSB端子に接続したWebカメラを使用するには、Greengrassコンソールでローカルリソースを追加する必要があります。

Greengrassコンソールのグループ > グループを選択 > リソース > ローカルより、ローカルリソースの追加ボタンを押し、以下のように設定しました。

デバイスパスは、Webカメラが/dev/video2として認識されていたので、/dev/video2と入力します。Lambda関数に与えるアクセス権限は、読み取りと書き込みを設定する必要があります。


3.5 USBカメラへのアクセス許可設定

CONEXIOBlackBearにデプロイする前に、greengrass Coreソフトウェア上のLambda関数からWebカメラにアクセスできるように事前に設定が必要です。

まず、CONEXIOBlackBearのUSB端子の有効化。

echo 174 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio174/direction

Lambda関数はデフォルトでは、ggc_userユーザー/ggc_groupグループで実行されるため、/dev/video2にその他のユーザーの読み書きアクセス権限を与えます。

chmod 666 /dev/video2


3.6 デプロイ

CONEXIOBlackBearで、Greengrass Core ソフトウェアのデーモンを起動します。

/greengrass/ggc/core/greengrassd start

そして、Greengrassコンソールからデプロイします。デプロイが正常に完了したら成功です。


4. 動作確認

AWS IoTコンソールのテスト用デバイスゲートウェイ画面で、hello/worldトピックをサブスクライブすると、以下のようなメッセージを受信しました。CONEXIOBlackBearから推論した結果が届いています。無事、機械学習モデルで推論を行うプログラムをGreengrassでデプロイして動かすことができました。


まとめ

以上のように、機械学習モデルで推論を行うプログラムをGreengrassでデプロイして動かすことが出来ました。

今回は、PC上で学習を行った比較的時間の短い機械学習モデルを用いました。今後は、AWS  のSageMakerなどクラウド上のコンピューティングリソースを使って大量の学習が必要な高度なモデルを作成し、動かしたいと思います。


H

H

コネクシオ株式会社・IoT開発担当者

5分で理解できる!
Smart Ready IoTソリューションセット
ご質問やご要望はこちらから
お気軽にお問い合わせください

製造業が直面する課題と人材難・IT化・技術継承の解決策

2021-07-28

新型コロナウイルス感染症(以下、コロナ)の感染拡大によってテレワークが徐々に定着しつつあるなか、製造業もまた時代の変化に適応しなければならない時期にさしかかっています。少子高齢化による人手不足やIT化の遅れ、移り変わる社会情勢に対応しきれていないことなど、製造業が抱える課題と解決策について解説します。

ローカル5Gとは? メリット・デメリットと活用法を解説

2021-07-28

2020年3月、国内で次世代の通信規格として新たに商用化した5G。そうしたなか、通信キャリアが展開する5Gとは別に、企業や自治体などが独自に5Gネットワークを構築できるローカル5Gが登場しました。この記事では、ローカル5Gの仕組みをはじめ、メリット・デメリット、製造業における活用法などを解説します。

プライベートLTE導入の課題と活用シーン

2021-07-28

プライベートLTEは、有線でのネットワーク構築が難しい大規模な工場、遠隔制御装置や監視装置を使用するなど、安定した通信が求められる状況において活用が期待されています。この記事では、プライベートLTEのメリットや導入のために押さえておきたい点、活用が期待できる事業などを解説します。

設備点検・監視を効率化するアナログメーターのデジタル化

2021-07-08

製造業においては人手不足の現状も無視できません。今後も深刻化していくと予想される製造業の人手不足に対応するためには、IoTを活用した業務効率化が急務です。今回は工場の設備点検・監視業務における課題やアナログメーターをデジタルデータ化するメリットについて解説します。

スマートファクトリーの実情と5G導入で期待できるメリット

2021-07-08

近年、工場の設備や機械をインターネットで接続するスマートファクトリーが注目されています。そうしたなか、スマートファクトリー化を後押しする次世代の通信技術として、高速大容量通信や多数同時接続に対応した5G回線が登場しました。この記事では、5Gの基礎知識や特徴、スマートファクトリー市場の現状、5Gを活用することによる具体的なメリットなどを解説します。