最適化された機械学習推論を 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 以降を使用している必要があります。

SageMaker Neo 深層学習コンパイラを使用して、Tensorflow、Apache MXNet、PyTorch、ONNX、および XGBoost フレームワークのネイティブ機械学習推論モデルの予測効率を最適化し、フットプリントを小さくし、パフォーマンスを向上させることができます。その後、最適化されたモデルをダウンロードし、SageMaker Neo 深層学習ランタイムをインストールし、それらを AWS IoT Greengrass デバイスにデプロイして、推論速度を上げることができます。

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

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

前提条件

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

  • 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 などの他のプラットフォームをサポートしています。Intel Atom の例を使用する場合は、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: Amazon SageMaker Neo 深層学習ランタイムをインストールする

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

注記

このチュートリアルでは、バージョン 1.1.0 をインストールすることをお勧めします。

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

    ssh pi@your-device-ip-address
  2. DLR のドキュメントを開き、DLR のインストールを開き、Raspberry Pi デバイスのホイール URL を見つけます。次に、指示に従って、デバイスに DLR をインストールします。例えば、pip を使用できます。

    pip3 install rasp3b-wheel-url
  3. DLR をインストールした後、次の設定を検証します。

    • ggc_user システムアカウントが DLR ライブラリを使用できることを確認します。

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

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

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

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

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

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

    cd path-to-downloaded-sample tar -xvzf dlr-py3-armv7l.tar.gz

    抽出されたサンプルパッケージの examples ディレクトリには、関数コードと依存関係が含まれています。

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

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

      注記

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

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

    cd path-to-downloaded-sample/dlr-py3-armv7l/examples zip -r optimizedImageClassification.zip .

    デプロイメントパッケージには、関数コードと依存関係が含まれています。これには、Neo 深層学習ランタイム Python API を呼び出して、Neo 深層学習コンパイラモデルで推論を実行するコードが含まれます。

    注記

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

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

    [Lambda console](Lambda コンソール) ページから、[Functions] (関数)、[Create function] (関数の作成) の順に選択します。

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

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

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

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

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

 

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

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

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

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

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

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

    [Save] を選択します。

    [Upload] (アップロード) が強調表示された [Runtime settings] (ランタイム設定) セクション。

 

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

注記

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

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

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

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

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

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

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

    注記

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

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

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

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

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

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

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

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

  3. [Lambda function] (Lambda 関数) と[optimizedImageClassification]を選択します。

  4. [Lambda function version] (Lambda 関数のバージョン) で、公開したバージョンのエイリアスを選択します。

 

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

  1. [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 関数のライフサイクル設定」を参照してください。

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

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

      注記

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

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

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

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

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

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

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

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

  2. [Add Lambda function] (Lambda 関数の追加) を選択します。

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

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

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

    注記

    NVIDIA Jetson の例を使用する場合は、代わりにサンプルパッケージの resnet18 ディレクトリを使用する必要があります。詳細については、「NVIDIA Jetson TX2 の設定」を参照してください。

    cd path-to-downloaded-sample/dlr-py3-armv7l/models/resnet50

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

  2. resnet50 ディレクトリ内のファイルを resnet50.zip という名前のファイルに圧縮します。

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

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

  5. [S3 URI]から、選択 [Browse S3] (S3 の閲覧) を選択します。

    注記

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

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

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

    注記

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

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

  9. [Destination path] (送信先) に「/ml_model」と入力します。

    更新された送信先。

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

    注記

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

  10. コンテナ化モードで実行している場合:

    1. [System group owner and file access permissions] (システムグループ所有者のファイルアクセス許可) から、[Specify system group and permissions] (システムグループと権限を指定する) を選択します。

    2. [Read-only access] (読み取り専用アクセス)、[Add resources] (リソースの追加) の順に選択します。

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

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

注記

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

  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] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

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

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

  5. [Resources] (リソース) タブから、[Add] (追加) を選択して、別のローカルリソースを作成し、次の値を使用します。

    • [リソース名] に 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] (リソースを所有するシステムグループのファイルシステム権限を自動的に追加する) を選択します。

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

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

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

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

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

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

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

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

  3. 2 つ目のサブスクリプションを追加します。[Subscriptions] (サブスクリプション) タブ、[Add subscription] (サブスクリプションの追加) の順に選択し、ソースとターゲットを次のように設定します。

    1. [Source type] (ソースタイプ) で、[Service] (サービス)、[IoT Cloud] (IoT クラウド) の順に選択します。

    2. [Target type] (ターゲットタイプ) で、[Lambda function] (Lambda 関数)、[optimizedImageClassification] の順に選択します。

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

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

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

  1. AWS IoT Greengrass Core が実行されていることを確認します。必要に応じて、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. グループ設定ページで、[Deploy] (デプロイ) を選択します。

  3. [Lambda functions] (Lambda 関数) タブで、[IP detector] (IP ディテクター)と [Edit] (編集) を選択します。

  4. [Edit IP detector settings] (IP ディテクター設定の編集) のダイアログボックスで、[Automatically detect and override MQTT broker endpoints] (MQTT ブローカーのエンドポイントを自動的に検出して上書きする) と、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 のトラブルシューティング を参照してください。

