AWS IoT Greengrass
開発者ガイド

最適化された機械学習推論を AWS マネジメントコンソール で設定する方法

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

Amazon SageMaker Neo 深層学習コンパイラー を使用して、多くのフレームワーク内のネイティブ機械学習推論モデルの予測効率を最適化できます。次に、最適化されたモデルをダウンロードし、Amazon SageMaker Neo 深層学習ランタイム をインストールして、それらを AWS IoT Greengrass デバイスにデプロイし、推論速度を上げることができます。

このチュートリアルでは、AWS マネジメントコンソール を使用して、クラウドにデータを送信せずにカメラからのイメージをローカルで認識する Lambda 推論例を実行するように、Greengrass グループを設定する方法について説明します。推論例では、Raspberry Pi のカメラモジュールにアクセスします。このチュートリアルでは、Resnet-50 によってトレーニングされて Neo 深層学習コンパイラー で最適化された、事前にパッケージ化されたモデルをダウンロードします。そのモデルを使用して、AWS IoT Greengrass デバイスでローカルイメージ分類を実行します。

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

前提条件

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

  • AWS IoT Greengrass で使用するようセットアップおよび設定された Raspberry Pi 4 Model B、または Raspberry Pi 3 Model B/B+。Raspberry Pi を AWS IoT Greengrass でセットアップする方法については、AWS IoT Greengrass の使用開始モジュール 1モジュール 2 を参照してください。

    注記

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

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

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

注記

このチュートリアルでは Raspberry Pi を使用していますが、AWS IoT Greengrass はインテル AtomNVIDIA Jetson TX2 などの他のプラットフォームもサポートしています。

ステップ 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 python-dev python-setuptools python-pip python-picamera
  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: Amazon SageMaker Neo Deep Learning ランタイムをインストールする

このステップでは、Neo 深層学習ランタイム をダウンロードし、Raspberry Pi にインストールします。

  1. AWS IoT Greengrass Machine Learning ランタイムおよびプリコンパイル済みライブラリ ダウンロード ページで、Deep Learning Runtime version 1.0.0 for Raspberry Pi を見つけます。[Download] を選択します。

  2. ダウンロードした dlr-1.0-py2-armv7l.tar.gz ファイルをコンピュータから Raspberry Pi に転送します。以下の scp コマンドを使用して、ファイルを保存するパス (/home/pi/ など) を指定することもできます。

    scp dlr-1.0-py2-armv7l.tar.gz pi@your-device-ip-address:path-to-save-file
  3. 以下のコマンドを使用して、Raspberry Pi にリモートからサインインし、インストーラファイルを展開します。

    ssh pi@your-device-ip-address ​cd path-to-save-file tar -xvzf dlr-1.0-py2-armv7l.tar.gz
  4. Neo 深層学習ランタイム をインストールします。

    cd dlr-1.0-py2-armv7l/ chmod 755 install-dlr.sh sudo ./install-dlr.sh

    このパッケージには、このチュートリアルの実行に使用するファイルが保存された examples ディレクトリが含まれています。このディレクトリには、AWS IoT Greengrass Core SDK for Python のバージョン 1.2.0 も含まれています。また、AWS IoT Greengrass Core SDK ダウンロード ページから SDK の最新バージョンをダウンロードすることもできます。

ステップ 3: Lambda 推論関数を作成する

