

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

# AWS IoT Greengrass V2 コンポーネントを作成する
<a name="edge-greengrass-custom-component"></a>

AWS IoT Greengrass は、 AWS IoT Greengrass コアデバイスにデプロイされ、実行されるソフトウェアモジュールである*コンポーネント*を使用します。少なくとも 3 つ のコンポーネントが必要です。

1. *Edge Manager エージェントバイナリをデプロイするパブリック Edge Manager エージェント AWS IoT Greengrass コンポーネント*。

1.  AWS SDK for Python (Boto3) API *または SageMaker AI コンソールを使用して機械学習モデルをパッケージ化するときに自動生成されるモデルコンポーネント*。 SageMaker 詳細については、「[自動生成コンポーネントを作成する](#edge-greengrass-autogenerate-component-how)」を参照してください。

1. **非公開カスタムコンポーネント。Edge Manager エージェントのクライアントアプリケーションを実装し、推論結果の前処理と後処理を実行します。カスタムコンポーネントの作成方法の詳細については、[自動生成コンポーネントを作成する](#edge-greengrass-autogenerate-component-how)「」または[「カスタム AWS IoT Greengrass コンポーネントの作成](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html)」を参照してください。

## 自動生成コンポーネントを作成する
<a name="edge-greengrass-autogenerate-component-how"></a>

[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html) API を使用してモデルコンポーネントを生成し、SageMaker Edge Manager パッケージ化ジョブ API の [`PresetDeploymentType`] フィールドに `GreengrassV2Component` を指定します。`CreateEdgePackagingJob` API を呼び出すと、Edge Manager は Amazon S3 にある SageMaker AI Neo コンパイル済みのモデルを取得し、モデルコンポーネントを作成します。このモデルコンポーネントはお使いのアカウントに自動的に保存されます。 AWS IoT コンソール [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) に移動することで、任意のコンポーネントを表示できます。**[Greengrass]** を選択し、次に **[Core]** (コア) デバイスを選択します。このページには、アカウントに関連付けられた AWS IoT Greengrass コアデバイスのリストがあります。モデルコンポーネント名が `PresetDeploymentConfig` で指定されていない場合、生成されるデフォルト名は `"SagemakerEdgeManager"` と Edge Manager エージェントのパッケージ化ジョブの名前から構成されます。次の例は、 Edge Manager に を指定して `CreateEdgePackagingJob` API で AWS IoT Greengrass V2 コンポーネントを作成する方法を示しています。

```
import sagemaker
import boto3

# Create a SageMaker client object to make it easier to interact with other AWS services.
sagemaker_client = boto3.client('sagemaker', region=<YOUR_REGION>)

# Replace with your IAM Role ARN
sagemaker_role_arn = "arn:aws:iam::<account>:role/*"

# Replace string with the name of your already created S3 bucket.
bucket = 'amzn-s3-demo-bucket-edge-manager'

# Specify a name for your edge packaging job.
edge_packaging_name = "edge_packag_job_demo" 

# Replace the following string with the name you used for the SageMaker Neo compilation job.
compilation_job_name = "getting-started-demo" 

# The name of the model and the model version.
model_name = "sample-model" 
model_version = "1.1"

# Output directory in S3 where you want to store the packaged model.
packaging_output_dir = 'packaged_models' 
packaging_s3_output = 's3://{}/{}'.format(bucket, packaging_output_dir)

# The name you want your Greengrass component to have.
component_name = "SagemakerEdgeManager" + edge_packaging_name

sagemaker_client.create_edge_packaging_job(
                    EdgePackagingJobName=edge_packaging_name,
                    CompilationJobName=compilation_job_name,
                    RoleArn=sagemaker_role_arn,
                    ModelName=model_name,
                    ModelVersion=model_version,
                    OutputConfig={
                        "S3OutputLocation": packaging_s3_output,
                        "PresetDeploymentType":"GreengrassV2Component",
                        "PresetDeploymentConfig":"{\"ComponentName\":\"sample-component-name\", \"ComponentVersion\":\"1.0.2\"}"
                        }
                    )
```

また、SageMaker AI コンソールを使用すると、自動生成されたコンポーネントを作成できます。[モデルをパッケージ化する (Amazon SageMaker AI コンソール)](edge-packaging-job-console.md) の手順 1 ～ 6 に従います。

パッケージ化ジョブの出力を保存する Amazon S3 バケット URI を入力します。任意で、暗号化キーも入力できます。

以下を実行して、モデルコンポーネントを作成します。

1. **[Preset deployment]** (デプロイの事前設定) を選択します。

1. **[Component name]** (コンポーネント名) フィールドにコンポーネントの名前を指定します。

1. 任意で、コンポーネントの説明、コンポーネントのバージョン、プラットフォーム OS、またはプラットフォームアーキテクチャを、それぞれ **[Component description]** (コンポーネントの説明)、**[Component version]** (コンポーネントバージョン)、**[Platform OS]** (プラットフォーム OS)、**[Platform architecture]** (プラットフォームアーキテクチャ) に指定できます。

1. [**Submit**] を選択してください。

## Hello World カスタムコンポーネントを作成する
<a name="edge-greengrass-create-custom-component-how"></a>

エッジデバイスでの推論の実行には、カスタムアプリケーションコンポーネントが使用されます。このコンポーネントは、SageMaker Edge Manager にモデルをロードし、推論実行のために Edge Manager エージェントを呼び出し、コンポーネントのシャットダウン時にモデルをアンロードします。コンポーネントを作成する前に、エージェントとアプリケーションが Edge Manager と通信できることを確認します。これを行うには、[gRPC](https://grpc.io/) を設定します。Edge Manager エージェントは、Protobuf Buffers および gRPC サーバーで定義されたメソッドを使用して、エッジデバイス上のクライアントアプリケーションとクラウドの通信を確立します。

gRPC を使用するには、以下を行う必要があります。

1. Amazon S3 リリースバケットから Edge Manager エージェントをダウンロードするときに提供される .proto ファイルを使用して gRPC スタブを作成する。

1. 任意の言語でクライアントコードを記述する。

.proto ファイルではサービスを定義する必要はありません。サービスの .proto ファイルは、Amazon S3 リリースバケットから Edge Manager エージェントのリリースバイナリファイルをダウンロードすると、圧縮された tar ファイルが含まれています。

gRPC などの必要なツールをホストマシンにインストールし、Python で gRPC スタブ `agent_pb2_grpc.py` と `agent_pb2.py` を作成します。`agent.proto` がローカルディレクトリにあることを確認します。

```
%%bash
pip install grpcio
pip install grpcio-tools
python3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. agent.proto
```

上のコードは、.proto サービス定義から gRPC クライアントおよびサーバーインターフェイスを生成します。つまり、Python で gRPC モデルを作成します。API ディレクトリには、エージェントと通信するための Protobuf 仕様があります。

次に、gRPC API を使用して、サービス用のクライアントとサーバーを作成します (2)。次のスクリプトのサンプル `edge_manager_python_example.py` では、Python を使用して、エッジデバイスで `yolov3` モデルをロード、リスト、アンロードします。

```
import grpc
from PIL import Image
import agent_pb2
import agent_pb2_grpc
import os


model_path = '<PATH-TO-SagemakerEdgeManager-COMPONENT>' 
                    
agent_socket = 'unix:///tmp/aws.greengrass.SageMakerEdgeManager.sock'

agent_channel = grpc.insecure_channel(agent_socket, options=(('grpc.enable_http_proxy', 0),))

agent_client = agent_pb2_grpc.AgentStub(agent_channel)


def list_models():
    return agent_client.ListModels(agent_pb2.ListModelsRequest())


def list_model_tensors(models):
    return {
        model.name: {
            'inputs': model.input_tensor_metadatas,
            'outputs': model.output_tensor_metadatas
        }
        for model in list_models().models
    }


def load_model(model_name, model_path):
    load_request = agent_pb2.LoadModelRequest()
    load_request.url = model_path
    load_request.name = model_name
    return agent_client.LoadModel(load_request)


def unload_model(name):
    unload_request = agent_pb2.UnLoadModelRequest()
    unload_request.name = name
    return agent_client.UnLoadModel(unload_request)


def predict_image(model_name, image_path):
    image_tensor = agent_pb2.Tensor()
    image_tensor.byte_data = Image.open(image_path).tobytes()
    image_tensor_metadata = list_model_tensors(list_models())[model_name]['inputs'][0]
    image_tensor.tensor_metadata.name = image_tensor_metadata.name
    image_tensor.tensor_metadata.data_type = image_tensor_metadata.data_type
    for shape in image_tensor_metadata.shape:
        image_tensor.tensor_metadata.shape.append(shape)
    predict_request = agent_pb2.PredictRequest()
    predict_request.name = model_name
    predict_request.tensors.append(image_tensor)
    predict_response = agent_client.Predict(predict_request)
    return predict_response

def main():
    try:
        unload_model('your-model')
    except:
        pass
  
    print('LoadModel...', end='')
    try:
        load_model('your-model', model_path)
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('Model already loaded!')
        
    print('ListModels...', end='')
    try:
        print(list_models())
        print('done.')
        
    except Exception as e:
        print()
        print(e)
        print('List model failed!')
       
    print('Unload model...', end='')
    try:
        unload_model('your-model')
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('unload model failed!')

if __name__ == '__main__':
    main()
```

同じクライアントコード例を使用する場合は、 がモデルを含む AWS IoT Greengrass コンポーネントの名前を`model_path`指していることを確認します。

gRPC スタブを生成し、Hello World コードの準備ができたら、 AWS IoT Greengrass V2 Hello World コンポーネントを作成できます。そのためには、次の操作を行います。
+ Amazon S3 バケットに `edge_manager_python_example.py`、`agent_pb2_grpc.py`、`agent_pb2.py` をアップロードし、Amazon S3 パスを書き留めます。
+  AWS IoT Greengrass V2 コンソールでプライベートコンポーネントを作成し、コンポーネントのレシピを定義します。次のレシピで、Hello World アプリケーションと gRPC スタブの Amazon S3 URI を指定します。

  ```
  ---
  RecipeFormatVersion: 2020-01-25
  ComponentName: com.sagemaker.edgePythonExample
  ComponentVersion: 1.0.0
  ComponentDescription: Sagemaker Edge Manager Python example
  ComponentPublisher: Amazon Web Services, Inc.
  ComponentDependencies:
    aws.greengrass.SageMakerEdgeManager:
      VersionRequirement: '>=1.0.0'
      DependencyType: HARD
  Manifests:
    - Platform:
        os: linux
        architecture: "/amd64|x86/"
      Lifecycle:
        install: |-
          apt-get install python3-pip
          pip3 install grpcio
          pip3 install grpcio-tools
          pip3 install protobuf
          pip3 install Pillow
        run:
          script: |- 
            python3 {artifacts:path}/edge_manager_python_example.py
      Artifacts:
        - URI: <code-s3-path>
        - URI: <pb2-s3-path>
        - URI: <pb2-grpc-s3-path>
  ```

Hello World レシピの作成の詳細については、 AWS IoT Greengrass ドキュメントの[「最初のコンポーネントを作成する](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#create-first-component)」を参照してください。