推論例をテストする

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

注記

NVIDIA Jetson の例を使用する場合は、代わりに resnet-18/predictions トピックおよび resnet-18/test トピックを使用してください。

注記

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

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

  2. [Subscriptions] (サブスクリプション) で、[Subscribe to a Topic] (トピックへのサブスクライブ) を選択します。以下の値を使用します。残りのオプションはデフォルトのままにします。

    • [Subscription topic (サブスクリプショントピック)] で、/resnet-50/predictions と入力します。

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

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

  4. [Publish to a topic] (トピックに公開) を選択して、[Topic name] (トピック名) として「/resnet-50/test」を入力し、[Publish] (発行) を選択します。

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

インテル Atom の設定

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

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

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

    注記

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

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

  2. Lambda 関数の設定を編集します。「ステップ 4: 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 関数のコンテナ化を選択する場合の考慮事項」を参照してください。

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

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

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

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

      注記

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

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

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

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

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

  3. Neo 最適化モデルリソースをグループに追加します。ステップ 3: 推論 Lambda 関数を作成する で解凍したサンプルパッケージの resnet50 ディレクトリにモデルリソースをアップロードします。このディレクトリには、Resnet-50 でトレーニングされたイメージ分類モデルのプリコンパイルされたモデルアーティファクトが含まれています。次の更新で、ステップ 5: SageMaker Neo 最適化モデルリソースを Greengrass グループに追加する の手順に従います。

    • resnet50 ディレクトリ内のファイルを resnet50.zip という名前のファイルに圧縮します。

    • [Create a machine learning resource (機械学習リソースの作成)] ページで、[Resource name (リソース名)] にresnet50_model と入力します。

    • resnet50.zip ファイルをアップロードします。

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

    注記

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

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

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

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

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

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

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

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

NVIDIA Jetson TX2 の設定

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

  1. AWS IoT Greengrass Core ソフトウェアをインストールし、GPU を推論に使用できるように、Jetson デバイスが設定されていることを確認します。デバイスの設定の詳細については、「他のデバイスの設定」を参照してください。NVIDIA Jetson TX2 で推論に GPU を使用するには、Jetpack 4.3 でボードのイメージを作成するときに、デバイスに CUDA 10.0 と cuDNN 7.0 をインストールする必要があります。

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

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

    注記

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

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

    注記

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

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

      • [Run as] (として実行) に、「Another user ID/group ID」を選択します。[UID] に、「0」と入力します。[GUID] に、「0」と入力します。

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

        ヒント

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

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

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

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

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

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

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

      注記

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

      • [メモリ制限] の値を増やします。指定されたモデルを GPU モードで使用するには、少なくとも 2000 MB を使用します。

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

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

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

  4. Neo 最適化モデルリソースをグループに追加します。ステップ 3: 推論 Lambda 関数を作成する で解凍したサンプルパッケージの resnet18 ディレクトリにモデルリソースをアップロードします。このディレクトリには、Resnet-18 でトレーニングされたイメージ分類モデルのプリコンパイル済みのモデルアーティファクトが含まれています。次の更新で、ステップ 5: SageMaker Neo 最適化モデルリソースを Greengrass グループに追加する の手順に従います。

    • resnet18 ディレクトリ内のファイルを resnet18.zip という名前のファイルに圧縮します。

    • [Create a machine learning resource (機械学習リソースの作成)] ページで、[Resource name (リソース名)] にresnet18_model と入力します。

    • resnet18.zip ファイルをアップロードします。

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

    注記

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

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

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

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

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

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

      • [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

  6. コンテナ化モードで実行している場合で、次のローカルボリュームリソースを追加して、デバイスカメラへのアクセスを許可します。「ステップ 5: SageMaker Neo 最適化モデルリソースを 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

  7. 正しいディレクトリを使用するようにグループサブスクリプションを更新します。次の更新で、ステップ 7: サブスクリプションを Greengrass グループに追加する の手順に従います。

    • 最初のトピックフィルタには、/resnet-18/predictions と入力します。

    • 2 番目のトピックフィルタには、/resnet-18/test と入力します。

  8. 正しいディレクトリを使用するようにテストサブスクリプションを更新します。次の更新で、推論例をテストする の手順に従います。

    • [Subscriptions] (サブスクリプション) で、[Subscribe to a Topic] (トピックへのサブスクライブ) を選択します。[Subscription topic (サブスクリプショントピック)] で、/resnet-18/predictions と入力します。

    • /resnet-18/predictions ページで、発行先の /resnet-18/test トピックを指定します。

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

テストに成功しなかった場合は、以下のトラブルシューティング手順を実行できます。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 ランタイム名前空間にあるため、通常の Linux 名前空間には表示されません。

    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 関数に必要なデバイスでデバイスリソースを作成する必要があります。

次のステップ

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