このステップでは、デプロイパッケージと、デプロイパッケージを使用するように設定した Lambda 関数を作成します。次に、関数のバージョンを公開し、エイリアスを作成します。

  1. コンピュータで、先ほど Raspberry Pi にコピーした dlr-1.0-py2-armv7l.tar.gz ファイルを解凍します。

    cd path-to-downloaded-runtime tar -xvzf dlr-1.0-py2-armv7l.tar.gz
  2. 生成された dlr-1.0-py2-armv7l ディレクトリには examples フォルダが含まれています。これには、このチュートリアルで推論に使用するサンプルコード inference.py が含まれています。このコードを使用例として参照し、独自の推論コードを作成できます。

    examples フォルダ内のファイルを optimizedImageClassification.zip というファイルに圧縮します。

    注記

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

    cd path-to-downloaded-runtime/dlr-1.0-py2-armv7l/examples zip -r optimizedImageClassification.zip .

    この .zip ファイルがデプロイパッケージです。このパッケージ内の関数コードと依存関係に含まれているコード例を使用して、Neo 深層学習ランタイム Python API を呼び出し、Neo 深層学習コンパイラー モデルで推論を実行します。後でこのデプロイパッケージをアップロードします。

  3. 次は、Lambda 関数を作成します。

    AWS IoT コンソール のナビゲーションペインで、[Greengrass]、[グループ] の順に選択します。

    
            AWS IoT コンソール のナビゲーションペインで [グループ] が強調表示されている。
  4. Lambda 関数を追加する Greengrass グループを選択します。

  5. グループの設定ページで [Lambda]、[Add Lambda] の順に選択します。

    
            [Lambda] と [Lambda の追加] が強調表示されたグループページ。
  6. [Add a Lambda to your Greengrass Group (Greengrass グループへの Lambda の追加)] ページで、[Create new Lambda] を選択します。これにより、AWS Lambda コンソールが開きます。

    
            [Create new Lambda] (Lambda の新規作成) が強調表示された [Add a Lambda to your Greengrass Group] (Greengrass グループへの Lambda の追加) ページ。
  7. [Author from scratch] を選択し、以下の値を使用して関数を作成します。

    • [関数名] に「optimizedImageClassification」と入力します。

    • [Runtime] で [Python 2.7] を選択します。

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

    
            [関数の作成] ページの [Basic information] セクション。
  8. Create function を選択します。

 

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

  1. [設定] タブの optimizedImageClassification 関数の [Function code (関数のコード)] で、以下の値を使用します。

    • [コードエントリタイプ] で、[.ZIP ファイルをアップロード] を選択します。

    • [Runtime] で [Python 2.7] を選択します。

    • [ハンドラ] に「inference.handler」と入力します。

  2. [Upload] を選択します。

    
            [関数コード] セクションで [アップロード] が強調表示されています。
  3. optimizedImageClassification.zip デプロイパッケージを選択します。

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

 

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

注記

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

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

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

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

    
            [アクション] メニューの [エイリアスの作成] オプション。
  4. [新しいエイリアスの作成] ページで、以下の値を使用します。

    • [名前] に「mlTestOpt」と入力します。

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

    注記

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

  5. [作成] を選択します。

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

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

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

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

  1. [Add a Lambda to your Greengrass Group (Greengrass グループへの Lambda の追加)] ページで、[Use existing Lambda] を選択します。

    
            [Add a Lambda to your Greengrass Group (Greengrass グループへの Lambda の追加)] ページで [Use existing Lambda (既存の Lambda の使用)] が強調表示されています。
  2. [optimizedImageClassification]、[Next] の順に選択します。

  3. [Lambda バージョンの選択] ページで、[Alias:mlTestOpt]、[Finish] の順に選択します。

 

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

  1. [Lambda] ページで、optimizedImageClassification Lambda 関数を選択します。

    
            [Lambda] ページで optimizedImageClassification Lambda 関数が強調表示されている。
  2. [optimizedImageClassification] 設定ページで、[Edit (編集)] を選択します。

  3. [グループ固有の Lambda 設定] ページで、以下の値を使用します。

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

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

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

    • [/sys ディレクトリへの読み込みアクセス] で、[Enable (有効化)] を選択します。

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

  4. Update を選択します。

ステップ 5: Amazon SageMaker Neo 最適化モデルリソースを Greengrass グループに追加する

