自定义您的机器学习组件 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

自定义您的机器学习组件

在 AWS IoT Greengrass 案中,您可以配置示例机器学习组件来自定义在设备上执行机器学习推理的方式,将推断、模型和运行时组件作为构建模块。AWS IoT Greengrass 还让您可以灵活地将示例组件用作模板,并根据需要创建自己的自定义组件。您可以混合搭配这种模块化方法,通过以下方式自定义机器学习推理组件:

使用样本推断组件
  • 在部署推理组件时修改这些组件的配置。

  • 通过将示例模型存储组件替换为自定义模型组件,将自定义模型与示例推理组件一起使用。必须使用与示例模型相同的运行时对自定义模型进行训练。

使用自定义推理组件
  • 通过添加公共模型组件和运行时组件作为自定义推理组件的依赖关系,将自定义推理代码与示例模型和运行时结合使用。

  • 创建和添加自定义模型组件或运行时组件作为自定义推理组件的依赖关系。如果要使用自定义推理代码或 AWS IoT Greengrass 不提供示例组件的运行时,则必须使用自定义组件。

修改公有推理组件的配置

AWS IoT Greengrass 控制台时,组件页面将显示该组件的默认配置。例如,TensorFlow 精简版图像分类组件的默认配置如下所示:

{ "accessControl": { "aws.greengrass.ipc.mqttproxy": { "aws.greengrass.TensorFlowLiteImageClassification:mqttproxy:1": { "policyDescription": "Allows access to publish via topic ml/tflite/image-classification.", "operations": [ "aws.greengrass#PublishToIoTCore" ], "resources": [ "ml/tflite/image-classification" ] } } }, "PublishResultsOnTopic": "ml/tflite/image-classification", "ImageName": "cat.jpeg", "InferenceInterval": 3600, "ModelResourceKey": { "model": "TensorFlowLite-Mobilenet" } }

部署公共推理组件时,可以修改默认配置以自定义部署。有关每个公共推理组件的可用配置参数的信息,请参阅机器学习组件示例

本节介绍如何从 AWS IoT Greengrass 控制台部署修改后的组件。有关使用 AWS CLI 部署组件的信息,请参阅创建部署

部署修改后的公共推理组件(控制台)

  1. 登录到AWS IoT Greengrass 控制台

  2. 在导航菜单中,选择组件

  3. 在存储库的组件页面上显示公共组件选项卡上,选择要部署的组件。

  4. 在组件页面上,选择部署

  5. From添加到部署,选择下列操作之一:

    1. 要将此组件合并到目标设备上的现有部署,请选择添加到现有部署,然后选择要修改的部署。

    2. 要在目标设备上创建新部署,请选择创建新的部署。如果您的设备上有现有部署,则选择此步骤将替换现有部署。

  6. 在存储库的指定目标页面上,执行以下操作:

    1. UNDER部署信息,输入或修改部署的友好名称。

    2. UNDER部署目标,为您的部署选择一个目标,然后选择下一页。如果要修订现有部署,则无法更改部署目标。

  7. 在存储库的选择组件页面,在公共组件验证是否选择了具有已修改配置的推理组件,然后选择下一页

  8. 在存储库的配置组件页面上,执行以下操作:

    1. 选择推断组件,然后选择配置组件

    2. UNDER配置更新,输入要更新的配置值。例如,在要合并的配置框将推断间隔更改为 15 秒,并指示组件查找名为custom.jpg中的/custom-ml-inference/images/folder。

      { "InferenceInterval": "15", "ImageName": "custom.jpg", "ImageDirectory": "/custom-ml-inference/images/" }

      要将组件的整个配置重置为默认值,请指定一个空字符串""中的重置路径

    3. 选择确认,然后选择下一页

  9. 在存储库的配置高级设置页面上,保留默认配置设置,然后选择下一页

  10. 在存储库的审核页面上,选择部署

将自定义模型与样本推理组件一起使用

