

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cree los componentes de la V2 AWS IoT Greengrass
<a name="edge-greengrass-custom-component"></a>

AWS IoT Greengrass utiliza *componentes*, un módulo de software que se implementa y se ejecuta en un dispositivo AWS IoT Greengrass principal. Necesita (como mínimo) tres componentes:

1. *Un AWS IoT Greengrass componente público del agente de Edge Manager* que implementa el binario del agente de Edge Manager.

1. *Un componente de modelo* que se genera automáticamente al empaquetar el modelo de aprendizaje automático con la AWS SDK para Python (Boto3) API o con la consola de IA. SageMaker Para obtener información, consulte [Crear un componente generado automáticamente](#edge-greengrass-autogenerate-component-how).

1. *Un componente privado y personalizado* para implementar la aplicación cliente del agente de Edge Manager y realizar cualquier procesamiento previo y posterior de los resultados de la inferencia. Para obtener más información sobre cómo crear un componente personalizado, consulta [Crear un componente generado automáticamente](#edge-greengrass-autogenerate-component-how) o [Crear AWS IoT Greengrass componentes personalizados](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html).

## Crear un componente generado automáticamente
<a name="edge-greengrass-autogenerate-component-how"></a>

Genere el componente del modelo con la [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html)API y especifique `GreengrassV2Component` el campo API del trabajo de empaquetado de SageMaker Edge Manager`PresetDeploymentType`. Cuando llamas a la `CreateEdgePackagingJob` API, Edge Manager toma tu modelo compilado con SageMaker AI NEO en Amazon S3 y crea un componente de modelo. El componente del modelo se almacena automáticamente en su cuenta. Puede ver cualquiera de sus componentes navegando a la consola. AWS IoT [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) Seleccione **Greengrass** y, a continuación, seleccione Dispositivos **principales**. La página contiene una lista de los dispositivos AWS IoT Greengrass principales asociados a tu cuenta. Si no se especifica el nombre de un componente del modelo en `PresetDeploymentConfig`, el nombre predeterminado generado será `"SagemakerEdgeManager"` y el nombre del trabajo de empaquetado del agente de Edge Manager. En el siguiente ejemplo, se muestra cómo especificar a Edge Manager la creación de un componente AWS IoT Greengrass V2 con la `CreateEdgePackagingJob` API.

```
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\"}"
                        }
                    )
```

También puede crear el componente generado automáticamente con la consola SageMaker AI. Siga los pasos del 1 al 6 en [Package a model (Amazon SageMaker AI Console)](edge-packaging-job-console.md)

Introduzca el URI del bucket de Amazon S3 en el que desea almacenar el resultado del trabajo de empaquetado y la clave de cifrado opcional.

Complete lo siguiente para crear el componente del modelo:

1. Seleccione **Implementación preestablecida**.

1. Especifique el nombre del componente en el campo **Nombre del componente**.

1. Si lo desea, proporcione una descripción del componente, una versión del componente, el sistema operativo de la plataforma o la arquitectura de la plataforma para la **Descripción del componente**, **Versión del componente**, **Sistema operativo de la plataforma** y **Arquitectura de la plataforma**, respectivamente.

1. Seleccione **Enviar**.

## Crear un componente personalizado de Hello World
<a name="edge-greengrass-create-custom-component-how"></a>

El componente de aplicación personalizado se utiliza para realizar inferencias en el dispositivo periférico. El componente se encarga de cargar los modelos en SageMaker Edge Manager, de invocar al agente de Edge Manager para realizar inferencias y de descargar el modelo cuando el componente está apagado. Antes de crear el componente, asegúrese de que el agente y la aplicación puedan comunicarse con Edge Manager. Para ello, configure [gRPC](https://grpc.io/). El agente de Edge Manager utiliza los métodos definidos en los búferes de Protobuf y el servidor gRPC para establecer la comunicación con la aplicación cliente en el dispositivo periférico y en la nube.

Para usar gRPC, debe:

1. Crear un código auxiliar de gRPC con el archivo .proto que se proporciona al descargar el agente de Edge Manager del bucket de versiones de Amazon S3.

1. Escribir el código del cliente en el idioma que prefiera.

No es necesario definir el servicio en un archivo .proto. Los archivos .proto del servicio se incluyen en el archivo TAR comprimido al descargar el binario de la versión del agente de Edge Manager del bucket de versiones de Amazon S3.

Instalar gRPC y otras herramientas necesarias en su máquina host y cree los stubs `agent_pb2_grpc.py` y `agent_pb2.py` de gRP en Python. Asegúrese de tener `agent.proto` en su directorio local.

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

El código anterior genera las interfaces de cliente y servidor gRPC a partir de la definición de servicio .proto. Es decir, crea el modelo gRPC en Python. El directorio de la API contiene la especificación Protobuf para comunicarse con el agente.

A continuación, use la API gRPC para escribir un cliente y un servidor para su servicio (2). El siguiente script de ejemplo, `edge_manager_python_example.py`, usa Python para cargar, enumerar y descargar un modelo `yolov3` en el dispositivo periférico.

```
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()
```

Asegúrese de que `model_path` apunta al nombre del AWS IoT Greengrass componente que contiene el modelo si utiliza el mismo ejemplo de código de cliente.

Puedes crear tu componente Hello World AWS IoT Greengrass V2 una vez que hayas generado tus stubs de gRPC y tengas listo tu código de Hello World. Para ello:
+ Suba sus `edge_manager_python_example.py`, `agent_pb2_grpc.py` y `agent_pb2.py` a su bucket de Amazon S3 y anote su ruta de Amazon S3.
+ Crea un componente privado en la consola AWS IoT Greengrass V2 y define la receta para tu componente. Especifique el URI de Amazon S3 para su aplicación Hello World y su stub de gRPC en la siguiente fórmula.

  ```
  ---
  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>
  ```

Para obtener información detallada sobre cómo crear una receta de Hello World, consulte [Crear su primer componente](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#create-first-component) en la AWS IoT Greengrass documentación.