このステップでは、最適化された ML 推論モデルのリソースを作成して Amazon S3 バケットにアップロードします。次に、アップロードした Amazon S3 バケットを AWS IoT Greengrass コンソールで見つけ、新しく作成したリソースを Lambda 関数に関連付けます。これにより、関数が Core デバイス上のリソースにアクセスできるようになります。

  1. コンピュータで、先ほど解凍した Neo 深層学習ランタイム インストーラパッケージに移動します。resnet50 ディレクトリに移動します。

    cd path-to-downloaded-runtime/dlr-1.0-py2-armv7l/models/resnet50

    このディレクトリには、Resnet-50 でトレーニングされたイメージ分類モデルのプリコンパイルされたモデルアーティファクトが含まれています。resnet50 ディレクトリ内のファイルを圧縮して、resnet50.zip を作成します。

    zip -r resnet50.zip .
  2. AWS IoT Greengrass グループのグループ設定ページで、[Resources (リソース)] を選択します。[Machine Learning (機械学習)] セクションに移動し、[機械学習リソースの追加] を選択します。[機械学習リソースの作成] ページで、[リソース名] に「resnet50_model」と入力します。

    
            プロパティが更新された [機会学習モデルの追加] ページ
  3. [モデルソース] で、[S3 のモデルをアップロード] を選択します。

  4. [S3 のモデル] で、[Select (選択)] を選択します。

    注記

    現在のところ、最適化された Amazon SageMaker モデルは自動的に Amazon S3 に保存されます。このオプションを使用して、Amazon S3 バケット内の最適化されたモデルを見つけることができます。Amazon SageMaker におけるモデルの最適化の詳細については、Amazon SageMaker Neo のドキュメントを参照してください。

  5. [モデルをアップロードする] を選択します。

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

    注記

    バケット名には文字列 greengrass が含まれている必要があります。一意の名前 (greengrass-dlr-bucket-user-id-epoch-time など) を選択します。バケット名にピリオド (.) を使用しないでください。

  7. AWS IoT Greengrass コンソールタブで、Amazon S3 バケットを見つけて選択します。アップロードした resnet50.zip ファイルを見つけ、[Select (選択)] を選択します。必要に応じてページを更新し、使用可能なバケットとファイルのリストを更新します。

  8. [ローカルパス] に「/ml_model」と入力します。

    
            更新されたローカルパス。

    これは、Lambda ランタイム名前空間内のローカルモデルのターゲットです。グループをデプロイすると、AWS IoT Greengrass によってソースモデルパッケージが取得され、指定したディレクトリにその内容が抽出されます。

    注記

    ローカルパスに指定されている正確なパスを使用することを強くお勧めします。このステップで別のローカルモデルのターゲットパスを使用すると、このチュートリアルで示しているいくつかのトラブルシューティングコマンドが正確でなくなります。別のパスを使用する場合は、ここで指定する正確なパスを MODEL_PATH 環境変数に設定する必要があります。環境変数については、「AWS Lambda 環境変数」を参照してください。

  9. [Lambda function affiliations] (Lambda 関数の所属) で、[選択] を選択します。

  10. [optimizedImageClassification]、[読み取り専用アクセス]、[Done (完了)] の順に選択します。

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

ステップ 6: Greengrass グループにカメラデバイスリソースを追加する

