ML 反馈连接器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon IoT Greengrass Version 1在 2023 年 6 月 30 日之前,不再接收功能更新,只会收到安全补丁和错误修复。有关更多信息,请参阅 。Amazon IoT Greengrass V1维护政策. 强烈建议您迁移到Amazon IoT Greengrass Version 2,它补充说重要新功能对其他平台的支持.

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

ML 反馈连接器

警告

此连接器已移至使用寿命期延长, 和Amazon IoT Greengrass不会发布提供功能、对现有功能的增强功能、安全补丁或错误修复的更新。有关更多信息,请参阅 Amazon IoT Greengrass Version 1维护策略

ML 反馈连接器使您可以更轻松地访问机器学习 (ML) 模型数据以进行模型重新训练和分析。该连接器:

  • 将您的 ML 模型使用的输入数据(样本)上传到 Amazon S3。模型输入可以是任何格式,如图像、JSON 或音频。在将样本上传到云后,您可以使用它们来重新训练模型,以提高其预测的准确性和精确性。例如,您可以使用SageMaker Ground Truth为样品添加标签SageMaker来重新训练模型。

  • 从模型将预测结果发布为 MQTT 消息。这可让您实时监控和分析模型的推理质量。您也可以存储预测结果,然后使用它们来分析随时间推移的趋势。

  • 将有关样本上传和样本数据的指标发布到 Amazon CloudWatch。

要配置此连接器,您以 JSON 格式描述支持的反馈配置。反馈配置定义诸如目标 Amazon S3 存储桶、内容类型和之类的属性。采样策略. (采样策略用于确定要上传哪些样本。)

您可以在以下情况下使用 ML 反馈连接器:

  • 使用用户定义的 Lambda 函数。您的本地推理 Lambda 函数使用Amazon IoT GreengrassMachine Learning SDK 调用此连接器并传入目标反馈配置、模型输入和模型输出(预测结果)。有关示例,请参阅用法示例

  • 使用ML 映像分类连接器(v2)。要将此连接器与 ML 映像分类连接器一起使用,请配置MLFeedbackConnectorConfigIdML 图像分类连接器的参数。

  • 使用ML 对象检测连接器. 要将此连接器与 ML 对象检测连接器一起使用,请配置MLFeedbackConnectorConfigIdML 对象检测连接器的参数。

ARNarn:aws:greengrass:region::/connectors/MLFeedback/versions/1

要求

