ML 回饋連接器 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長使用壽命階段。如需詳細資訊,請參閱AWS IoT Greengrass V1 維護政策。在此日期之後, AWS IoT Greengrass V1 將不會發行提供功能、增強功能、錯誤修正或安全性修補程式的更新。在上運行的設備 AWS IoT Greengrass V1 不會中斷,並將繼續運行並連接到雲。我們強烈建議您移轉至 AWS IoT Greengrass Version 2,這會增加重要的新功能,並支援其他平台

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

ML 回饋連接器

警告

此連接器已移動到延長壽命,以及AWS IoT Greengrass不會發佈提供功能、增強現有功能、安全修補程序或錯誤修復的更新。如需詳細資訊,請參閱 AWS IoT Greengrass Version 1維護政策

ML 意見回饋連接器可讓您更輕鬆地存取機器學習 (ML) 模型資料,以進行模型重新訓練和分析。連接器:

  • 將 ML 模型使用的輸入資料 (範例) 上傳至 Amazon S3。模型輸入可以採用任何格式,例如影像、JSON 或音訊。在範例上傳至雲端之後,您可以使用它們來重新訓練模型,以改善其預測的精確性和準確性。例如,您可以使用SageMaker Ground Truth為樣本添加標籤,然後SageMaker重新訓練模型。

  • 以 MQTT 訊息形式發佈模型的預測結果。這可讓您即時監控和分析模型的推論品質。您也可以存放預測結果,並使用它們來分析隨時間變化的趨勢。

  • 將範例上傳和範例資料的相關指標發佈至 Amazon CloudWatch。

若要設定此連接器,請以 JSON 格式描述支援的意見回饋組態。意見回饋組態會定義目的地 Amazon S3 貯體、內容類型和抽樣策略。(抽樣策略用來決定要上傳哪些範例。)

您可以在下列案例中使用 ML 回饋連接器:

  • 使用用户定義的 Lambda 函數。您的本地推理 Lambda 函數使用AWS IoT GreengrassMachine Learning SDK 來叫用此連接器,並傳入目標回饋組態、模型輸入和模型輸出 (預測結果)。如需範例,請參閱 使用範例

  • 使用ML 影像分類連接器(v2). 若要搭配使用此連接器與 ML 影像分類連接器,請針對MLFeedbackConnectorConfigId參數用於 ML 影像分類連接器。

  • 使用ML 物件偵測連接器。若要搭配使用此連接器與 ML 物件檢測連接器,請針對MLFeedbackConnectorConfigId參數用於 ML 對象檢測連接器。

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

要求

此連接器有下列要求:

  • AWS IoT Greengrass核心軟體 1.9.3 版或更高版本。

  • 蟒蛇版本 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

    這會設定您的裝置以符合 AWS IoT Greengrass 的 Python 需求。

  • 一或多個 Amazon S3 儲存貯體。您使用的儲存貯體數量取決於您的取樣策略。

  • 所以此Greengrass 群組角色配置為允許s3:PutObject動作,如下列範例 IAM 政策所示。

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

    政策應該包含所有目的地儲存貯體做為資源。您可以為資源授予細微或條件式存取 (例如,使用萬用字元 * 命名配置)。

    針對群組角色要求,您必須設定角色以授與必要的許可,並確認已將角色新增至群組。如需詳細資訊,請參閱管理 Greengrass 群組角色 (主控台)管理 Greengrass 群組角色 (CLI)

  • 所以此CloudWatch 指標連接器已新增至 Greengrass 羣組並設定。只有在您想要使用指標報告功能時,才需要此項目。

  • AWS IoT GreengrassMachine Learning 軟體開發套件需有 1.1.0 版,才能與此連接器互動。

參數

FeedbackConfigurationMap

連接器可用來將範例上傳至 Amazon S3 的一組意見回饋組態。意見回饋組態會定義目的地儲存貯體、內容類型和抽樣策略之類的屬性。如果叫用此連接器,呼叫的 Lambda 函數或連接器會指定目標意見回饋組態。

中的顯示名稱AWS 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

有效值:

  • 0.0 - 1.0,適用於 LEAST_CONFIDENCEMARGIN 策略。

  • 0.0 - no limit,適用於 ENTROPY 策略。

RequestLimit

連接器一次可處理的請求數量上限。

您可以使用此參數來限制連接器同時處理的要求數量,以限制記憶體消耗。超過此限制的請求會被忽略。

中的顯示名稱AWS IoT主控台:請求限制

必要false

類型:string

有效值:0 - 999

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

建立範例連接器 (AWS 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)

結果:

使用範例,因為邊界1 (.01) <= 閾值 (.02)。

ENTROPY

上傳其熵大於所提供閾值的範例。使用模型預測的標準化熵。

範例案例:

閾值:0.75

模型預測:[.5, .25, .25]

預測的熵:1.03972

結果:

使用範例:因為熵 (1.03972) > 閾值 (0.75)。

輸入資料

用户定義的 Lambda 函數使用publish函數feedback客户端AWS IoT GreengrassMachine Learning SDK 調用連接器。如需範例,請參閱 使用範例

注意

此連接器不接受 MQTT 消息作為輸入資料。

publish 函數採用下列引數:

ConfigId

目標意見回饋組態的 ID。這必須符合意見回饋組態的 ID 在FeedbackConfigurationMap參數用於 ML 反饋連接器。

必要:true

類型:字串

ModelInput

傳遞至模型以進行推論的輸入資料。除非根據取樣策略將此輸入資料篩選掉, 否則會使用目標組態來上傳此輸入資料。

必要:true

類型:位元組

ModelPrediction

來自模型的預測結果。結果類型可以是字典或清單。例如,來自 ML 影像分類連接器的預測結果是機率清單 (例如[0.25, 0.60, 0.15]。此資料會發佈至 /feedback/message/prediction 主題。

必要:true

類型:字典或float

中繼資料

客戶定義的應用程式特定中繼資料,其會附加至上傳的範例並發佈至 /feedback/message/prediction 主題。連接器也會將具有時間戳記值的 publish-ts 金鑰插入至中繼資料。

必要:false

類型:字典

範例:{"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" }

連接器會將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 連接器訂此主題,並將資訊傳送至AWS 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 函數,其會使用AWS IoT GreengrassMachine Learning 軟體開發套件將數據發送到 ML 反饋連接器。

注意

您可以下載AWS IoT GreengrassMachine Learning SDKAWS 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 Core 軟體授權合約

另請參閱