このステップでは、カメラモジュールのリソースを作成し、Lambda 関数に関連付けて、AWS IoT Greengrass コア でそのリソースにアクセスできるようにします。

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

    
            [Resources (リソース)] が強調表示されたグループの設定ページ
  2. [ローカル] タブで、[ローカルリソースの追加] を選択します。

  3. [ローカルリソースの作成] ページで、以下の値を使用します。

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

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

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

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

    • [グループ所有者のファイルアクセス許可] で、[リソースを所有する Linux グループの OS グループアクセス許可を自動的に追加] を選択します。

      [グループ所有者のファイルアクセス許可] オプションを使用すると、Lambda プロセスに追加のファイルアクセス許可を付与できます。詳細については、「グループ所有者のファイルアクセス権限」を参照してください。

    
            リソースプロパティが編集された [ローカルリソースの作成] ページ。
  4. [Lambda function affiliations] (Lambda 関数の所属) で、[選択] を選択します。

  5. [optimizedImageClassification]、[読み取りと書き込みアクセス]、[Done (完了)] の順に選択します。

    
            [完了] が強調表示された Lambda 関数の所属プロパティ

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

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

  7. [ローカルリソースの作成] ページで、以下の値を使用します。

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

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

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

    • [グループ所有者のファイルアクセス許可] で、[リソースを所有する Linux グループの OS グループアクセス許可を自動的に追加] を選択します。

    
            リソースプロパティが編集された [ローカルリソースの作成] ページ。
  8. [Lambda function affiliations] (Lambda 関数の所属) で、[選択] を選択します。

  9. [optimizedImageClassification]、[読み取りと書き込みアクセス]、[Done (完了)] の順に選択します。

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

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

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

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

    
            [Subscriptions] と [Add Subscription] が強調表示されたグループページ。
  2. [ソースとターゲットの選択] ページで、ソースおよびターゲットを次のように設定します。

    1. [ソースの選択] セクションで、[Lambda]、[optimizedImageClassification] の順に選択します。

    2. [Select a target] (ターゲットの選択) で、[サービス]、[IoT Cloud] (IoT クラウド) の順に選択します。

    3. Next を選択します。

      
                [ソースとターゲットの選択] ページで [次へ] が強調表示されています。
  3. [トピックでデータをフィルタリングする] ページで、[オプションのトピックフィルター] に「/resnet-50/predictions」と入力し、[Next] を選択します。

    
            [次へ] が強調表示された [Filter your data with a topic (トピックによるデータのフィルタリング)] ページ
  4. Finish を選択します。

  5. 2 つ目のサブスクリプションを追加します。[ソースとターゲットの選択] ページで、ソースおよびターゲットを次のように設定します。

    1. [Select a source] で、[Services] を選択してから [IoT Cloud] を選択します。

    2. [ターゲットの選択] で [Lambda]、[optimizedImageClassification] の順に選択します。

    3. [Next] を選択します。

  6. [トピックでデータをフィルタリングする] ページで、[オプションのトピックフィルター] に「/resnet-50/test」と入力し、[Next] を選択します。

  7. [Finish] を選択します。

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

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

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

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

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

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

    2. デーモンを開始するには:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. グループの設定ページで、[デプロイ] を選択してから、[Actions] (アクション) メニューの [デプロイ] を選択します。

    
            [デプロイ] と [デプロイ] が強調表示されたグループの設定ページ。
  3. [Configure how devices discover your core] ページで、[Automatic detection] を選択します。

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

    
            [Configure how devices discover your core] ページで [Automatic detection] が強調表示されています。

    注記

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

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

    
            正常なデプロイのステータスが強調表示された [デプロイ] ページ。

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

推論例をテストする

これで、デプロイが正しく設定されているかどうかを確認できます。テストするには、/resnet-50/predictions トピックにサブスクライブし、/resnet-50/test トピックにメッセージを発行します。これにより、Raspberry Pi で写真を撮影してキャプチャしたイメージの推論を実行する Lambda 関数がトリガーされます。

注記

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

  1. AWS IoT コンソール ホーム ページで、[テスト] を選択します。

    
            AWS IoT コンソール のナビゲーションペインで [テスト] が強調表示されている。
  2. [サブスクリプション] で、[Subscribe to a Topic] を選択します。以下の値を使用します。残りのオプションはデフォルトのままにします。

    • [トピックのサブスクリプション] に「/resnet-50/predictions」と入力します

    • [MQTT ペイロード表示] で、[ペイロードを文字列として表示] を選択します。

  3. [Subscribe to topic] を選択します。

  4. /resnet-50/predictions ページで、発行先の /resnet-50/test トピックを指定します。[Publish to topic] を選択します。

  5. テストが成功すると、発行されたメッセージによって Raspberry Pi カメラがイメージをキャプチャします。Lambda 関数からのメッセージがページの下部に表示されます。このメッセージには、予測クラス名、確率、最大メモリ使用量の形式で、イメージの予測結果が含まれています。

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

インテル Atom の設定

