AWS Management Console を使用して機械学習推論を設定する方法 - AWS IoT Greengrass

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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Management Console を使用して機械学習推論を設定する方法

このチュートリアルの手順に従うには、AWS IoT Greengrass Core v1.10 以降を使用している必要があります。

ローカルに生成されたデータを使用して、Greengrass コアデバイスで機械学習 (ML) 推論をローカルで実行できます。要件と制約を含め、情報については、「機械学習の推論を実行する」を参照してください。

このチュートリアルでは、AWS Management Console を使用して、クラウドにデータを送信せずにカメラからのイメージをローカルで認識する Lambda 推論アプリケーションを実行するように、Greengrass グループを設定する方法について説明します。推論アプリケーションは、Raspberry Pi 上のカメラモジュールにアクセスし、オープンソースの SqueezeNet モデルを使用して推論を実行します。

このチュートリアルには、以下の手順の概要が含まれます。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Raspberry Pi 4 モデル B または Raspberry Pi 3 モデル B/B+ は、AWS IoT Greengrass と共に使用するようにセットアップおよび構成されています。Raspberry Pi をAWS IoT Greengrass と共にセットアップする前に、Greengrass Device Setup スクリプトを実行するか、の開始方法 AWS IoT Greengrassモジュール 1モジュール 2 を完了していることを確認します。

    注記

    Raspberry Pi では、イメージ分類に一般的に使用される深層学習のフレームワークを動かすために、2.5A の電源が必要な場合があります。定格の低い電源を使用すると、デバイスが再起動する場合があります。

  • Raspberry Pi カメラモジュール V2 - 8 Megapixel、1080p。カメラの設定方法については、Raspberry Pi ドキュメントで「カメラの接続」を参照してください。

  • Greengrass グループと Greengrass コア。Greengrass グループまたはコアを作成する方法については、「の開始方法 AWS IoT Greengrass」を参照してください。

注記

このチュートリアルでは Raspberry Pi を使用していますが、AWS IoT Greengrass は Intel AtomNVIDIA Jetson TX2 などの他のプラットフォームをサポートしています。Jetson TX2 の例は、カメラからストリームされた画像の代わりに静的画像を使用できます。Jetson TX2 の例を使用する場合は、Python 3.7 ではなく Python 3.6 をインストールする必要があります。AWS IoT Greengrass Core ソフトウェアをインストールできるようにデバイスを設定する方法については、「他のデバイスの設定」を参照してください。

AWS IoT Greengrass がサポートしていないサードパーティプラットフォームの場合、Lambda 関数を非コンテナ化モードで実行する必要があります。非コンテナ化モードで実行するには、Lambda 関数を root として実行する必要があります。詳細については、「Lambda 関数のコンテナ化を選択する場合の考慮事項」および「グループ内の Lambda 関数に対するデフォルトのアクセス ID の設定」を参照してください。

ステップ 1: Raspberry Pi を設定する

このステップでは、Raspbian オペレーティングシステムの更新プログラムをインストールし、カメラモジュールソフトウェアと Python の依存関係をインストールして、カメラインターフェイスを有効にします。

Raspberry Pi のターミナルで以下のコマンドを実行します。

  1. Raspbian に更新プログラムをインストールします。

    sudo apt-get update sudo apt-get dist-upgrade
  2. カメラモジュールの picamera インターフェイス、およびこのチュートリアルに必要なその他の Python ライブラリをインストールします。

    sudo apt-get install -y python3-dev python3-setuptools python3-pip python3-picamera

    インストールを検証します。

    • Python 3.7 のインストールに pip が含まれていることを確認します。

      python3 -m pip

      pip がインストールされていない場合は、pip ウェブサイトからダウンロードし、次のコマンドを実行します。

      python3 get-pip.py
    • Python のバージョンが 3.7 以上であることを確認します。

      python3 --version

      出力に以前のバージョンが表示されている場合は、次のコマンドを実行します。

      sudo apt-get install -y python3.7-dev
    • Setuptools と Picamera が正常にインストールされたことを確認します。

      sudo -u ggc_user bash -c 'python3 -c "import setuptools"' sudo -u ggc_user bash -c 'python3 -c "import picamera"'

      出力にエラーが含まれていない場合、検証は成功です。

    注記

    デバイスにインストールされている Python 実行可能ファイルが python3.7 である場合は、このチュートリアルのコマンドに python3 ではなく、python3.7 を使用します。依存関係のエラーを回避するために、pip インストールが正しい python3 バージョンまたは python3.7 バージョンにマップされていることを確認してください。

  3. Raspberry Pi を再起動します。

    sudo reboot
  4. Raspberry Pi 設定ツールを開きます。

    sudo raspi-config
  5. 矢印キーを使用して [Interfacing Options] (インターフェイスオプション) を開き、カメラインターフェイスを有効にします。プロンプトが表示されたら、デバイスを再起動します。

  6. 以下のコマンドを使用して、カメラの設定をテストします。

    raspistill -v -o test.jpg

    これにより、Raspberry Pi のプレビューウィンドウが開き、test.jpg という写真が現在のディレクトリに保存されて、カメラに関する情報が Raspberry Pi のターミナルに表示されます。

