

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Erstellen Sie die V2-Komponenten AWS IoT Greengrass
<a name="edge-greengrass-custom-component"></a>

AWS IoT Greengrass verwendet *Components*, ein Softwaremodul, das auf einem AWS IoT Greengrass Kerngerät bereitgestellt wird und auf diesem ausgeführt wird. Sie brauchen (mindestens) drei Komponenten:

1. *Eine öffentliche Edge Manager AWS IoT Greengrass Agent-Komponente*, die die Edge Manager-Agent-Binärdatei bereitstellt.

1. *Eine Modellkomponente*, die automatisch generiert wird, wenn Sie Ihr Modell für maschinelles Lernen entweder mit der AWS SDK für Python (Boto3) API oder mit der SageMaker KI-Konsole paketieren. Weitere Informationen finden Sie unter [Eine automatisch generierte Komponente erstellen](#edge-greengrass-autogenerate-component-how).

1. *Eine private, benutzerdefinierte Komponente* zur Implementierung der Edge Manager-Agenten-Client-Anwendung und zur Vor- und Nachverarbeitung der Inference-Ergebnisse. Weitere Informationen zum Erstellen einer benutzerdefinierten Komponente finden Sie unter [Eine automatisch generierte Komponente erstellen](#edge-greengrass-autogenerate-component-how) oder [Benutzerdefinierte AWS IoT Greengrass Komponenten erstellen](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html).

## Eine automatisch generierte Komponente erstellen
<a name="edge-greengrass-autogenerate-component-how"></a>

Generieren Sie die Modellkomponente mit der [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html)API und geben Sie sie `GreengrassV2Component` für das API-Feld für den SageMaker Edge-Manager-Paketauftrag an`PresetDeploymentType`. Wenn Sie die `CreateEdgePackagingJob` API aufrufen, verwendet Edge Manager Ihr mit SageMaker AI Neo kompiliertes Modell in Amazon S3 und erstellt eine Modellkomponente. Die Modellkomponente wird automatisch in Ihrem Konto gespeichert. Sie können sich jede Ihrer Komponenten ansehen, indem Sie zur Konsole navigieren. AWS IoT [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) Wählen Sie **Greengrass** und dann **Core-Geräte** aus. Die Seite enthält eine Liste der AWS IoT Greengrass wichtigsten Geräte, die mit Ihrem Konto verknüpft sind. Wenn in `PresetDeploymentConfig` kein Name einer Modellkomponente angegeben ist, besteht der erzeugte Standardname aus `"SagemakerEdgeManager"` und dem Namen des Paketerstellungsauftrags für Ihren Edge Manager-Agenten. Das folgende Beispiel zeigt, wie Sie Edge Manager angeben, eine AWS IoT Greengrass V2-Komponente mit der `CreateEdgePackagingJob` API zu erstellen.

```
import sagemaker
import boto3

# Create a SageMaker client object to make it easier to interact with other AWS services.
sagemaker_client = boto3.client('sagemaker', region=<YOUR_REGION>)

# Replace with your IAM Role ARN
sagemaker_role_arn = "arn:aws:iam::<account>:role/*"

# Replace string with the name of your already created S3 bucket.
bucket = 'amzn-s3-demo-bucket-edge-manager'

# Specify a name for your edge packaging job.
edge_packaging_name = "edge_packag_job_demo" 

# Replace the following string with the name you used for the SageMaker Neo compilation job.
compilation_job_name = "getting-started-demo" 

# The name of the model and the model version.
model_name = "sample-model" 
model_version = "1.1"

# Output directory in S3 where you want to store the packaged model.
packaging_output_dir = 'packaged_models' 
packaging_s3_output = 's3://{}/{}'.format(bucket, packaging_output_dir)

# The name you want your Greengrass component to have.
component_name = "SagemakerEdgeManager" + edge_packaging_name

sagemaker_client.create_edge_packaging_job(
                    EdgePackagingJobName=edge_packaging_name,
                    CompilationJobName=compilation_job_name,
                    RoleArn=sagemaker_role_arn,
                    ModelName=model_name,
                    ModelVersion=model_version,
                    OutputConfig={
                        "S3OutputLocation": packaging_s3_output,
                        "PresetDeploymentType":"GreengrassV2Component",
                        "PresetDeploymentConfig":"{\"ComponentName\":\"sample-component-name\", \"ComponentVersion\":\"1.0.2\"}"
                        }
                    )
```

Sie können die automatisch generierte Komponente auch mit der SageMaker AI-Konsole erstellen. Folgen Sie den Schritten 1-6 in [Ein Modell verpacken (Amazon SageMaker AI Console)](edge-packaging-job-console.md)

Geben Sie den Amazon-S3-Bucket URI ein, wo Sie die Ausgabe des Paketerstellungsauftrags speichern möchten, und geben Sie den optionalen Verschlüsselungsschlüssel ein.

Gehen Sie wie folgt vor, um die Modellkomponente zu erstellen:

1. Wählen Sie **Voreingestellte Bereitstellung** aus.

1. Geben Sie den Namen der Komponente in das Feld **Name der Komponente** ein.

1. Geben Sie optional eine Beschreibung der Komponente, eine Komponentenversion, das Plattform-Betriebssystem oder die Plattformarchitektur für die **Beschreibung der Komponente**, die **Komponentenversion**, das **Plattform-Betriebssystem** bzw. die **Plattformarchitektur** ein.

1. Wählen Sie **Absenden** aus.

## Erstellen Sie eine benutzerdefinierte Komponente zur Begrüßung
<a name="edge-greengrass-create-custom-component-how"></a>

Die benutzerdefinierte Anwendungskomponente wird für Inferences auf dem Edge-Gerät verwendet. Die Komponente ist dafür verantwortlich, Modelle in SageMaker Edge Manager zu laden, den Edge Manager-Agenten zur Inferenz aufzurufen und das Modell zu entladen, wenn die Komponente heruntergefahren wird. Bevor Sie Ihre Komponente erstellen, stellen Sie sicher, dass der Agent und die Anwendung mit Edge Manager kommunizieren können. Konfigurieren Sie dazu [gRPC](https://grpc.io/). Der Edge Manager-Agent verwendet Methoden, die in Protobuf Buffers und auf dem gRPC-Server definiert sind, um die Kommunikation mit der Client-Anwendung auf dem Edge-Gerät und in der Cloud herzustellen.

Um gRPC zu verwenden, müssen Sie:

1. Mit Hilfe der .proto-Datei, die beim Herunterladen des Edge Manager-Agenten aus dem Amazon S3-Release-Bucket bereitgestellt wurde, einen gRPC-Stub erstellen.

1. Schreiben Sie den Client-Code in Ihrer bevorzugten Sprache.

Sie müssen den Dienst nicht in einer .proto-Datei definieren. Die .proto-Dateien des Service sind in der komprimierten TAR-Datei enthalten, wenn Sie die Binärdatei mit der Version des Edge Manager-Agents aus dem Amazon S3-Release-Bucket herunterladen.

Installieren Sie gRPC und sonstige notwendige Tools auf Ihrem Host-Computer und erstellen Sie die gRPC-Stubs `agent_pb2_grpc.py` und `agent_pb2.py` in Python. Vergewissern Sie sich, dass Sie `agent.proto` in Ihrem lokalen Verzeichnis haben.

```
%%bash
pip install grpcio
pip install grpcio-tools
python3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. agent.proto
```

Der obige Code erzeugt die gRPC-Client- und Serverschnittstellen anhand Ihrer .proto-Servicedefinition. Mit anderen Worten, er erstellt das gRPC-Modell in Python. Das API-Verzeichnis enthält die Protobuf-Spezifikation für die Kommunikation mit dem Agenten.

Schreiben Sie als Nächstes mit Hilfe der gRPC-API einen Client und einen Server für Ihren Service (2). Das folgende Beispielskript, `edge_manager_python_example.py`, verwendet Python zum Laden, Auflisten und Entladen eines `yolov3` Modells auf dem Edge-Gerät.

```
import grpc
from PIL import Image
import agent_pb2
import agent_pb2_grpc
import os


model_path = '<PATH-TO-SagemakerEdgeManager-COMPONENT>' 
                    
agent_socket = 'unix:///tmp/aws.greengrass.SageMakerEdgeManager.sock'

agent_channel = grpc.insecure_channel(agent_socket, options=(('grpc.enable_http_proxy', 0),))

agent_client = agent_pb2_grpc.AgentStub(agent_channel)


def list_models():
    return agent_client.ListModels(agent_pb2.ListModelsRequest())


def list_model_tensors(models):
    return {
        model.name: {
            'inputs': model.input_tensor_metadatas,
            'outputs': model.output_tensor_metadatas
        }
        for model in list_models().models
    }


def load_model(model_name, model_path):
    load_request = agent_pb2.LoadModelRequest()
    load_request.url = model_path
    load_request.name = model_name
    return agent_client.LoadModel(load_request)


def unload_model(name):
    unload_request = agent_pb2.UnLoadModelRequest()
    unload_request.name = name
    return agent_client.UnLoadModel(unload_request)


def predict_image(model_name, image_path):
    image_tensor = agent_pb2.Tensor()
    image_tensor.byte_data = Image.open(image_path).tobytes()
    image_tensor_metadata = list_model_tensors(list_models())[model_name]['inputs'][0]
    image_tensor.tensor_metadata.name = image_tensor_metadata.name
    image_tensor.tensor_metadata.data_type = image_tensor_metadata.data_type
    for shape in image_tensor_metadata.shape:
        image_tensor.tensor_metadata.shape.append(shape)
    predict_request = agent_pb2.PredictRequest()
    predict_request.name = model_name
    predict_request.tensors.append(image_tensor)
    predict_response = agent_client.Predict(predict_request)
    return predict_response

def main():
    try:
        unload_model('your-model')
    except:
        pass
  
    print('LoadModel...', end='')
    try:
        load_model('your-model', model_path)
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('Model already loaded!')
        
    print('ListModels...', end='')
    try:
        print(list_models())
        print('done.')
        
    except Exception as e:
        print()
        print(e)
        print('List model failed!')
       
    print('Unload model...', end='')
    try:
        unload_model('your-model')
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('unload model failed!')

if __name__ == '__main__':
    main()
```

`model_path`Stellen Sie sicher, dass auf den Namen der AWS IoT Greengrass Komponente verweist, die das Modell enthält, wenn Sie dasselbe Client-Codebeispiel verwenden.

Sie können Ihre AWS IoT Greengrass V2 Hello World-Komponente erstellen, sobald Sie Ihre gRPC-Stubs generiert haben und Ihren Hello World-Code bereit haben. Gehen Sie hierzu wie folgt vor:
+ Laden Sie Ihr `edge_manager_python_example.py`, `agent_pb2_grpc.py` und `agent_pb2.py` auf Ihren Amazon-S3-Bucket hoch und notieren Sie sich deren Amazon S3-Pfad.
+ Erstellen Sie eine private Komponente in der AWS IoT Greengrass V2-Konsole und definieren Sie das Rezept für Ihre Komponente. Geben Sie im folgenden Rezept den Amazon-S3-URI für Ihre Begrüßungsanwendung und den gRPC-Stub an.

  ```
  ---
  RecipeFormatVersion: 2020-01-25
  ComponentName: com.sagemaker.edgePythonExample
  ComponentVersion: 1.0.0
  ComponentDescription: Sagemaker Edge Manager Python example
  ComponentPublisher: Amazon Web Services, Inc.
  ComponentDependencies:
    aws.greengrass.SageMakerEdgeManager:
      VersionRequirement: '>=1.0.0'
      DependencyType: HARD
  Manifests:
    - Platform:
        os: linux
        architecture: "/amd64|x86/"
      Lifecycle:
        install: |-
          apt-get install python3-pip
          pip3 install grpcio
          pip3 install grpcio-tools
          pip3 install protobuf
          pip3 install Pillow
        run:
          script: |- 
            python3 {artifacts:path}/edge_manager_python_example.py
      Artifacts:
        - URI: <code-s3-path>
        - URI: <pb2-s3-path>
        - URI: <pb2-grpc-s3-path>
  ```

Ausführliche Informationen zum Erstellen eines Hello-World-Rezepts finden [Sie in der AWS IoT Greengrass Dokumentation unter Erstellen Sie Ihre erste Komponente](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#create-first-component).