このチュートリアルをインテル Atom デバイスで実行するには、ソースイメージを指定して Lambda 関数を設定します。GPU を推論に使用するには、OpenCL バージョン 1.0 以降がデバイスにインストールされている必要があります。ローカルデバイスリソースも追加する必要があります。

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

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

    注記

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

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

    1. [メモリ制限] の値を 3000 MB に増やします。

    2. [タイムアウト] の値を 2 分に増やします。これにより、リクエストの早過ぎるタイムアウトがなくなります。セットアップ後、推論の実行には数分かかります。

    3. [/sys ディレクトリへの読み込みアクセス] の [Enable] を選択します。

    4. [Lambda のライフサイクル] で、[Make this function long-lived and keep it running indefinitely] を選択します。

  3. 必要なローカルデバイスリソースを追加します。

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

      
                [Resources (リソース)] が強調表示されたグループの設定ページ
    2. [ローカル] タブで、[ローカルリソースの追加] を選択します。

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

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

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

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

      • [グループ所有者のファイルアクセス許可] で、[リソースを所有する Linux グループの OS グループアクセス許可を自動的に追加] を選択します。

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

NVIDIA Jetson TX2 の設定

NVIDIA Jetson TX2 でこのチュートリアルを実行するには、ソースイメージを用意して、Lambda 関数を設定します。GPU を推論に使用するには、Jetpack 3.3 でボードのイメージを作成するときに、デバイスに CUDA 9.0 と cuDNN 7.0 をインストールする必要があります。ローカルデバイスリソースも追加する必要があります。

AWS IoT Greengrass ソフトウェアをインストールできるように Jetsonを設定する方法については、「他のデバイスの設定」を参照してください。

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

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

    注記

    代わりに、Jetson ボードにカメラを設置して、ソースイメージをキャプチャすることもできます。ただし、最初に静的イメージから開始することを強くお勧めします。

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

    1. [メモリ制限] の値を増やします。指定されたモデルを GPU モードで使用するには、2048 MB を使用します。

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

    3. [Lambda のライフサイクル] で、[Make this function long-lived and keep it running indefinitely] を選択します。

    4. [/sys ディレクトリへの読み込みアクセス] の [Enable] を選択します。

  3. 必要なローカルデバイスリソースを追加します。

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

      
                [Resources (リソース)] が強調表示されたグループの設定ページ
    2. [ローカル] タブで、[ローカルリソースの追加] を選択します。

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

      • [リソース名] と [デバイスパス] には、次の表の値を使用します。テーブルの行ごとに 1 つのデバイスリソースを作成します。

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

      • [グループ所有者のファイルアクセス許可] で、[リソースを所有する Linux グループの OS グループアクセス許可を自動的に追加] を選択します。

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

         

        名前

        デバイスパス

        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

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

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

エラーログを確認する

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

    sudo su cd /greengrass/ggc/var/log
  2. runtime.log でエラーがないかどうかを確認します。

    cat system/runtime.log | grep 'ERROR'

    ユーザー定義の Lambda 関数ログでもエラーがないかどうかを確認できます。

    cat user/your-region/your-account-id/lambda-function-name.log | grep 'ERROR'

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

 

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

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

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

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

 

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

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

    ps aux | grep lambda-function-name

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

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

    注記

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

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

    注記

    ML リソースのパスが ml_model 以外の場合は、ここで置き換えてください。

    cd /ml_model ls -ls

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

    56 -rw-r--r-- 1 ggc_user ggc_group 56703 Oct 29 20:07 model.json 196152 -rw-r--r-- 1 ggc_user ggc_group 200855043 Oct 29 20:08 model.params 256 -rw-r--r-- 1 ggc_user ggc_group 261848 Oct 29 20:07 model.so 32 -rw-r--r-- 1 ggc_user ggc_group 30564 Oct 29 20:08 synset.txt

Lambda 関数で /dev/dri/renderD128 が見つからない

このエラーは、OpenCL から必要な GPU デバイスに接続できない場合に発生します。Lambda 関数に必要なデバイスでデバイスリソースを作成する必要があります。

次のステップ

次は、最適化された他のモデルを試します。詳細については、Amazon SageMaker Neo のドキュメントを参照してください。