ステップ 2: MXNet フレームワークをインストールする

このステップでは、Raspberry Pi に MXNet ライブラリをインストールします。

  1. リモートで Raspberry Pi にサインインします。

    ssh pi@your-device-ip-address
  2. MXNet のドキュメントを開き、MXNet のインストールを開いて、指示に従って MXNet をデバイスにインストールします。

    注記

    このチュートリアルでは、デバイスの競合を回避するために、バージョン 1.5.0 をインストールし、ソースから MXNet をビルドすることをお勧めします。

  3. MXNet をインストールしたら、次の設定を検証します。

    • ggc_user システムアカウントが MXNet フレームワークを使用できることを確認します。

      sudo -u ggc_user bash -c 'python3 -c "import mxnet"'
    • NumPy がインストールされていることを確認します。

      sudo -u ggc_user bash -c 'python3 -c "import numpy"'

ステップ 3: MXNet モデルパッケージを作成する

このステップでは、事前トレーニング済みのサンプル MXNet モデルを含むモデルパッケージを作成して、Amazon Simple Storage Service (Amazon S3) にアップロードします。AWS IoT Greengrass は、tar.gz 形式または zip 形式を使用している場合に限り、Amazon S3 のモデルパッケージを使用できます。

  1. コンピュータで、機械学習のサンプル から Raspberry Pi 用の MXNet サンプルをダウンロードします。

  2. ダウンロードした mxnet-py3-armv7l.tar.gz ファイルを解凍します。

  3. squeezenet ディレクトリに移動します。

    cd path-to-downloaded-sample/mxnet-py3-armv7l/models/squeezenet

    このディレクトリ内の squeezenet.zip ファイルはモデルパッケージです。これには、イメージ分類モデルの SqueezeNet オープンソースモデルアーティファクトが含まれています。後で、このモデルパッケージを Amazon S3 にアップロードします。

ステップ 4: Lambda 関数を作成して発行する

この手順では、Lambda 関数デプロイパッケージと Lambda 関数を作成します。次に、関数のバージョンを公開し、エイリアスを作成します。

まず、Lambda 関数デプロイパッケージを作成します。

  1. コンピュータで、ステップ 3: MXNet モデルパッケージを作成する で解凍したサンプルパッケージ内の examples ディレクトリに移動します。

    cd path-to-downloaded-sample/mxnet-py3-armv7l/examples

    examples ディレクトリには、関数コードと依存関係が含まれています。

    • greengrassObjectClassification.py は、このチュートリアルで使用される推論コードです。このコードをテンプレートとして使用して、独自の推論関数を作成できます。

    • greengrasssdk は、AWS IoT Greengrass Core SDK for Python のバージョン 1.5.0 です。

      注記

      新しいバージョンが利用できる場合は、そのバージョンをダウンロードし、デプロイパッケージ内の SDK バージョンをアップグレードできます。詳細については、GitHub の「AWS IoT Greengrass Core SDK for Python」を参照してください。

  2. examples ディレクトリの内容を greengrassObjectClassification.zip という名前のファイルに圧縮します。このファイルがデプロイパッケージです。

    zip -r greengrassObjectClassification.zip .
    注記

    .py ファイルと依存関係がディレクトリのルートにあることを確認します。

     

    次に、Lambda 関数を作成します。

  3. AWS IoT コンソールから、[Functions] (関数)、[Create function] (関数の作成) を選択します。

  4. [Author from scratch] (一から作成) を選択し、以下の値を使用して関数を作成します。

    • [Function name] (関数名) に greengrassObjectClassification と入力します。

    • [Runtime (ランタイム)] で [Python 3.7] を選択します。

    [Permissions] (アクセス許可) はデフォルト設定のままにしておきます。これで Lambda への基本的なアクセス許可を付与する実行ロールが作成されます。このロールは、AWS IoT Greengrass によっては使用されません。

  5. [Create function] (関数の作成) を選択します。

     

    今度は、Lambda 関数デプロイパッケージをアップロードし、ハンドラを登録します。

  6. [Lambda function](Lambda 関数) を選択し、Lambda 関数のデプロイパッケージをアップロードします。

    1. [Code] (コード) タブの [Code source] (コードソース) で、[Upload from] (アップロード元) を選択します。ドロップダウンから [.zip file] (.zip ファイル) を選択します。

      [.zip file] (.zip ファイル) が強調表示された [Upload from] (アップロード元) ドロップダウンリスト。
    2. [Upload] (アップロード) を選択し、greengrassObjectClassification.zip デプロイパッケージを選択します。次に、保存を選択します。

    3. 関数の [Code] (コード) タブにある [Runtime settings] (ランタイム設定) で [Edit] (編集) を選択し、次の値を入力します。

      • [Runtime (ランタイム)] で [Python 3.7] を選択します。

      • [Handler (ハンドラ)] に「greengrassObjectClassification.function_handler」と入力します。

      [Save] を選択します。

    次に、Lambda 関数の最初のバージョンを発行します。次に、バージョンのエイリアスを作成します。

    注記

    Greengrass グループは、Lambda 関数をエイリアス別 (推奨) またはバージョン別に参照できます。エイリアスを使用すると、関数コードを更新する時にサブスクリプションテーブルやグループ定義を変更する必要がないため、コード更新を簡単に管理できます。その代わりに、新しい関数バージョンにエイリアスを指定するだけで済みます。

  7. [Actions] メニューから、[Publish new version] を選択します。

    [アクション] メニューの [新しいバージョンを発行] オプション。
  8. [バージョンの説明] に「First version」と入力し、[発行] を選択します。

  9. [greengrassObjectClassification: 1] 設定ページで、[Actions] (アクション) メニューの [エイリアスの作成] を選択します。

    [アクション] メニューの [エイリアスの作成] オプション。
  10. [Create a new alias] ページで、次の値を使用します。

    • [Name] (名前) に「mlTest」と入力します。

    • [バージョン] に「1」と入力します。

    注記

    AWS IoT Greengrass は、$LATEST バージョンの Lambda エイリアスをサポートしていません。

  11. [Save] を選択します。

     

    ここで、Greengrass グループに Lambda 関数を追加します。