如果要将示例推理组件与您自己的机器学习模型一起使用,AWS IoT Greengrass 为其提供示例运行时组件的运行时,则必须使用将这些模型用作工件的组件覆盖公共模型组件。在高级别上,您可以完成以下步骤以将自定义模型与示例推理组件一起使用:

  1. 创建将 S3 存储桶中的自定义模型用作对象的模型组件。必须使用与要替换的模型相同的运行时对自定义模型进行训练。

  2. 修改ModelResourceKey配置参数以使用自定义模型。有关更新推理组件配置的信息,请参阅修改公有推理组件的配置

当您部署推理组件时,AWS IoT Greengrass 会查找其组件依赖关系的最新版本。如果相同的 AWS 账户和 AWS 区域中存在组件的更高自定义版本,则它将覆盖相关公共模型组件。

  1. 将模型上传到 S3 存储桶。有关将模型上传到 S3 存储桶的信息,请参阅使用 Amazon S3 存储桶中的Amazon Simple Storage Service 开发人员指南

    注意

    您必须将您的构件存储在与组件位于同一 AWS 账户和 AWS 区域中的 S3 存储桶中。为了使 AWS IoT Greengrass 能够访问这些工件,Greengrass 设备角色必须允许s3:GetObjectaction. 有关设备角色的更多信息,请参阅授权核心设备与 AWS 服务交互

  2. AWS IoT Greengrass 控制台导航菜单中,选择组件

  3. 检索公共模型存储组件的组件配方。

    1. 在存储库的组件页面上显示公共组件选项卡上,查找并选择要为其创建新版本的公有模型组件。例如,variant.DLR.ImageClassification.ModelStore

    2. 在组件页面上,选择查看配方并复制显示的 JSON 配方。

  4. 在存储库的组件页面上显示我的组件选项卡上,选择创建组件

  5. 在存储库的创建组件页面,在组件信息,依次选择以 JSON 形式输入配方作为组件源。

  6. Recipe框中,粘贴先前复制的组件配方。

  7. 在处方中,更新以下值:

    • ComponentVersion:增加组件的次要版本。

      创建自定义元件以覆盖公共模型元件时,必须仅更新现有元件版本的次要版本。例如,如果公共组件版本为2.1.0,您可以使用创建一个自定义组件2.1.1

    • Manifests.Artifacts.Uri:将每个 URI 值更新为要使用的模型的 Amazon S3 URI。

    注意

    请勿更改组件的名称。

  8. 选择创建组件

  1. 将模型上传到 S3 存储桶。有关将模型上传到 S3 存储桶的信息,请参阅使用 Amazon S3 存储桶中的Amazon Simple Storage Service 开发人员指南

    注意

    您必须将您的构件存储在与组件位于同一 AWS 账户和 AWS 区域中的 S3 存储桶中。为了使 AWS IoT Greengrass 能够访问这些工件,Greengrass 设备角色必须允许s3:GetObjectaction. 有关设备角色的更多信息,请参阅授权核心设备与 AWS 服务交互

  2. 运行以下命令以检索公有组件的组件配方。此命令会将组件配方写入您在命令中提供的输出文件。根据需要,将检索到的 base64 编码字符串转换为 JSON 或 YAML。

    Linux, macOS, or Unix
    aws greengrassv2 get-component \ --arn <arn> \ --recipe-output-format <recipe-format> \ --query recipe \ --output text | base64 --decode > <recipe-file>
    Windows command prompt
    aws greengrassv2 get-component ^ --arn <arn> ^ --recipe-output-format <recipe-format> ^ --query recipe ^ --output text > <recipe-file>.base64 certutil -decode <recipe-file>.base64 <recipe-file>
  3. 将配方文件的名称更新到<component-name>-<component-version>,其中组件版本是新组件的目标版本。例如,variant.DLR.ImageClassification.ModelStore-2.1.1.yaml

  4. 在处方中,更新以下值:

    • ComponentVersion:增加组件的次要版本。

      创建自定义元件以覆盖公共模型元件时,必须仅更新现有元件版本的次要版本。例如,如果公共组件版本为2.1.0,您可以使用创建一个自定义组件2.1.1

    • Manifests.Artifacts.Uri:将每个 URI 值更新为要使用的模型的 Amazon S3 URI。

    注意

    请勿更改组件的名称。

  5. 运行以下命令以使用检索和修改的配方来创建新组件。

    aws greengrassv2 create-component-version \ --inline-recipe fileb://path/to/component/recipe
    注意

    此步骤将在 AWS 云中的 AWS IoT Greengrass 拉服务中创建组件。您可以使用 Greengrass CLI 在将组件上传到云之前在本地开发、测试和部署组件。有关更多信息,请参阅 开发自定义组件

