自定义您的机器学习组件 - AWS IoT Greengrass

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

自定义您的机器学习组件

在中 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提供的机器学习组件 中的组件主题。

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

部署修改后的公共推理组件(控制台)
  1. 登录 AWS IoT Greengrass 控制台

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

  3. 组件页面的公有组件选项卡中,选择您想要部署的组件。

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

  5. 添加到部署中,选择以下选项之一:

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

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

  6. 指定目标页面中,执行以下操作:

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

    2. 部署目标下,选择部署目标,然后选择下一步。如果您正在修改现有部署,则无法更改部署目标。

  7. 选择组件页面的公有组件下,验证是否选择了经修改配置的推理组件,然后选择下一步

  8. 配置组件页面上,执行以下操作:

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

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

      { "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 Simple Storage Service 用户指南》中的使用 Amazon S3 存储桶

    注意

    您必须将项目存储在与组件相同 AWS 账户 的 S3 存储桶中。 AWS 区域 AWS IoT Greengrass 要允许访问这些工件,Greengrass 设备角色必须允许该操作。s3:GetObject有关设备角色的更多信息,请参阅 授权核心设备与 AWS 服务交互

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

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

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

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

  4. 组件页面的我的组件选项卡中,选择创建组件

  5. 在 “创建组件” 页面的 “组件信息” 下,选择 “输入配方JSON作为组件来源”。

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

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

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

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

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

    注意

    请勿更改组件的名称。

  8. 选择创建组件

  1. 将模型上传至 S3 存储桶。有关上传模型至 S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 Amazon S3 存储桶

    注意

    您必须将项目存储在与组件相同 AWS 账户 的 S3 存储桶中。 AWS 区域 AWS IoT Greengrass 要允许访问这些工件,Greengrass 设备角色必须允许该操作。s3:GetObject有关设备角色的更多信息,请参阅 授权核心设备与 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 (CMD)
    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>
    PowerShell
    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值更新为您要使用的模型URI的 Amazon S3。

    注意

    请勿更改组件的名称。

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

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

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

有关创建组件的更多信息,请参阅 开发 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 (CMD)
    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>
    PowerShell
    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/ 文件夹中查看这些构件。

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

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

有关上传内容至 S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 Amazon S3 存储桶

注意

您必须将项目存储在与组件相同 AWS 账户 的 S3 存储桶中。 AWS 区域 AWS IoT Greengrass 要允许访问这些工件,Greengrass 设备角色必须允许该操作。s3:GetObject有关设备角色的更多信息,请参阅 授权核心设备与 AWS 服务交互

创建自定义组件

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

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

创建自定义推理组件

本节介绍如何使用DLR图像分类组件作为模板创建自定义推理组件。

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

创建推理代码,然后将其上传至 S3 存储桶。有关上传内容至 S3 存储桶的信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 Amazon S3 存储桶

注意

您必须将项目存储在与组件相同 AWS 账户 的 S3 存储桶中。 AWS 区域 AWS IoT Greengrass 要允许访问这些工件,Greengrass 设备角色必须允许该操作。s3:GetObject有关设备角色的更多信息,请参阅 授权核心设备与 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 (CMD)
    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>
    PowerShell
    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>

    <recipe-file>用格式中的配方名称替换<component-name>-<component-version>

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

    • 如果要使用DLR编译后的模型,请保留DLR组件依赖关系。您也可以将其替换为自定义运行时组件的依赖关系,如以下示例所示。

      运行时组件

      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 对象中,提供有关该组件部署到不同平台时使用的构件和配置信息,以及成功运行该组件所需的任何其他信息。以下摘录显示了DLR图像分类组件中适用于 Linux 平台的Manifests对象配置。

    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 Lite 执行示例图像分类推理

  1. 登录 AWS IoT Greengrass 控制台

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

  3. 组件页面的我的组件选项卡中,选择创建组件

  4. 在 “创建组件” 页面的 “组件信息” 下,选择 “将配方输入为” JSON 或 “输入配方YAML作为组件来源”。

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

  6. 单击创建组件

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

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

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