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

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

CreateAmazon IoT GreengrassV2 组件

Amazon IoT Greengrass使用组件,该软件模块部署到Amazon IoT Greengrass核心设备。您将需要(至少)三个组件:

  1. 公共边缘管理器代理Amazon IoT Greengrass组件。

  2. 将机器学习模型打包时自动生成的模型组件Amazon SDK for Python (Boto3)API 或使用 SageMaker 控制台进行操作。

  3. 推理应用程序的私有自定义组件。

边缘管理器代理Amazon IoT Greengrass组件 (1) 部署边缘管理器代理二进制文件。

创建边封装作业时,模型元件 (2) 将自动生成Amazon SDK for Python (Boto3)API 或 SageMaker 控制台。有关如何生成模型元件的信息,请参阅自动生成的组件.

私有自定义组件 (3) 是用于实现 Edge Manager Agent 客户端应用程序以及对推断结果进行任何预处理和后处理的应用程序。有关如何创建自定义组件的详细信息,请参阅自动生成的组件或者创建自定义Amazon IoT Greengrass组件.

自动生成的组件

生成模型组件,并使用CreateEdgePackagingJobAPI 并指定GreengrassV2Component查看 SageMaker 边缘管理器打包作业 API 字段PresetDeploymentType. 当您调用CreateEdgePackagingJobAPI 中,边缘管理器会在 Amazon S3 中获取您的 SageMaker NEO 编译模型并创建模型组件。模型组件将自动存储在您的账户中。您可以查看任何组件,方法是导航到Amazon IoT控制台https://console.aws.amazon.com/iot/. SelectGreengrass,然后选择核心实例设备。页面有一个Amazon IoT Greengrass与您的帐户关联的核心设备。如果模型元件名称未在PresetDeploymentConfig,则生成的默认名称由"SagemakerEdgeManager"和 SageMaker 边缘管理器打包作业的名称。以下示例演示如何指定 Edge Manager 以创建Amazon IoT GreengrassV2 组件与CreateEdgePackagingJobAPI。

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 控制台创建自动生成的组件。按照中的步骤 1-6 操作包装模型(Amazon SageMaker 控制台)

输入 Amazon S3 存储桶 URI,以便存储打包作业输出和可选加密密钥。

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

  1. 选择预设部署.

  2. 为指定组件名称组件名称字段中返回的子位置类型。

  3. (可选)提供组件、组件版本、平台操作系统或组件说明组件版本平台操作系统, 和平台架构,分别。

  4. 选择 Submit

创建 Hello World 自定义组件

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

要使用 GRPC,您必须:

  1. 使用从 Amazon S3 发行存储桶下载边缘管理器代理时提供的 .proto 文件创建 GRPC 存根。

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

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

在您的主机上安装 GRPC 和其他必要的工具,并创建 GRPC 存根agent_pb2_grpc.pyagent_pb2.pyPython 中返回的值。确保您已获得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 服务定义 (2) 生成 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组件(如果您使用相同的客户端代码示例)。

您可以创建Amazon IoT GreengrassV2 Hello World 组件一旦你已经生成了你的 GRPC 存根,并且你已经准备好了你的 Hello World 代码。为此,请执行以下操作:

  • 上传您的edge_manager_python_example.pyagent_pb2_grpc.py, 和agent_pb2.py添加到您的 Amazon S3 存储桶,并记下他们的 Amazon S3 路径。

  • 在创建私有组件Amazon IoT GreengrassV2 控制台并定义组件的配方。在以下配方中指定 Amazon S3 URI 到您的 “你好世界” 应用程序和 GRPC 存根。

    --- 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文档中)。