创建 Amazon IoT Greengrass V2 组件 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建 Amazon IoT Greengrass V2 组件

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

  1. 一个公有 Edge Manager 代理 Amazon IoT Greengrass 组件,用于部署 Edge Manager 代理二进制文件。

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

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

创建自动生成的组件

使用 CreateEdgePackagingJob API 生成模型组件,然后在 SageMaker Edge Manager 打包作业 API 字段 PresetDeploymentType 中指定 GreengrassV2Component。当您调用 CreateEdgePackagingJob API 时,Edge Manager 会在 Amazon S3 中使用经过 SageMaker NEO 编译的模型,并创建一个模型组件。此模型组件会自动存储在您的账户中。您可以通过导航到 Amazon IoT 控制台(网址为 https://console.aws.amazon.com/iot/)来查看您的任何组件。选择 Greengrass,然后选择核心设备。该页面包含与您账户关联的 Amazon IoT Greengrass 核心设备列表。如果未在 PresetDeploymentConfig 中指定模型组件名称,则会生成默认名称,其中包含 "SagemakerEdgeManager" 和您的 Edge Manager 代理打包作业的名称。以下示例演示如何指定 Edge Manager 使用 CreateEdgePackagingJob API 创建 Amazon 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 = 'edge-manager-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 控制台创建自动生成的组件。按照 打包模型(Amazon SageMaker 控制台) 中的步骤 1 到 6 进行操作。

输入您希望用来存储打包作业的输出的 Amazon S3 存储桶 URI 和可选的加密密钥。

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

  1. 选择预设部署

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

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

  4. 选择提交

创建 Hello World 自定义组件

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

要使用 gRPC,您必须:

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

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

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

在主机上安装 gRPC 和其他必要的工具,并使用 Python 创建 gRPC 存根 agent_pb2_grpc.pyagent_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()

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

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

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

  • 在 Amazon 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 配方的详细信息,请参阅 Amazon IoT Greengrass 文档中的创建您的第一个组件