Am Ende dieses Kapitels sollte Ihre serverlose Anwendung Folgendes tun:
Die folgenden Schritte führen Sie durch die Erstellung einer serverlosen Funktion in AWS Lambda. Die Funktion definiert einen kleinen Code-Ausschnitt, das Geräteschattenmeldungen vom IoT Core erwartet und diese in Nachrichtenfür den ML-Endpunkt umwandelt. Damit rufen Sie Ihren ML-Endpunkt auf, um die Klassifikation von roomOccupancy und den Konfidenz-Wert der Inferenz zurückzugeben.
ClassifyRoomOccupancy
aus.import json
import boto3
import os
# Receives a device shadow Accepted document from IoT Core rules engine.
# Event has signature like {"state": {"reported": {"sound": 5}}}.
# See expectedAttributes for full list of attributes expected in state.reported.
# Builds CSV input to send to SageMaker endpoint, name of which stored in
# environment variable SAGEMAKER_ENDPOINT.
#
# Returns the prediction and confidence score from the ML model endpoint.
def lambda_handler(event, context):
client = boto3.client('sagemaker-runtime')
print('event received: {}'.format(event))
# Order of attributes must match order expected by ML model endpoint. E.g.
# the same order of columns used to train the model.
expectedAttributes = ['sound', 'temperature', 'hvacStatus', 'roomOccupancy', 'timestamp']
reported = event['state']['reported']
reported['timestamp'] = event['timestamp']
reportedAttributes = reported.keys()
# Validates the input event has all the expected attributes.
if(len(set(expectedAttributes) & set(reportedAttributes)) < len(expectedAttributes)):
return {
'statusCode': 400,
'body': 'Error: missing attributes from event. Expected: {}. Received: {}.'.format(','.join(expectedAttributes), ','.join(reportedAttributes))
}
# Build the input CSV string to send to the ML model endpoint.
reportedValues = []
for attr in expectedAttributes:
reportedValues.append(str(reported[attr]))
input = ','.join(reportedValues)
print('sending this input for inference: {}'.format(input))
endpoint_name = os.environ['SAGEMAKER_ENDPOINT']
content_type = "text/csv"
accept = "application/json"
payload = input
response = client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType=content_type,
Accept=accept,
Body=payload
)
body = response['Body'].read()
print('received this response from inference endpoint: {}'.format(body))
return {
'statusCode': 200,
'body': json.loads(body)['predictions'][0]
}
SAGEMAKER_ENDPOINT
ein und für Wert geben Sie den Namen Ihres SageMaker-Endpoints ein. Sie haben diese Ressource als letzten Schritt des vorherigen Kapitels benannt und dieses Modul geht davon aus, dass der Name RoomOccupancyEndPoint
ist.thermostatRule
trägt.InvokeSageMakerEndPoint
und wählen Sie Richtlinie erstellen. Sie können diesen neuen Browser-Tab jetzt schließen.Diese Schritte schließen die Konfiguration Ihrer AWS Lambda-Funktion ab. Die Lambda-Funktion erhält nun Device Shadow Updates, wie zum Beispiel:
{
"state": {
"reported": {
"sound": 20,
"temperature": 58.8,
"hvacStatus": "HEATING",
"roomOccupancy": true
}
},
"timestamp": 1234567890
}
Diese Antwort wird zurückgegeben, nachdem der SageMaker-Endpunkt aufgerufen wurde:
{
"statusCode": 200,
"body": {
"predicted_label": "false",
"probability": "0.9999991655349731"
}
}
Der nächste Schritt besteht darin, Ihre IoT-Core-Regel (angenommener Name von thermostatRule
) zu aktualisieren, um diese Lambda-Funktionsintegration zu verwenden.
SELECT CASE state.reported.sound > 10 WHEN true THEN true ELSE false END AS state.desired.roomOccupancy FROM '$aws/things/<<CLIENT_ID>>/shadow/update/accepted' WHERE state.reported.sound <> Null
.SELECT cast(get(get(aws_lambda("arn\:aws\:lambda\:REGION\:ACCOUNT_ID\:function\:FUNCTION_NAME", *), "body"), "predicted_label") AS Boolean) AS state.desired.roomOccupancy FROM '$aws/things/<<CLIENT_ID>>/shadow/update/accepted' WHERE state.reported.sound <> Null
ClassifyRoomOccupancy
). Vergessen Sie nicht, den «CLIENT_ID» Platzhalter auch im FROM-Teil zu aktualisieren.Zu diesem Zeitpunkt nutzt Ihr IoT-Workflow Ihr trainiertes Modell für maschinelles Lernen von seinem bereitgestellten Endpunkt aus, um von Ihrem intelligenten Thermostat veröffentlichte Nachrichten als neue RoomOccupancy-Werte zu klassifizieren!
Bevor Sie mit dem nächsten Kapitel fortfahren, können Sie überprüfen, ob Ihre serverlose Anwendung wie vorgesehen konfiguriert ist:
$aws/things/<<CLIENT_ID>>/shadow/update
zu abonnieren (ersetzt Ihr «CLIENT_ID») und Sie sollten hier zwei Arten von Nachrichten sehen. Die erste ist die von Ihrem intelligenten Thermostat veröffentlichte Information mit dem Pfad state.reported
. Die andere ist die Information, die jetzt von Ihrer Thermostatregel mit dem von Ihrem ML-Modell bestimmten Wert state.desired.roomOccupancy
veröffentlicht wird.Wenn dies wie erwartet funktionieren, haben Sie dieses Modul abgeschlossen und können mit dem [Fazit] (/smart-spaces/conclusion.html) fortfahren.
AWS IoT Kit now features direct access to
AWS re:Post
, which is a community-driven, questions-and-answers service. Search re:Post using the
AWS IoT Kit
tag to see if your question has been asked and answered. If not, ask a new question using the AWS IoT Kit
tag.