機械学習の推論を実行する - AWS IoT Greengrass

2023 年 6 月 30 日に AWS IoT Greengrass Version 1 は延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付以降、AWS IoT Greengrass V1 の機能、拡張機能、バグ修正、またはセキュリティパッチを提供するアップデートはリリースされません。AWS IoT Greengrass V1 で稼働中のデバイスは中断されず、引き続き動作し、クラウドに接続できます。重要な新機能新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。

機械学習の推論を実行する

この機能は AWS IoT Greengrass Core v1.6 以降で使用できます。

AWS IoT Greengrass ではクラウドトレーニング済みモデルを使用して、ローカルに生成されたデータに対して、エッジで機械学習 (ML) 推論を実行できます。ローカル推論の実行により低レイテンシーとコスト節約のメリットを得ながら、モデルのトレーニングと複雑な処理にクラウドコンピューティングの処理能力を活用できます。

ローカル推論の実行を開始するには、「AWS Management Console を使用して機械学習推論を設定する方法」を参照してください。

AWS IoT Greengrass ML 推論のしくみ

推論モデルは、任意の場所でトレーニングし、Greengrass グループに機械学習リソースとしてローカルにデプロイした後、Greengrass Lambda 関数からアクセスできるようになります。例えば、SageMaker で深層学習モデルを構築し、トレーニングして、Greengrass Core にデプロイできます。その後、Lambda 関数はローカルモデルを使用して、接続されたデバイスで推論を実行し、新しいトレーニングデータをクラウドに送り返すことができます。

以下の図に示しているのは、AWS IoT Greengrass の ML Inference ワークフローです。

機械学習ワークフローのコンポーネント、およびコアデバイス (AWS IoT Greengrass サービス) とクラウドトレーニング済みモデルとの間の情報フロー。

AWS IoT Greengrass ML Inference により、ML ワークフローの各ステップがシンプルになります。

  • ML フレームワークのプロトタイプを構築し、デプロイする。

  • クラウドトレーニング済みモデルにアクセスし、それらのモデルを Greengrass コアデバイスにデプロイする。

  • ローカルリソースであるハードウェアアクセラレーター (GPU や FPGA など) にアクセスできる推論アプリケーションを作成する。

機械学習リソース

機械学習リソースは、AWS IoT Greengrass コアにデプロイされたクラウドトレーニング済み推論モデルを表します。機械学習リソースをデプロイするには、まず Greengrass グループに追加し、グループ内の Lambda 関数がそれらのリソースにアクセスできる方法を定義します。グループのデプロイ中に、AWS IoT Greengrass によってソースモデルパッケージがクラウドから取得され、Lambda ランタイム名前空間内のディレクトリに抽出されます。その後、Greengrass Lambda 関数によって、ローカルにデプロイしたモデルを使用して推論が実行されるようになります。

ローカルにデプロイしたモデルを更新するには、まず機械学習リソースに対応するソースモデル (クラウド内) を更新してから、そのグループをデプロイします。デプロイ中、AWS IoT Greengrass によってソースの変更が確認されます。変更が検出された場合、AWS IoT Greengrass によってローカルモデルが更新されます。

サポートされているモデルソース

AWS IoT Greengrass は、機械学習リソース用に SageMaker および Amazon S3 モデルソースをサポートしています。

モデルソースには、以下の要件が適用されます。

  • SageMaker および Amazon S3 モデルソースを保存する S3 バケットは、SSE-C を使用して暗号化する必要はありません。サーバー側の暗号化を使用するバケットの場合、AWS IoT Greengrass ML 推論は現在、SSE-S3 または SSE-KMS 暗号化オプションのみをサポートしています。サーバー側の暗号化オプションの詳細については、「Amazon Simple Storage Service ユーザーガイド」の「サーバー側の暗号化を使用したデータの保護」を参照してください。

  • SageMaker および Amazon S3 モデルソースを保存する S3 バケットの名前にピリオド (.) を含めないでください。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「バケットの名前付け」で、SSL での仮想ホスト型バケットの使用に関するルールを参照してください。

  • サービスレベルの AWS リージョンのサポートは AWS IoT GreengrassSageMaker の両方で利用できる必要があります。現在、AWS IoT Greengrass は次のリージョンの SageMaker モデルをサポートしています。

    • 米国東部(オハイオ)

    • 米国東部 (バージニア北部)

    • 米国西部 (オレゴン)

    • アジアパシフィック (ムンバイ)

    • アジアパシフィック (ソウル)

    • アジアパシフィック (シンガポール)

    • アジアパシフィック (シドニー)

    • アジアパシフィック (東京)

    • 欧州 (フランクフルト)

    • 欧州 (アイルランド)

    • 欧州 (ロンドン)

  • 以下のセクションで説明しているように、AWS IoT Greengrass にはモデルソースに対する read アクセス許可が必要です。

SageMaker

AWS IoT Greengrass は、SageMaker トレーニングジョブとして保存されるモデルをサポートしています。SageMaker は、完全マネージド型の ML サービスであり、組み込みまたはカスタムアルゴリズムを使用してモデルを構築し、トレーニングすることが可能です。詳細については、「SageMaker デベロッパーガイド」の「SageMaker とは」を参照してください。

名前に sagemaker が含まれるバケットの作成により SageMaker 環境を構成した場合、AWS IoT Greengrass には、SageMaker トレーニングジョブにアクセスするための十分なアクセス権限があります。AWSGreengrassResourceAccessRolePolicy 管理ポリシーは、名前に文字列 sagemaker が含まれるバケットへのアクセスを許可します。このポリシーは Greengrass サービスのロールにアタッチされます。

