自定义您的机器学习组件 - 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 Lite 图像分类组件的默认配置如下所示:

{ "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. 在 Spect targe darg e demplocate

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

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

  7. “选择组件” 页面上,在 “公共组件” 下,验证是否选择了具有修改配置的推理组件,然后选择 “下一步”。

  8. 在 Conf igure Con figure Comploment

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

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

      { "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 Simp le Storage Service 用户指南中的使用 S3 存储

    注意

    您必须将构件存储在Amazon Web Services 账户与Amazon Web Services 区域组件相同的 S3 存储桶中。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 Simp le Storage Service 用户指南中的使用 S3 存储

    注意

    您必须将构件存储在Amazon Web Services 账户与Amazon Web Services 区域组件相同的 S3 存储桶中。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>。 公有组件的Amazon 资源名称 (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 Simple Storag e Service 用户指南中的使用 S3 存储

注意

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

创建自定义组件

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

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

创建自定义推理组件

本节向您展示如何使用 DLR 图像分类组件作为模板来创建自定义推理组件。

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

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

注意

您必须将构件存储在Amazon Web Services 账户与Amazon Web Services 区域组件相同的 S3 存储桶中。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组件