创建 AWS IoT Greengrass V2 组件 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建 AWS IoT Greengrass V2 组件

AWS IoT Greengrass 使用组件,即部署到核心设备并在 AWS IoT Greengrass 核心设备上运行的软件模块。您需要(至少)三个组件:

  1. 一个公共边缘管理器代理 AWS IoT Greengrass 组件,用于部署边缘管理器代理二进制文件。

  2. 一种模型组件,当您将机器学习模型与 AWS SDK for Python (Boto3) API或与 SageMaker 控制台打包时自动生成。有关信息,请参阅创建自动生成的组件

  3. 一个私有自定义组件,用于实施 Edge Manager 代理客户端应用程序,并对推理结果进行任何预处理和后处理。有关如何创建自定义组件的更多信息,请参阅创建自动生成的组件创建自定义 AWS IoT Greengrass 组件

创建自动生成的组件

使用生成模型组件,CreateEdgePackagingJobAPI并在 SageMaker Edge Manager 打包作业API字段中指定GreengrassV2ComponentPresetDeploymentType。当你调用时 CreateEdgePackagingJobAPI,Edge Manager 会在 Amazon S3 中使用你的 SageMaker NEO 编译模型并创建一个模型组件。此模型组件会自动存储在您的账户中。您可以通过导航到 AWS IoT 控制台https://console.aws.amazon.com/iot/来查看您的任何组件。选择 Greengrass,然后选择核心设备。该页面列出了与您的账户关联的 AWS IoT Greengrass 核心设备。如果未在 PresetDeploymentConfig 中指定模型组件名称,则会生成默认名称,其中包含 "SagemakerEdgeManager" 和您的 Edge Manager 代理打包作业的名称。以下示例演示如何向 Edge Manager 指定使用创建 AWS IoT Greengrass V2 组件。CreateEdgePackagingJob API

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 = 'edge-manager-amzn-s3-demo-bucket' # 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 控制台创建自动生成的组件。按照 Package a Model(亚马逊 SageMaker控制台) 中的步骤 1 到 6 进行操作。

输入要存储打包任务输出URI的 Amazon S3 存储桶和可选加密密钥。

完成以下操作以创建模型组件:

  1. 选择预设部署

  2. 组件名称字段中指定组件的名称。

  3. (可选)分别在组件描述组件版本平台 OS平台架构中提供组件、组件版本、平台 OS 和平台架构的描述。

  4. 选择提交

创建 Hello World 自定义组件

自定义应用程序组件用于在边缘设备上执行推理。该组件负责将模型加载到 SageMaker Edge Manager,调用 Edge Manager 代理进行推理,并在组件关闭时卸载模型。在创建组件之前,请确保代理和应用程序可以与 Edge Manager 进行通信。为此,请配置 g RPC。边缘管理器代理使用 Protobuf Buffers 和 g RPC 服务器中定义的方法与边缘设备和云上的客户端应用程序建立通信。

要使用 gRPC,您必须:

  1. 使用从 Amazon S3 发布存储桶下载 Edge Manager 代理时提供的.proto 文件创建 g RPC 存根。

  2. 用您喜欢的语言编写客户端代码。

不需要在 .proto 文件中定义服务。当您从 Amazon S3 发布存储桶下载 Edge Manager 代理版本二进制TAR文件时,服务.proto 文件将包含在压缩文件中。

在主机上安装 g RPC 和其他必需的工具,然后在 Python agent_pb2.py 中创建 g RPC 存根agent_pb2_grpc.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 服务定义生成 g RPC 客户端和服务器接口。换句话说,它在 Python 中创建 g RPC 模型。该API目录包含用于与代理通信的 Protobuf 规范。

接下来,使用 g RPC 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()

如果您使用相同的客户端代码示例,请确保model_path指向包含模型的 AWS IoT Greengrass 组件的名称。

生成了 g RPC 存根并准备好了 Hello World 代码后,你就可以创建 AWS IoT Greengrass V2 Hello World 组件了。为此,请执行以下操作:

  • 将您的 edge_manager_python_example.pyagent_pb2_grpc.pyagent_pb2.py 上传到您的 Amazon S3 存储桶,并记下它们的 Amazon S3 路径。

  • 在 AWS IoT Greengrass V2 控制台中创建私有组件并为您的组件定义配方。在以下配方中URI为你的 Hello World 应用程序和 g RPC 存根指定 Amazon S3。

    --- 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 文档中的创建第一个组件