それ以外の場合は、AWS IoT Greengrass に、トレーニングジョブが保存されるバケットに対する readアクセス許可を付与する必要があります。そのためには、サービスロールに以下のインラインポリシーを埋め込みます。複数のバケット ARN を含めることができます。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-bucket-name" ] } ] }
Amazon S3

AWS IoT Greengrass は、Amazon S3 に tar.gz または .zip ファイルとして保存されるモデルをサポートしています。

Amazon S3 バケットに保存されるモデルに AWS IoT Greengrass がアクセスできるようにするには、以下のうちの 1 つを実行して、バケットにアクセスするための read アクセス権限を AWS IoT Greengrass に付与する必要があります。

  • 名前に greengrass が含まれるバケットにモデルを保存します。

    AWSGreengrassResourceAccessRolePolicy 管理ポリシーは、名前に文字列 greengrass が含まれるバケットへのアクセスを許可します。このポリシーは Greengrass サービスのロールにアタッチされます。

     

  • Greengrass サービスロールにインラインポリシーを埋め込みます。

    バケット名に greengrass が含まれない場合は、サービスロールに以下のインラインポリシーを追加します。複数のバケット ARN を含めることができます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-bucket-name" ] } ] }

    詳細については、「IAM ユーザーガイド」の「インラインポリシーの埋め込み」を参照してください。

要件

機械学習リソースの作成と使用には、以下の要件が適用されます。

  • AWS IoT Greengrass Core v1.6 以降を使用している必要があります。

  • ユーザー定義 Lambda 関数は、リソースに対して read または read and write オペレーションを実行できます。他のオペレーションに対するアクセス許可はありません。関連する Lambda 関数のコンテナ化モードによって、アクセス権限の設定方法が決まります。詳細については、「Lambda 関数から機械学習リソースにアクセスする」を参照してください。

  • コアデバイスのオペレーティングシステム上のリソースの完全パスを指定することが必要です。

  • リソース名または ID の最大長は 128 文字で、パターン [a-zA-Z0-9:_-]+ を使用する必要があります。

ML 推論用のランタイムとライブラリ

AWS IoT Greengrass では、次の ML ランタイムとライブラリを使用できます。

これらのランタイムとライブラリは、NVIDIA Jetson TX2、Intel Atom、および Raspberry Pi プラットフォームにインストールできます。ダウンロード情報については、「サポートされている機械学習ランタイムおよびライブラリ」を参照してください。コアデバイスに直接インストールできます。

互換性と制限については、必ず以下の情報を参照してください。

SageMaker Neo 深層学習ランタイム

SageMaker Neo 深層学習ランタイムを使用して、最適化された機械学習モデルによる推論を AWS IoT Greengrass デバイスで実行できます。これらのモデルは、機械学習推論の予測速度を上げるために、SageMaker Neo 深層学習コンパイラを使用して最適化されています。SageMaker におけるモデルの最適化の詳細については、SageMaker Neo のドキュメントを参照してください。

注記

現在、特定のアマゾン ウェブ サービスリージョンでのみ Neo 深層学習コンパイラを使用して機械学習モデルを最適化できます。ただし、Neo 深層学習ランタイムは、AWS IoT Greengrass コアがサポートされている各 AWS リージョン の最適化されたモデルで使用できます。詳細については、「最適化された機械学習推論を設定する方法」を参照してください。

MXNet のバージョニング

Apache MXNet は現在、下位互換性を保証していないため、フレームワークの新しいバージョンを使用してトレーニングするモデルは、フレームワークの以前のバージョンでは正しく動作しないことがあります。モデルトレーニング段階とモデル提供段階との間で競合を回避し、一貫したエンドツーエンドエクスペリエンスを実現するには、両方の段階で同じバージョンの MXNet フレームワークを使用します。

Raspberry Pi の MXNet

ローカル MXNet モデルにアクセスする Greengrass Lambda 関数では、以下の環境変数が設定される必要があります。

MXNET_ENGINE_TYPE=NativeEngine

関数コードで環境変数を設定することも、関数のグループ固有設定に追加することもできます。構成設定として環境変数を追加する例については、このステップを参照してください。

注記

サードパーティのコード例を実行するなどの MXNet フレームワークの一般使用に対しては、環境変数を Raspberry Pi で設定する必要があります。

Raspberry Pi での TensorFlow モデルの制限

推論結果を向上させるための推奨事項は、Raspberry Pi プラットフォームで TensorFlow 32-bit Arm ライブラリを使用したテストに基づいています。これらの推奨事項は、上級ユーザーのみを対象としており、いかなる種類の保証もありません。

  • チェックポイント形式を使用してトレーニングされたモデルは、提供する前にプロトコルバッファ形式で "圧縮" する必要があります。例については、「TensorFlow-Slim イメージ分類モデルライブラリ」を参照してください。

  • TF-Estimator および TF-Slim ライブラリはトレーニングコードまたは推論コードで使用しないでください。代わりに、以下の例に示している .pb ファイルモデルロードパターンを使用してください。

    graph = tf.Graph() graph_def = tf.GraphDef() graph_def.ParseFromString(pb_file.read()) with graph.as_default(): tf.import_graph_def(graph_def)
注記

TensorFlow でサポートされているプラットフォームの詳細については、TensorFlow のドキュメントの「TensorFlow のインストール」を参照してください。