ステップ 5: Lambda 関数を Greengrass グループに追加する

このステップでは、Lambda 関数をグループに追加してから、そのライフサイクルと環境変数を設定します。

まず、Greengrass グループに Lambda 関数を追加します。

  1. AWS IoT コンソールのナビゲーションペインの [Manage] (管理) で、[Greengrass devices] (Greengrass デバイス) を展開して、[Groups (V1)](グループ (V1)) を選択します。

  2. グループ設定ページで、[Lambda functions] (Lambda 関数) タブを選択します。

  3. [My Lambda functions] (自分の Lambda 関数) セクションから、[Add](追加)を選択します。

  4. [Lambda function] (Lambda 関数) で、[greengrassObjectClassification]を選択します。

  5. Lambda 関数のバージョンで、Alias:mlTest を選択します。

     

    次に、Lambda 関数のライフサイクルと環境変数を設定します。

  6. [Lambda function configuration] (Lambda 関数の設定) セクションで次のように更新します。

    注記

    ビジネスケースで要求される場合を除き、Lambda 関数を、コンテナ化を使用しないで実行することをお勧めします。これにより、デバイスリソースを設定しなくても、デバイスの GPU とカメラにアクセスできるようになります。コンテナ化を使用しないで実行する場合は、AWS IoT Greengrass Lambda 関数にもルートアクセスを付与する必要があります。

    1. コンテナ化を使用せずに実行するには:

      • [System user and group] (システムユーザーとグループ) で、Another user ID/group IDを選択します。[System user ID] (システムユーザ ID) には、「0」と入力します。[System group ID] (システムグループ ID) には、「0」と入力します。

        これにより、Lambda 関数を root として実行できます。root として実行の詳細については、「グループ内の Lambda 関数に対するデフォルトのアクセス ID の設定」を参照してください。

        ヒント

        また、ルートアクセスを Lambda 関数に付与するように config.json ファイルを更新する必要があります。手順については、「root としての Lambda 関数の実行」を参照してください。

      • [Lambda function containerization] (Lambda 関数のコンテナ化) で、[No container] (コンテナなし) を選択します。

        コンテナ化を使用しない実行の詳細については、「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

      • [Timeout (タイムアウト)] に「10 seconds」と入力します。

      • [Pinned] (固定)で、[True] を選択します。

        詳細については、「Greengrass Lambda 関数のライフサイクル設定」を参照してください。

    2. 代わりにコンテナ化モードで実行するには:

      注記

      ビジネスケースで要求されない限り、コンテナ化モードでの実行はお勧めしていません。

      • [System user and group] (システムユーザーとグループ) で、[Use group default] (グループのデフォルトを使用) を選択します。

      • [Lambda function containerization] (Lambda 関数のコンテナ化) で、[Use group default] (グループのデフォルトを使用) を選択します。

      • [メモリ制限] に「96 MB」と入力します。

      • [Timeout (タイムアウト)] に「10 seconds」と入力します。

      • [Pinned] (固定)で、[True] を選択します。

        詳細については、「Greengrass Lambda 関数のライフサイクル設定」を参照してください。

  7. [環境変数] で、以下のキー値ペアを作成します。キー値ペアは、Raspberry Pi 上で MXNet モデルとやり取りする関数で必要となります。

    キーには、MXNET_ENGINE_TYPE を使用します。値には、NaiveEngine を使用します。

    注記

    独自のユーザー定義 Lambda 関数では、必要に応じて、関数コードで環境変数を設定できます。

  8. 他のすべてのプロパティではデフォルト値を保持し、[Add Lambda function] (Lambda 関数の追加) を選択します。

