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

您正在查看Amazon IoT Greengrass Version 1.Amazon IoT Greengrass Version 2是最新的主要版本Amazon IoT Greengrass. 有关使用Amazon IoT Greengrass V2,请参阅Amazon IoT Greengrass Version 2开发人员指南.

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

ML 反馈连接器

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 映像分类连接器一起使用,请配置MLFeedbackConnectorConfigId参数,用于 ML 图像分类连接器。

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

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

Requirements

此连接器具有以下要求:

  • Amazon IoT GreengrassCore 软件 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 开发工具包与此连接器进行交互时需要 v1.1.0。

Parameters

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 操作。有关更多信息,请参阅Requirements

:必需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

随机采样策略的速率。

:必需trueifstrategy-nameRANDOM_SAMPLING.

类型:number

有效值:0.0 - 1.0

threshold

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

:必需trueifstrategy-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 Greengrass用于调用连接器的 Machine Learning SDK。有关示例,请参阅用法示例

注意

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

publish 函数采用下列参数:

ConfigId

目标反馈配置的 ID。此必须与中定义的反馈配置的 ID 匹配。FeedbackConfigurationMap参数,用于 ML 反馈连接器。

所需:是

类型:字符串

ModelInput

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

所需:是

类型:字节

ModelPrediction

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

所需:是

类型:词典或float

Metadata

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

必需:false

类型:词典

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

输出数据

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

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

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

  • 指标用于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" }

该连接器添加bucketkey字段添加到来自 Amazon 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 开发工具包将数据发送到 ML 反馈连接器。

注意

您可以下载Amazon IoT GreengrassMachine Learning SDKAmazon 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

Licenses

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

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

另请参阅