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

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

自定义您的机器学习组件

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

使用示例推理组件
  • 在部署推理组件时修改其配置。

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

使用自定义推理组件
  • 通过添加公共模型组件和运行时组件作为自定义推理组件的依赖项,在示例模型和运行时中使用自定义推理代码。

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

修改公共推理组件的配置

Amazon 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" } }

部署公共推理组件时,您可以修改默认配置以自定义部署。有关每个公共推理组件的可用配置参数的信息,请参阅中的Amazon-提供的机器学习组件组件主题。

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

部署修改后的公共推理组件(控制台)
  1. 登录 Amazon 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. 在 “审阅” 页面上,选择 “部署

使用带有示例推理组件的自定义模型

如果要将示例推理组件与自己的机器学习模型一起用于Amazon IoT Greengrass提供示例运行时组件的运行时,则必须使用使用这些模型作为构件的组件来覆盖公共模型组件。简而言之,您需要完成以下步骤,将自定义模型与示例推理组件一起使用:

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

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

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

  1. 将您的模型上传到 S3 存储桶。有关将模型上传到 S3 存储桶的信息,请参阅《亚马逊简单存储服务用户指南》中的 “使用 Amazon S3 存储”。

    注意

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

  2. Amazon 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 值更新为您要使用的模型的 Amazon S3 URI。

    注意

    请勿更改组件的名称。

  8. 选择创建组件

  1. 将您的模型上传到 S3 存储桶。有关将模型上传到 S3 存储桶的信息,请参阅《亚马逊简单存储服务用户指南》中的 “使用 Amazon S3 存储”。

    注意

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

  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 值更新为您要使用的模型的 Amazon S3 URI。

    注意

    请勿更改组件的名称。

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

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

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

有关创建组件的更多信息,请参阅开发Amazon IoT Greengrass组件

创建自定义机器学习组件

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

检索公共组件的配方

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

  • 使用控制台

    1. 在 “组件” 页面的 “公共组件” 选项卡上,查找并选择公共组件。

    2. 在组件页面上,选择查看食谱

  • 使用 Amazon 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>。 公共组件的亚马逊资源名称 (ARN)。

    • <recipe-format>。 您要创建配方文件的格式。支持的值为 JSONYAML

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

检索示例组件工件

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

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

将组件项目上传到 S3 存储桶

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

有关将内容上传到 S3 存储桶的信息,请参阅《亚马逊简单存储服务用户指南》中的 “使用 Amazon S3 存储”。

注意

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

创建自定义组件

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

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

创建自定义推理组件

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

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

创建您的推理代码,然后将其上传到 S3 存储桶。有关将内容上传到 S3 存储桶的信息,请参阅《亚马逊简单存储服务用户指南》中的 “使用 Amazon S3 存储”。

注意

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

为推理组件创建配方

  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 图像分类模型存储依赖关系以使用Amazon提供的预训练的 ResNet -50 模型,或者对其进行修改以使用自定义模型组件。当你为公共模型组件添加依赖关系时,如果该组件的更高自定义版本存在于同一个Amazon Web Services 账户和中Amazon Web Services 区域,则推理组件将使用该自定义组件。指定模型组件依赖关系,如以下示例所示。

      公共模型组件

      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

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

创建推理组件

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

  1. 登录 Amazon IoT Greengrass 控制台

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

  3. 在 “组件” 页面的 “我的组件” 选项卡上,选择 “创建组件”。

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

  5. 食谱框中,输入您创建的自定义食谱。

  6. 单击 “创建组件”。

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

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

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