有关创建组件的更多信息,请参阅创建自定义 AWS AWS IoT Greengrass 组件

创建自定义机器学习组件

如果要使用自定义推理代码或 AWS IoT Greengrass 不提供示例组件的运行时,您必须创建自定义组件。您可以将自定义推理代码与 AWS 提供的示例机器学习模型和运行时结合使用,也可以使用您自己的模型和运行时开发完全定制的机器学习推理解决方案。如果您的模型使用 AWS IoT Greengrass 为其提供了示例运行时组件的运行时,则您可以使用该运行时组件,并且您只需为推断代码和要使用的模型创建自定义组件。

检索公共组件的配方

您可以使用现有公共机器学习组件的配方作为模板来创建自定义组件。要查看公共组件最新版本的组件配方,请使用控制台或 AWS CLI,如下所示:

  • 使用控制台

    1. 在存储库的组件页面上显示公共组件选项卡上,查找并选择公共组件。

    2. 在组件页面上,选择查看配方

  • 使用 AWS CLI

    运行以下命令以检索公有变体组件的组件配方。此命令会将组件配方写入您在命令中提供的 JSON 或 YAML 配方文件。

    Linux, macOS, or Unix
    aws greengrassv2 get-component \ --arn <arn> \ --recipe-output-format <recipe-format> \ --query recipe \ --output text | base64 --decode > <recipe-file>
    Windows command prompt
    aws greengrassv2 get-component ^ --arn <arn> ^ --recipe-output-format <recipe-format> ^ --query recipe ^ --output text > <recipe-file>.base64 certutil -decode <recipe-file>.base64 <recipe-file>

    按如下方式替换命令中的值:

    • <arn>。公有组件的 Amazon 资源名称 (ARN)。

    • <recipe-format>。要在其中创建处方文件的格式。支持的值为 JSONYAML

    • <recipe-file>。格式中配方的名称<component-name>-<component-version>

检索示例组件对象

您可以将公共机器学习组件使用的工件用作模板来创建自定义组件工件,例如推理代码或运行时安装脚本。

要查看公共机器学习组件中包含的示例工件,请部署公共推理组件,然后在/greengrass/v2/packages/artifacts-unarchived/component-name/component-version/folder。

将组件构件上传到 S3 存储桶

在创建自定义组件之前,您必须将组件对象上传到 S3 存储桶并使用组件配方中的 S3 URI。例如,要在推断组件中使用自定义推断代码,请将代码上传到 S3 存储桶。然后,您可以将推断代码的 Amazon S3 URI 用作组件中的工件。

有关向 S3 存储桶上传内容的信息,请参阅使用 Amazon S3 存储桶中的Amazon Simple Storage Service 开发人员指南

注意

您必须将您的构件存储在与组件位于同一 AWS 账户和 AWS 区域中的 S3 存储桶中。为了使 AWS IoT Greengrass 能够访问这些工件,Greengrass 设备角色必须允许s3:GetObjectaction. 有关设备角色的更多信息,请参阅授权核心设备与 AWS 服务交互

创建自定义组件

您可以使用检索到的工件和配方来创建自定义机器学习组件。有关示例,请参阅创建自定义推理组件

有关创建组件并将其部署到 Greengrass 设备的详细信息,请参阅管理 AWS IoT Greengrass 组件管理 AWS IoT Greengrass 组件