ステップ 6: Greengrass グループにリソースを追加する

このステップでは、カメラモジュールと ML 推論モデルのリソースを作成し、リソースを Lambda 関数に関連付けます。これにより、Lambda 関数がコアデバイス上のリソースにアクセスできるようになります。

注記

非コンテナ化モードで実行すると、AWS IoT Greengrass は、これらのデバイスリソースを設定しないで、デバイスの GPU とカメラにアクセスできます。

まず、カメラ用に 2 つのローカルデバイスリソースを作成します。1 つは共有メモリ用、もう 1 つはデバイスインターフェイス用です。ローカルリソースアクセスの詳細については、「Lambda 関数とコネクタを使用してローカルリソースにアクセスする」を参照してください。

  1. グループ設定ページで、[Resources] (リソース) タブを選択します。

  2. [Local resources] (ローカルリソース) タブで、[Add local resource] (ローカルリソースの追加) を選択します。

  3. [Add a local resource] (ローカルリソースの追加) ページで、次の値を使用します。

    • [リソース名] に videoCoreSharedMemory と入力します。

    • [リソースタイプ] で、[デバイス] を選択します。

    • [Local device path] (ローカルデバイスパス) には、「/dev/vcsm」と入力します。

      デバイスパスはデバイスリソースのローカル絶対パスです。このパスは、/dev 下の文字デバイスまたはブロックデバイスのみを参照できます。

    • [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可)で、[Automatically add file system permissions of the system group that owns the resource] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

      [System group owner and file access permissions] (システムグループ所有者のファイルアクセス権限) オプションを使用すると、Lambda プロセスに追加のファイルアクセス権限をグラントできます。詳細については、「グループ所有者のファイルアクセス権限」を参照してください。

  4. 次に、カメラインターフェイス用にローカルデバイスリソースを追加します。

  5. [Add local resource] (ローカルリソースの追加) を選択します。

  6. [Add a local resource] (ローカルリソースの追加) ページで、次の値を使用します。

    • [リソース名] に videoCoreInterface と入力します。

    • [リソースタイプ] で、[デバイス] を選択します。

    • [Local device path] (ローカルデバイスパス) には、「/dev/vchiq」と入力します。

    • [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可)で、[Automatically add file system permissions of the system group that owns the resource] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

  7. ページの下部で、[Add resource] (リソースの追加) を選択します。

 