此连接器具有以下要求:

  • Amazon IoT Greengrass核心软件 v1.9.3 版或更高版本。

  • Python在核心设备上安装了 3.7 或 3.8 版,并添加到 PATH 环境变量中。

    注意

    要使用 Python 3.8,请运行以下命令创建从默认 Python 3.7 安装文件夹到已安装的 Python 3.8 二进制文件的符号链接。

    sudo ln -s path-to-python-3.8/python3.8 /usr/bin/python3.7

    这会将设备配置为满足 Amazon IoT Greengrass 的 Python 要求。

  • 一个或多个 Amazon S3 存储桶。您使用的存储桶数量取决于您的采样策略。

  • 这些区域有:Greengrass 组角色配置为允许s3:PutObject对目标 Amazon S3 存储桶中的对象执行操作,如以下示例 IAM 策略所示。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::bucket-name/*" ] } ] }

    该策略应包括所有目标存储桶作为资源。您可以授予对资源的具体或条件访问权限(例如,通过使用通配符*命名方案)。

    对于组角色要求,您必须将角色配置为授予所需权限,并确保角色已添加到组中。有关更多信息,请参阅 管理 Greengrass 组角色(控制台)管理 Greengrass 组角色 (CLI)

  • 这些区域有:CloudWatch 指标连接器添加到 Greengrass 组且已配置。仅当您要使用指标报告功能时才需要它。

  • Amazon IoT GreengrassMachine Learning SDK与此连接器进行交互时需要 v1.1.0。

参数

FeedbackConfigurationMap

此连接器可用于将样本上传到 Amazon S3 的一组一个或多个反馈配置。反馈配置定义诸如目标存储桶、内容类型和采样策略之类的参数。调用此连接器时,调用 Lambda 函数或连接器将指定目标反馈配置。

在中显示名称Amazon IoT控制台:反馈配置映射

:必需true

类型: 一个格式正确的 JSON 字符串,用于定义支持的反馈配置集。有关示例,请参阅FeedbackConfigurationMap 示例

反馈配置对象的 ID 具有以下要求。

该 ID:

  • 在配置对象间必须唯一。

  • 必须以字母或数字开头。可以包含大小写字母、数字和连字符。

  • 长度必须介于 2 - 63 个字符之间。

:必需true

类型:string

有效模式:^[a-zA-Z0-9][a-zA-Z0-9-]{1,62}$

示例:MyConfig0config-a12id

反馈配置对象的主体包含以下属性。

s3-bucket-name

目标 Amazon S3 存储桶的名称。

注意

组角色必须允许对所有目标存储桶执行 s3:PutObject 操作。有关更多信息,请参阅 要求

:必需true

类型:string

有效模式:^[a-z0-9\.\-]{3,63}$

content-type

要上传的样本的内容类型。单个反馈配置的所有内容必须属于同一类型。

:必需true

类型:string

示例:image/jpegapplication/jsonaudio/ogg

s3-prefix

用于上传的样本的键前缀。前缀类似于目录名称。它使您能够在存储桶的同一目录下存储相似的数据。有关更多信息,请参阅 。对象键和元数据中的Amazon Simple Storage Service 用户指南.

:必需false

类型:string

file-ext

要用于上传的样本的文件扩展名。必须是内容类型的有效文件扩展名。

:必需false

类型:string

示例:jpgjsonogg

sampling-strategy

用于过滤要上传的样本的采样策略。如果省略,连接器尝试上传它收到的所有样本。

:必需false

类型: :一个格式正确的 JSON 字符串,其中包含以下属性。

strategy-name

采样策略的名称。

:必需true

类型:string

有效值:RANDOM_SAMPLINGLEAST_CONFIDENCEMARGINENTROPY

rate

随机采样策略的速率。

:必需true如果strategy-nameRANDOM_SAMPLING.

类型:number

有效值:0.0 - 1.0

threshold

最小置信度裕度采样策略的阈值。

:必需true如果strategy-nameLEAST_CONFIDENCEMARGIN,或者ENTROPY.

类型:number

有效值:

  • 对于 LEAST_CONFIDENCEMARGIN 策略,为 0.0 - 1.0

  • 对于 ENTROPY 策略,为 0.0 - no limit

RequestLimit

连接器一次可以处理的最大请求数。

您可以使用此参数,通过限制连接器同时处理的请求数来限制内存消耗。超过此限制的请求将被忽略。

在中显示名称Amazon IoT控制台:请求限制

:必需false

类型:string

有效值:0 - 999

有效模式:^$|^[0-9]{1,3}$

创建连接器示例 (Amazon CLI)

以下 CLI 命令将创建ConnectorDefinition其初始版本包含 ML 反馈连接器。

aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyMLFeedbackConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/MLFeedback/versions/1", "Parameters": { "FeedbackConfigurationMap": "{ \"RandomSamplingConfiguration\": { \"s3-bucket-name\": \"my-aws-bucket-random-sampling\", \"content-type\": \"image/png\", \"file-ext\": \"png\", \"sampling-strategy\": { \"strategy-name\": \"RANDOM_SAMPLING\", \"rate\": 0.5 } }, \"LeastConfidenceConfiguration\": { \"s3-bucket-name\": \"my-aws-bucket-least-confidence-sampling\", \"content-type\": \"image/png\", \"file-ext\": \"png\", \"sampling-strategy\": { \"strategy-name\": \"LEAST_CONFIDENCE\", \"threshold\": 0.4 } } }", "RequestLimit": "10" } } ] }'

FeedbackConfigurationMap 示例

以下是 FeedbackConfigurationMap 参数的扩展示例值。本示例包括使用不同采样策略的几种反馈配置。

{ "ConfigID1": { "s3-bucket-name": "my-aws-bucket-random-sampling", "content-type": "image/png", "file-ext": "png", "sampling-strategy": { "strategy-name": "RANDOM_SAMPLING", "rate": 0.5 } }, "ConfigID2": { "s3-bucket-name": "my-aws-bucket-margin-sampling", "content-type": "image/png", "file-ext": "png", "sampling-strategy": { "strategy-name": "MARGIN", "threshold": 0.4 } }, "ConfigID3": { "s3-bucket-name": "my-aws-bucket-least-confidence-sampling", "content-type": "image/png", "file-ext": "png", "sampling-strategy": { "strategy-name": "LEAST_CONFIDENCE", "threshold": 0.4 } }, "ConfigID4": { "s3-bucket-name": "my-aws-bucket-entropy-sampling", "content-type": "image/png", "file-ext": "png", "sampling-strategy": { "strategy-name": "ENTROPY", "threshold": 2 } }, "ConfigID5": { "s3-bucket-name": "my-aws-bucket-no-sampling", "s3-prefix": "DeviceA", "content-type": "application/json" } }

采样策略

连接器支持四种采样策略,这些策略确定是否上传传递给连接器的样本。样本是模型用于预测的数据的离散实例。您可以使用采样策略来筛选最有可能提高模型准确性的样本。

RANDOM_SAMPLING

根据提供的速率随机上传样本。如果随机生成的值小于该速率,则它将上传样本。速率越高,上传的样本越多。

注意

此策略不考虑所提供的任何模型预测。

LEAST_CONFIDENCE

上传其最大置信概率低于提供的阈值的样本。

示例方案:

阈值:.6

模型预测:[.2, .2, .4, .2]

最大置信概率:.4

结果:

使用此样本,因为最大置信概率 (.4) <= 阈值 (.6)。

MARGIN

如果最高的两个置信概率之间的裕度落在提供的阈值内,则上传样本。裕度是最高的两个概率之间的差。

示例方案:

阈值:.02

模型预测:[.3, .35, .34, .01]

最高的两个置信概率:[.35, .34]

裕度:.01 (.35 - .34)

结果:

使用此样本,因为裕度 (.01) <= 阈值 (.02)。

ENTROPY

上传其熵大于提供的阈值的样本。使用模型预测的标准化熵。

示例方案:

阈值:0.75

模型预测:[.5, .25, .25]

预测的熵:1.03972

结果:

使用此样本,因为熵 1.03972> 阈值0.75

输入数据

用户定义的 Lambda 函数使用publish的函数feedback中的客户端Amazon IoT GreengrassMachine Learning SDK 调用连接器。有关示例,请参阅用法示例

注意

此连接器不接受 MQTT 消息作为输入数据。

publish 函数采用下列参数:

ConfigId

目标反馈配置的 ID。这必须与中定义的反馈配置的 ID 匹配。FeedbackConfigurationMapML 反馈连接器的参数。

所需:True

类型:字符串

ModelInput

传递给模型以进行推理的输入数据。除非根据采样策略将此输入数据过滤掉,否则将使用目标配置上传此数据。

所需:True

类型:字节

ModelPrediction

来自模型的预测结果。结果类型可以是词典或列表。例如,ML 图像分类连接器的预测结果是概率列表(例如)。[0.25, 0.60, 0.15])。此数据发布到 /feedback/message/prediction 主题。

所需:True

类型:词典或列表float价值

Metadata

客户定义的、特定于应用程序的元数据,该元数据附加到上传的样本并发布到 /feedback/message/prediction 主题。连接器还将具有时间戳值的 publish-ts 键插入元数据。

:必需

类型:词典

示例:{"some-key": "some value"}

输出数据

此连接器将数据发布到三个 MQTT 主题:

  • 来自连接器的关于 feedback/message/status 主题的状态信息。

  • 有关 feedback/message/prediction 主题的预测结果。

  • 指标注定向 CloudWatch 在cloudwatch/metric/put主题。

您必须配置订阅以允许连接器就 MQTT 主题进行通信。有关更多信息,请参阅 输入和输出

主题筛选条件:feedback/message/status

使用此主题监控样本上传和已丢弃样本的状态。连接器每次收到请求时都会发布到该主题。

输出示例:样本上传成功
{ "response": { "status": "success", "s3_response": { "ResponseMetadata": { "HostId": "IOWQ4fDEXAMPLEQM+ey7N9WgVhSnQ6JEXAMPLEZb7hSQDASK+Jd1vEXAMPLEa3Km", "RetryAttempts": 1, "HTTPStatusCode": 200, "RequestId": "79104EXAMPLEB723", "HTTPHeaders": { "content-length": "0", "x-amz-id-2": "lbbqaDVFOhMlyU3gRvAX1ZIdg8P0WkGkCSSFsYFvSwLZk3j7QZhG5EXAMPLEdd4/pEXAMPLEUqU=", "server": "AmazonS3", "x-amz-expiration": "expiry-date=\"Wed, 17 Jul 2019 00:00:00 GMT\", rule-id=\"OGZjYWY3OTgtYWI2Zi00ZDllLWE4YmQtNzMyYzEXAMPLEoUw\"", "x-amz-request-id": "79104EXAMPLEB723", "etag": "\"b9c4f172e64458a5fd674EXAMPLE5628\"", "date": "Thu, 11 Jul 2019 00:12:50 GMT", "x-amz-server-side-encryption": "AES256" } }, "bucket": "greengrass-feedback-connector-data-us-west-2", "ETag": "\"b9c4f172e64458a5fd674EXAMPLE5628\"", "Expiration": "expiry-date=\"Wed, 17 Jul 2019 00:00:00 GMT\", rule-id=\"OGZjYWY3OTgtYWI2Zi00ZDllLWE4YmQtNzMyYzEXAMPLEoUw\"", "key": "s3-key-prefix/UUID.file_ext", "ServerSideEncryption": "AES256" } }, "id": "5aaa913f-97a3-48ac-5907-18cd96b89eeb" }

该连接器添加bucketkeyAmazon S3 响应的字段。有关 Amazon S3 响应的更多信息,请参阅。PUT 对象中的Amazon Simple Storage Service API 参考.

输出示例:由于采样策略而丢弃的样本示例
{ "response": { "status": "sample_dropped_by_strategy" }, "id": "4bf5aeb0-d1e4-4362-5bb4-87c05de78ba3" }
输出示例:样本上传失败

失败状态包括错误消息作为 error_message 值和异常类 error 作为值。

{ "response": { "status": "fail", "error_message": "[RequestId: 4bf5aeb0-d1e4-4362-5bb4-87c05de78ba3] Failed to upload model input data due to exception. Model prediction will not be published. Exception type: NoSuchBucket, error: An error occurred (NoSuchBucket) when calling the PutObject operation: The specified bucket does not exist", "error": "NoSuchBucket" }, "id": "4bf5aeb0-d1e4-4362-5bb4-87c05de78ba3" }
输出示例:由于请求限制,请求被限制
{ "response": { "status": "fail", "error_message": "Request limit has been reached (max request: 10 ). Dropping request.", "error": "Queue.Full" }, "id": "4bf5aeb0-d1e4-4362-5bb4-87c05de78ba3" }
主题筛选条件:feedback/message/prediction

使用本主题可侦听基于上传的样本数据的预测。这使您能够实时分析您的模型性能。仅当数据成功上传到 Amazon S3 时,模型预测才会发布到该主题。在此主题上发布的消息为 JSON 格式。它们包含指向上传的数据对象的链接、模型的预测以及请求中包含的元数据。

您也可以存储预测结果,然后使用它们来报告和分析随时间推移的趋势。趋势可以提供宝贵的见解。例如,准确性随时间降低趋势可以帮助您确定是否需要重新训练模型。

输出示例
{ "source-ref": "s3://greengrass-feedback-connector-data-us-west-2/s3-key-prefix/UUID.file_ext", "model-prediction": [ 0.5, 0.2, 0.2, 0.1 ], "config-id": "ConfigID2", "metadata": { "publish-ts": "2019-07-11 00:12:48.816752" } }
提示

您可以配置IoT Analytics 接口订阅该主题并将信息发送给Amazon IoT Analytics以便进一步或历史分析。

主题筛选条件:cloudwatch/metric/put

这是用于将指标发布到 CloudWatch 的输出主题。此功能要求您安装并配置CloudWatch 指标连接器.

指标包括:

  • 上传的样本的数量。

  • 上传的样本的大小。

  • 上传到 Amazon S3 时出现的错误数。

  • 基于采样策略的丢弃样本数。

  • 受限制请求的数目。

输出示例:数据样本的大小(在实际上传之前发布)
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 47592, "unit": "Bytes", "metricName": "SampleSize" } } }
输出示例:样本上传成功
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 1, "unit": "Count", "metricName": "SampleUploadSuccess" } } }
输出示例:成功上传样本并发布预测结果
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 1, "unit": "Count", "metricName": "SampleAndPredictionPublished" } } }
输出示例:样本上传失败
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 1, "unit": "Count", "metricName": "SampleUploadFailure" } } }
输出示例:由于采样策略而丢弃的样本示例
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 1, "unit": "Count", "metricName": "SampleNotUsed" } } }
输出示例:由于请求限制,请求被限制
{ "request": { "namespace": "GreengrassFeedbackConnector", "metricData": { "value": 1, "unit": "Count", "metricName": "ErrorRequestThrottled" } } }

用法示例

以下示例是一个用户定义的 Lambda 函数,该函数使用Amazon IoT GreengrassMachine Learning SDK将数据发送到机器学习反馈连接器。

注意

您可以下载Amazon IoT GreengrassMachine Learning SDK 来自Amazon IoT Greengrass 下载页面.

import json import logging import os import sys import greengrass_machine_learning_sdk as ml client = ml.client('feedback') try: feedback_config_id = os.environ["FEEDBACK_CONFIG_ID"] model_input_data_dir = os.environ["MODEL_INPUT_DIR"] model_prediction_str = os.environ["MODEL_PREDICTIONS"] model_prediction = json.loads(model_prediction_str) except Exception as e: logging.info("Failed to open environment variables. Failed with exception:{}".format(e)) sys.exit(1) try: with open(os.path.join(model_input_data_dir, os.listdir(model_input_data_dir)[0]), 'rb') as f: content = f.read() except Exception as e: logging.info("Failed to open model input directory. Failed with exception:{}".format(e)) sys.exit(1) def invoke_feedback_connector(): logging.info("Invoking feedback connector.") try: client.publish( ConfigId=feedback_config_id, ModelInput=content, ModelPrediction=model_prediction ) except Exception as e: logging.info("Exception raised when invoking feedback connector:{}".format(e)) sys.exit(1) invoke_feedback_connector() def function_handler(event, context): return

许可证

ML 反馈连接器包含以下第三方软件/许可:

此连接器在Greengrass 核心软件许可协议.

另请参阅