创建自定义推理组件

此部分说明如何使用 DLR 影像分类组件作为模板来创建自定义推理组件。

将您的推理代码上传到 Amazon S3 存储桶

创建您的推理代码,然后将其上传到 S3 存储桶。有关向 S3 存储桶上传内容的信息,请参阅使用 Amazon S3 存储桶中的Amazon Simple Storage Service 开发人员指南

注意

您必须将您的构件存储在与组件位于同一 AWS 账户和 AWS 区域中的 S3 存储桶中。为了使 AWS IoT Greengrass 能够访问这些工件,Greengrass 设备角色必须允许s3:GetObjectaction. 有关设备角色的更多信息,请参阅授权核心设备与 AWS 服务交互

为推理组件创建配方

  1. 运行以下命令检索 DLR 映像分类组件的组件配方。此命令会将组件配方写入您在命令中提供的 JSON 或 YAML 配方文件。

    Linux, macOS, or Unix
    aws greengrassv2 get-component \ --arn arn:aws:greengrass:region:aws:components:aws.greengrass.DLRImageClassification:versions:version \ --recipe-output-format JSON | YAML \ --query recipe \ --output text | base64 --decode > <recipe-file>
    Windows command prompt
    aws greengrassv2 get-component ^ --arn arn:aws:greengrass:region:aws:components:aws.greengrass.DLRImageClassification:versions:version ^ --recipe-output-format JSON | YAML ^ --query recipe ^ --output text > <recipe-file>.base64 certutil -decode <recipe-file>.base64 <recipe-file>

    Replace <recipe-file> ,格式为配方的名称<component-name>-<component-version>

  2. ComponentDependencies对象,请根据要使用的模型和运行时组件执行以下一项或多项操作:

    • 如果要使用 DLR 编译的模型,请保持 DLR 组件依赖关系。您还可以使用对自定义运行时组件的依赖关系替换它,如以下示例所示。

      Runtime 组件

      JSON
      { "<runtime-component>": { "VersionRequirement": "<version>", "DependencyType": "HARD" } }
      YAML
      <runtime-component>: VersionRequirement: "<version>" DependencyType: HARD
    • 保留 DLR 映像分类模型存储依赖关系,以使用 AWS 提供的预先训练的 Resnet-50 模型,或者对其进行修改以使用自定义模型组件。当您包含公共模型组件的依赖关系时,如果该组件的更高自定义版本存在于同一 AWS 账户和 AWS 区域中,则推断组件将使用该自定义组件。指定模型组件从属关系,如以下示例所示。

      公共模型组件

      JSON
      { variant.DLR.ImageClassification.ModelStore: { "VersionRequirement": "<version>", "DependencyType": "HARD" } }
      YAML
      variant.DLR.ImageClassification.ModelStore: VersionRequirement: "<version>" DependencyType: HARD

      自定义模型组件

      JSON
      { <custom-model-component>: { "VersionRequirement": "<version>", "DependencyType": "HARD" } }
      YAML
      <custom-model-component>: VersionRequirement: "<version>" DependencyType: HARD
  3. ComponentConfiguration对象中,添加此组件的默认配置。稍后可以在部署组件时修改此配置。以下摘录显示了 DLR 映像分类组件的组件配置。

    例如,如果使用自定义模型组件作为自定义推理组件的依赖关系,则修改ModelResourceKey以提供您正在使用的模型的名称。

    JSON
    { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "aws.greengrass.ImageClassification:mqttproxy:1": { "policyDescription": "Allows access to publish via topic ml/dlr/image-classification.", "operations": [ "aws.greengrass#PublishToIoTCore" ], "resources": [ "ml/dlr/image-classification" ] } } }, "PublishResultsOnTopic": "ml/dlr/image-classification", "ImageName": "cat.jpeg", "InferenceInterval": 3600, "ModelResourceKey": { "armv7l": "DLR-resnet50-armv7l-cpu-ImageClassification" "x86_64": "DLR-resnet50-x86_64-cpu-ImageClassification" "aarch64": "DLR-resnet50-aarch64-cpu-ImageClassification" } }
    YAML
    accessControl: aws.greengrass.ipc.mqttproxy: 'aws.greengrass.ImageClassification:mqttproxy:1': policyDescription: 'Allows access to publish via topic ml/dlr/image-classification.' operations: - 'aws.greengrass#PublishToIoTCore' resources: - ml/dlr/image-classification PublishResultsOnTopic: ml/dlr/image-classification ImageName: cat.jpeg InferenceInterval: 3600 ModelResourceKey: armv7l: "DLR-resnet50-armv7l-cpu-ImageClassification" x86_64: "DLR-resnet50-x86_64-cpu-ImageClassification" aarch64: "DLR-resnet50-aarch64-cpu-ImageClassification"
  4. Manifests对象,请提供有关组件部署到不同平台时使用的对象和此组件配置的信息,以及成功运行该组件所需的任何其他信息。以下摘录显示了Manifests对象在 DLR 映像分类组件中的 Linux 平台。

    JSON
    { "Manifests": [ { "Platform": { "os": "linux", "architecture": "arm" }, "Name": "32-bit armv7l - Linux (raspberry pi)", "Artifacts": [ { "URI": "s3://SAMPLE-BUCKET/sample-artifacts-directory/image_classification.zip", "Unarchive": "ZIP" } ], "Lifecycle": { "Setenv": { "DLR_IC_MODEL_DIR": "{variant.DLR.ImageClassification.ModelStore:artifacts:decompressedPath}/{configuration:/ModelResourceKey/armv7l}", "DEFAULT_DLR_IC_IMAGE_DIR": "{artifacts:decompressedPath}/image_classification/sample_images/" }, "Run": { "RequiresPrivilege": true, "script": ". {variant.DLR:configuration:/MLRootPath}/greengrass_ml_dlr_venv/bin/activate\npython3 {artifacts:decompressedPath}/image_classification/inference.py" } } } ] }
    YAML
    Manifests: - Platform: os: linux architecture: arm Name: 32-bit armv7l - Linux (raspberry pi) Artifacts: - URI: s3://SAMPLE-BUCKET/sample-artifacts-directory/image_classification.zip Unarchive: ZIP Lifecycle: Setenv: DLR_IC_MODEL_DIR: "{variant.DLR.ImageClassification.ModelStore:artifacts:decompressedPath}/{configuration:/ModelResourceKey/armv7l}" DEFAULT_DLR_IC_IMAGE_DIR: "{artifacts:decompressedPath}/image_classification/sample_images/" Run: RequiresPrivilege: true script: |- . {variant.DLR:configuration:/MLRootPath}/greengrass_ml_dlr_venv/bin/activate python3 {artifacts:decompressedPath}/image_classification/inference.py

有关创建组件配方的详细信息,请参阅AWS IoT Greengrass 组件配方

创建推理组件

使用 AWS IoT Greengrass 控制台或 AWS CLI 使用您刚刚定义的配方创建组件。在创建组件后,您可以将其部署到设备上执行推理。有关如何部署推理组件的示例,请参阅教程:使用 TensorFlow 精简版进行样本图像分类推理

  1. 登录到AWS IoT Greengrass 控制台

  2. 在导航菜单中,选择组件

  3. 在存储库的组件页面上显示我的组件选项卡上,选择创建组件

  4. 在存储库的创建组件页面,在组件信息中,选择以 JSON 形式输入配方或者输入食谱为 YAML作为组件源。

  5. Recipe框中,输入您创建的自定义配方。

  6. 单击创建组件

运行以下命令以使用您创建的配方创建新的自定义组件。

aws greengrassv2 create-component-version \ --inline-recipe fileb://path/to/recipe/file
注意

此步骤将在 AWS 云中的 AWS IoT Greengrass 拉服务中创建组件。您可以使用 Greengrass CLI 在将组件上传到云之前在本地开发、测试和部署组件。有关更多信息,请参阅 开发自定义组件