ここで、推論モデルを機械学習リソースとして追加します。このステップでは、squeezenet.zip モデルパッケージを Amazon S3 にアップロードします。

  1. グループの [Resources] (リソース) タブの、[Machine Learning] (機械学習) で、[Add machine learning resour] (機械学習リソースの追加) を選択します。

  2. [Add a machine learning resource (機械学習リソースの追加) ページで、[Resource name] (リソース名) に、「 squeezenet_model」と入力します。

  3. [Model source] (モデルソース) で、[Use a model stored in S3, such as a model optimized through Deep Learning Compiler] (深層学習コンパイラで最適化されたモデルなど、S3 に保存されているモデルを使用する) を選択します。

  4. [S3 URI]には、S3 バケットが保存されているパスを入力します。

  5. Browse S3 (S3 の参照) を選択します。これにより、新しいタブで Amazon S3 コンソールが開きます。

  6. Amazon S3 コンソールタブで、squeezenet.zip ファイルを S3 バケットにアップロードします。詳細については、「Amazon Simple Storage Service ユーザーガイド」の「S3 バケットにファイルとフォルダをアップロードする方法」を参照してください。

    注記

    S3 バケットにアクセスできるようにするには、バケット名に文字列 greengrass が含まれている必要があります。バケットは、AWS IoT Greengrass に使用するリージョンと同じリージョンに存在する必要があります。一意の名前 (greengrass-bucket-user-id-epoch-time など) を選択します。バケット名にピリオド (.) を使用しないでください。

  7. AWS IoT Greengrass コンソールタブで、S3 バケットを見つけて選択します。アップロードした squeezenet.zip ファイルを見つけ、[Select (選択)] を選択します。利用可能なバケットとファイルのリストを更新するために [更新] を選択する必要がある場合があります。

  8. [送信先] に「/greengrass-machine-learning/mxnet/squeezenet」と入力します。

    これは、Lambda ランタイム名前空間内のローカルモデルのターゲットです。グループをデプロイすると、AWS IoT Greengrass によってソースモデルパッケージが取得され、指定したディレクトリにその内容が抽出されます。このチュートリアルのサンプル Lambda 関数は、このパス (model_path 変数) を使用するように既に設定されています。

  9. [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可) で、[No system group] (システムグループなし) を選択します。

  10. [Add resource] (リソースを追加) を選択します。

SageMaker トレーニング済みモデルの使用

このチュートリアルでは、Amazon S3 に保存されるモデルを使用しますが、SageMaker モデルも簡単に使用できます。AWS IoT Greengrass コンソールには組み込みの SageMaker 統合機能があるため、これらのモデルを Amazon S3 に手動でアップロードする必要はありません。SageMaker モデルの使用に関する要件と制限については、「サポートされているモデルソース」を参照してください。

SageMaker モデルを使用するには:

  • [Model source] (モデルソース) で、[Use a model trained in AWS SageMaker] ( - SageMaker でトレーニングされたモデルを使用) を選択してから、モデルのトレーニングジョブの名前を選択します。

  • [Destination path] (送信先) に、Lambda 関数によってモデルが検索されるディレクトリへのパスを入力します。

ステップ 7: Greengrass グループにサブスクリプションを追加する

このステップでは、グループにサブスクリプションを追加します。このサブスクリプションにより、Lambda 関数は、予測結果を MQTT トピックに発行することで AWS IoT に送信できます。

  1. グループ設定ページで、[Subscriptions] (サブスクリプション) タブ、[Add Subscription] (サブスクリプションの追加) の順に選択します。

  2. [Subscription details] (サブスクリプションの詳細) ページで、ソースおよびターゲットを次のように設定します。

    1. [Source type] (ソースタイプ) で、[Lambda function] (Lambda 関数)、[greengrassObjectClassification] の順に選択します。

    2. [Target type] (ターゲットタイプ)で、[Service] (サービス)、[IoT Cloud] (IoT クラウド) の順に選択します。

  3. [Topic filter] (トピックのフィルター) で、「hello/world」と入力し、[Create subscription] (サブスクリプションの作成) を選択します。

ステップ 8: Greengrass グループをデプロイする

このステップでは、グループ定義の現在のバージョンを Greengrass コアデバイスにデプロイします。この定義には、追加した Lambda 関数、リソース、サブスクリプション設定が含まれます。

  1. AWS IoT Greengrass Core が実行されていることを確認します。必要に応じて、Raspberry Pi のターミナルで以下のコマンドを実行します。

    1. デーモンが実行中であるかどうかを確認するには

      ps aux | grep -E 'greengrass.*daemon'

      出力に root/greengrass/ggc/packages/1.11.6/bin/daemon エントリが含まれる場合、デーモンは実行されています。

      注記

      パスのバージョンは、コアデバイスにインストールされている AWS IoT Greengrass Core ソフトウェアのバージョンによって異なります。

    2. 次のようにしてデーモンを開始します。

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. グループ設定ページで、[Deploy] (デプロイ) を選択します。

    [デプロイ] と [デプロイ] が強調表示されたグループの設定ページ。
  3. [Lambda functions] (Lambda 関数) タブの [System Lambda functions] (システム Lambda 関数) セクションで、[IP detector] (IP ディテクター)、[Edit} (編集) の順に選択します。

  4. [Edit IP detector settings] (IPディテクタ設定の編集) のダイアログボックスで、[Automatically detect and override MQTT broker endpoints] (MQTT ブローカーのエンドポイントを自動的に検出して上書きする)を選択します。

  5. [Save] を選択します。

    これにより、デバイスは、IP アドレス、DNS、ポート番号など、コアの接続情報を自動的に取得できます。自動検出が推奨されますが、AWS IoT Greengrass は手動で指定されたエンドポイントもサポートしています。グループが初めてデプロイされたときにのみ、検出方法の確認が求められます。

    注記

    プロンプトが表示されたら、Greengrass サービスロールの作成権限を付与し、そのロールを現在の AWS リージョン の AWS アカウント に関連付けます。このロールを付与することで、AWS IoT Greengrass は AWS サービスのリソースにアクセスできます。

    [Deployments] ページでは、デプロイのタイムスタンプ、バージョン ID、ステータスが表示されます。完了すると、デプロイのステータスが [Completed] (完了) と表示されます。

    デプロイの詳細については、「AWS IoT Greengrass グループを AWS IoT Greengrass Core にデプロイする」を参照してください。トラブルシューティングヘルプについては、AWS IoT Greengrass のトラブルシューティング を参照してください。

ステップ 9: 推論アプリケーションをテストする

これで、デプロイが正しく設定されているかどうかを確認できます。テストするには、hello/world トピックにサブスクライブし、Lambda 関数によって発行された予測結果を表示します。

注記

モニターが Raspberry Pi に接続されている場合、ライブカメラのフィードがプレビューウィンドウに表示されます。

  1. AWS IoT コンソールの、[Test] (テスト) で、[MQTT test client] (MQTT テストクライアント) を選択します。

  2. [サブスクリプション] で、以下の値を使用します。

    • サブスクリプションのトピックには、hello/world を使用します。

    • [Additional configuration] (追加設定) から、[MQTT payload display] (MQTT ペイロード表示) で、[Display payloads as strings] (文字列としてペイロードを表示) を選択します。

  3. [Subscribe] (サブスクライブ) を選択します。

    テストに成功すると、Lambda 関数からのメッセージがページの下部に表示されます。各メッセージには、確率、予測クラス ID、対応するクラス名の形式を使用して、イメージの上位 5 つの予測結果が含まれます。

    テスト結果とメッセージデータを示す [サブスクリプション] ページ。

AWS IoT Greengrass ML 推論のトラブルシューティング

テストに成功しなかった場合は、以下のトラブルシューティング手順を実行できます。Raspberry Pi のターミナルで以下のコマンドを実行します。

エラーログを確認する

  1. root ユーザーに切り替え、log ディレクトリに移動します。AWS IoT Greengrass ログへのアクセスには root アクセス許可が必要です。

    sudo su cd /greengrass/ggc/var/log
  2. system ディレクトリで、runtime.log または python_runtime.log を確認します。

    user/region/account-id ディレクトリで greengrassObjectClassification.log を確認します。

    詳細については、「ログでのトラブルシューティング」を参照してください。

runtime.log 内の 解凍エラー

runtime.log に以下のようなエラーが含まれる場合は、tar.gz ソースモデルパッケージに親ディレクトリがあることを確認します。

Greengrass deployment error: unable to download the artifact model-arn: Error while processing. Error while unpacking the file from /tmp/greengrass/artifacts/model-arn/path to /greengrass/ggc/deployment/path/model-arn, error: open /greengrass/ggc/deployment/path/model-arn/squeezenet/squeezenet_v1.1-0000.params: no such file or directory

パッケージの親ディレクトリにモデルファイルが含まれていない場合は、以下のコマンドを使用してモデルを再パッケージ化します。

tar -zcvf model.tar.gz ./model

例:

─$ tar -zcvf test.tar.gz ./test ./test ./test/some.file ./test/some.file2 ./test/some.file3
注記

このコマンドでは、末尾に /* 文字を含めないでください。

 

Lambda 関数が正常にデプロイされていることを確認する

  1. /lambda ディレクトリ内のデプロイされた Lambda の内容を一覧表示します。コマンドを実行する前に、プレースホルダーの値を置き換えます。

    cd /greengrass/ggc/deployment/lambda/arn:aws:lambda:region:account:function:function-name:function-version ls -la
  2. ディレクトリに、ステップ 4: Lambda 関数を作成して発行する でアップロードした greengrassObjectClassification.zip デプロイパッケージと同じ内容が含まれることを確認します。

    .py ファイルと依存関係がディレクトリのルートにあることを確認します。

 

推論モデルが正常にデプロイされていることを確認する

  1. Lambda ランタイムプロセスのプロセス識別番号 (PID) を見つけます。

    ps aux | grep 'lambda-function-name*'

    出力では、Lambda ランタイムプロセスの行の 2 列目に PID が表示されます。

  2. Lambda ランタイム名前空間を入力します。コマンドを実行する前に、pid プレースホルダーの値を置き換えてください。

    注記

    このディレクトリとその内容は、Lambda ランタイム名前空間にあるため、通常の Linux 名前空間には表示されません。

    sudo nsenter -t pid -m /bin/bash
  3. ML リソース用に指定したローカルディレクトリの内容を一覧表示します。

    cd /greengrass-machine-learning/mxnet/squeezenet/ ls -ls

    以下のファイルが表示されます。

    32 -rw-r--r-- 1 ggc_user ggc_group   31675 Nov 18 15:19 synset.txt 32 -rw-r--r-- 1 ggc_user ggc_group   28707 Nov 18 15:19 squeezenet_v1.1-symbol.json 4832 -rw-r--r-- 1 ggc_user ggc_group 4945062 Nov 18 15:19 squeezenet_v1.1-0000.params

次のステップ

次に、他の推論アプリケーションを調べます。AWS IoT Greengrass は、ローカル推論を試すために使用できる他の Lambda 関数を提供します。サンプルパッケージは、「ステップ 2: MXNet フレームワークをインストールする」でダウンロードしたプリコンパイル済みライブラリフォルダにあります。

インテル Atom の設定

Intel Atom デバイスでこのチュートリアルを実行するには、ソースイメージを指定し、Lambda 関数を設定して、別のローカルデバイスリソースを追加する必要があります。GPU を推論に使用するには、デバイスに次のソフトウェアがインストールされていることを確認します。

  • OpenCL バージョン 1.0 以降

  • Python 3.7 と pip

    注記

    デバイスが Python 3.6 で構築済みの場合は、代わりに Python 3.7 へのシンボリックリンクを作成することができます。詳細については、「ステップ 2」を参照してください。

  • NumPy

  • ホイール上の OpenCV

  1. Lambda 関数用に静的な PNG あるいは JPG 画像をダウンロードして、イメージ分類に使用します。この例は小さいイメージファイルで最適に動作します。

    greengrassObjectClassification.py ファイルがあるディレクトリ (あるいは、このディレクトリのサブディレクトリ) に画像ファイルを保存します。これは、ステップ 4: Lambda 関数を作成して発行する でアップロードした Lambda 関数デプロイパッケージにあります。

    注記

    AWS DeepLens を使用している場合は、オンボードカメラを使用するか、独自のカメラをマウントして、静的イメージではなく、キャプチャされたイメージに対して推論を実行できます。ただし、最初に静的イメージから開始することを強くお勧めします。

    カメラを使用する場合は、awscam APT パッケージがインストールされていて、最新の状態であることを確認してください。詳細については、「AWS DeepLens デベロッパーガイド」の「AWS DeepLens デバイスの更新」を参照してください。

  2. Lambda 関数の設定を編集します。「ステップ 5: Lambda 関数を Greengrass グループに追加する」の手順に従います。

    注記

    ビジネスケースで要求される場合を除き、Lambda 関数を、コンテナ化を使用しないで実行することをお勧めします。これにより、デバイスリソースを設定しなくても、デバイスの GPU とカメラにアクセスできるようになります。コンテナ化を使用しないで実行する場合は、AWS IoT Greengrass Lambda 関数にもルートアクセスを付与する必要があります。

    1. コンテナ化を使用せずに実行するには:

      • [System user and group] (システムユーザーとグループ) で、Another user ID/group IDを選択します。[System user ID] (システムユーザ ID) には、「0」と入力します。[System group ID] (システムグループ ID) には、「0」と入力します。

        これにより、Lambda 関数を root として実行できます。root として実行の詳細については、「グループ内の Lambda 関数に対するデフォルトのアクセス ID の設定」を参照してください。

        ヒント

        また、ルートアクセスを Lambda 関数に付与するように config.json ファイルを更新する必要があります。詳しい手順については、「root としての Lambda 関数の実行」を参照してください。

      • [Lambda function containerization] (Lambda 関数のコンテナ化) で、[No container] (コンテナなし) を選択します。

        コンテナ化を使用しない実行の詳細については、「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

      • [Timeout (タイムアウト)] 値を 5 秒に更新します。これにより、リクエストの早過ぎるタイムアウトがなくなります。セットアップ後、推論の実行には数分かかります。

      • [Pinned](固定)で、[True] を選択します。

      • [Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。

      • [Lambda のライフサイクル] で、[存続期間が長く無制限に稼働する関数にする] を選択します。

    2. 代わりにコンテナ化モードで実行するには:

      注記

      ビジネスケースで要求されない限り、コンテナ化モードでの実行はお勧めしていません。

      • [Timeout (タイムアウト)] 値を 5 秒に更新します。これにより、リクエストの早過ぎるタイムアウトがなくなります。セットアップ後、推論の実行には数分かかります。

      • [Pinned] (固定)で、[True] を選択します。

      • [Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。

  3. コンテナ化モードで実行している場合、必要なローカルデバイスリソースを追加して、デバイス GPU へのアクセスを付与します。

    注記

    非コンテナ化モードで実行すると、AWS IoT Greengrass はデバイスリソースを設定しないで、デバイスの GPU にアクセスできます。

    1. グループ設定ページで、[Resources] (リソース) タブを選択します。

    2. [Add local resource] (ローカルリソースの追加) を選択します。

    3. リソースを定義します。

      • [リソース名] に renderD128 と入力します。

      • [[Resource type] (リソースタイプ) で、[Local device] (ローカルデバイス) を選択します。

      • [デバイスパス] に「/dev/dri/renderD128」と入力します。

      • [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可)で、[Automatically add file system permissions of the system group that owns the resource] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

      • [Lambda function affiliations] (Lambda 関数の所属) で、Lambda 関数への [Read and write access] (読み取りと書き込みアクセス) を許可します。

NVIDIA Jetson TX2 の設定

NVIDIA Jetson TX2 でこのチュートリアルを実行するには、ソースイメージを指定して、Lambda 関数を設定します。GPU を使用している場合、さらにローカルデバイスリソースを追加する必要があります。

  1. AWS IoT Greengrass Core ソフトウェアをインストールできるように、Jetson デバイスが設定されていることを確認します。デバイスの設定の詳細については、「他のデバイスの設定」を参照してください。

  2. MXNet のドキュメントを開き、Jetson への MXNet のインストールに移動し、指示に従って Jetson デバイスに MXNet をインストールします。

    注記

    ソースから MXNet をビルドする場合は、指示に従って共有ライブラリをビルドします。config.mk ファイルの次の設定を編集して、Jetson TX2 デバイスを操作します。

    • -gencode arch=compute-62, code=sm_62CUDA_ARCH 設定に追加します。

    • CUDA を有効にします。

      USE_CUDA = 1
  3. Lambda 関数用に静的な PNG あるいは JPG 画像をダウンロードして、イメージ分類に使用します。このアプリは小さな画像ファイルで最適に動作します。また、Jetson ボードにカメラを設置して、ソースイメージをキャプチャできます。

    greengrassObjectClassification.py ファイルを含むディレクトリにイメージファイルを保存します。このディレクトリのサブディレクトリに保存することもできます。このディレクトリは、ステップ 4: Lambda 関数を作成して発行する でアップロードした Lambda 関数デプロイパッケージにあります。

  4. Python 3.7 から Python 3.6 へのシンボリックリンクを作成し、AWS IoT Greengrass で Python 3 を使用します。次のコマンドを実行して、Python のインストールを検索します。

    which python3

    次のコマンドを実行して、シンボリックリンクを作成します。

    sudo ln -s path-to-python-3.6/python3.6 path-to-python-3.7/python3.7

    デバイスを再起動します。

  5. ggc_user システムアカウントが MXNet フレームワークを使用できることを確認します。

    “sudo -u ggc_user bash -c 'python3 -c "import mxnet"'
  6. Lambda 関数の設定を編集します。「ステップ 5: Lambda 関数を Greengrass グループに追加する」の手順に従います。

    注記

    ビジネスケースで要求される場合を除き、Lambda 関数を、コンテナ化を使用しないで実行することをお勧めします。これにより、デバイスリソースを設定しなくても、デバイスの GPU とカメラにアクセスできるようになります。コンテナ化を使用しないで実行する場合は、AWS IoT Greengrass Lambda 関数にもルートアクセスを付与する必要があります。

    1. コンテナ化を使用せずに実行するには:

      • [System user and group] (システムユーザーとグループ) で、Another user ID/group IDを選択します。[System user ID] (システムユーザ ID) には、「0」と入力します。[System group ID] (システムグループ ID) には、「0」と入力します。

        これにより、Lambda 関数を root として実行できます。root として実行の詳細については、「グループ内の Lambda 関数に対するデフォルトのアクセス ID の設定」を参照してください。

        ヒント

        また、ルートアクセスを Lambda 関数に付与するように config.json ファイルを更新する必要があります。手順については、「root としての Lambda 関数の実行」を参照してください。

      • [Lambda function containerization] (Lambda 関数のコンテナ化) で、[No container] (コンテナなし) を選択します。

        コンテナ化を使用しない実行の詳細については、「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

      • [Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。

      • [Environment variables] (環境変数) で、次のキーと値のペアを Lambda 関数に追加します。これにより、AWS IoT Greengrass は、MXNet フレームワークを使用するように設定されます。

        キー

        PATH

        /usr/local/cuda/bin:$PATH

        MXNET_HOME

        $HOME/mxnet/

        PYTHONPATH

        $MXNET_HOME/python:$PYTHONPATH

        CUDA_HOME

        /usr/local/cuda

        LD_LIBRARY_PATH

        $LD_LIBRARY_PATH:${CUDA_HOME}/lib64

    2. 代わりにコンテナ化モードで実行するには:

      注記

      ビジネスケースで要求されない限り、コンテナ化モードでの実行はお勧めしていません。

      • [メモリ制限] の値を増やします。CPU の場合は 500 MB、GPU の場合は少なくとも 2000 MB を使用します。

      • [Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。

      • [Environment variables] (環境変数) で、次のキーと値のペアを Lambda 関数に追加します。これにより、AWS IoT Greengrass は、MXNet フレームワークを使用するように設定されます。

        キー

        PATH

        /usr/local/cuda/bin:$PATH

        MXNET_HOME

        $HOME/mxnet/

        PYTHONPATH

        $MXNET_HOME/python:$PYTHONPATH

        CUDA_HOME

        /usr/local/cuda

        LD_LIBRARY_PATH

        $LD_LIBRARY_PATH:${CUDA_HOME}/lib64

  7. コンテナ化モードで実行している場合、次のローカルデバイスリソースを追加して、デバイス GPU へのアクセスを許可します。「ステップ 6: Greengrass グループにリソースを追加する」の手順に従います。

    注記

    非コンテナ化モードで実行すると、AWS IoT Greengrass はデバイスリソースを設定しないで、デバイスの GPU にアクセスできます。

    リソースごとに:

    • [リソースタイプ] で、[デバイス] を選択します。

    • [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可)で、[Automatically add file system permissions of the system group that owns the resource] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

       

      名前

      デバイスパス

      nvhost-ctrl

      /dev/nvhost-ctrl

      nvhost-gpu

      /dev/nvhost-gpu

      nvhost-ctrl-gpu

      /dev/nvhost-ctrl-gpu

      nvhost-dbg-gpu

      /dev/nvhost-dbg-gpu

      nvhost-prof-gpu

      /dev/nvhost-prof-gpu

      nvmap

      /dev/nvmap

      nvhost-vic

      /dev/nvhost-vic

      tegra_dc_ctrl

      /dev/tegra_dc_ctrl

  8. コンテナ化モードで実行している場合で、次のローカルボリュームリソースを追加して、デバイスカメラへのアクセスを許可します。「ステップ 6: Greengrass グループにリソースを追加する」の手順に従います。

    注記

    非コンテナ化モードで実行すると、AWS IoT Greengrass はボリュームリソースを設定しないで、デバイスのカメラにアクセスできます。

    • [リソースタイプ] で、[ボリューム] を選択します。

    • [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可)で、[Automatically add file system permissions of the system group that owns the resource] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

       

      名前

      ソースパス

      送信先パス

      shm

      /dev/shm

      /dev/shm

      tmp

      /tmp

      /tmp