

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS IoT Greengrass V2 구성 요소 생성
<a name="edge-greengrass-custom-component"></a>

AWS IoT Greengrass 는 AWS IoT Greengrass 코어 디바이스에 배포되고 실행되는 소프트웨어 모듈인 *구성 요소를* 사용합니다. 최소 세 가지의 구성 요소가 필요합니다.

1. *Edge Manager 에이전트바이너리를 배포하는 퍼블릭 Edge Manager 에이전트 AWS IoT Greengrass 구성 요소입니다*.

1.  AWS SDK for Python (Boto3) API 또는 SageMaker AI 콘솔을 사용하여 기계 학습 모델을 패키징할 때 자동으로 생성되는 모델 *구성 요소입니다*. 자세한 내용은 [자동 생성 구성 요소 생성](#edge-greengrass-autogenerate-component-how) 단원을 참조하세요.

1. Edge Manager 에이전트 클라이언트 애플리케이션을 구현하고 추론 결과의 사전 처리 및 사후 처리를 수행하는 *프라이빗 사용자 지정 구성 요소*. 사용자 지정 구성 요소를 생성하는 방법에 대한 자세한 내용은 [자동 생성 구성 요소 생성](#edge-greengrass-autogenerate-component-how) 또는 [사용자 지정 AWS IoT Greengrass 구성 요소 생성을](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html) 참조하세요.

## 자동 생성 구성 요소 생성
<a name="edge-greengrass-autogenerate-component-how"></a>

[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html) API로 모델 구성 요소를 생성하고 `GreengrassV2Component`을(를) SageMaker Edge Manager 패키징 작업 API 필드 `PresetDeploymentType`에 지정합니다. `CreateEdgePackagingJob` API를 직접적으로 호출하면 Edge Manager는 Amazon S3에서 SageMaker AI Neo로 컴파일된 모델을 가져와 모델 구성 요소를 만듭니다. 모델 구성 요소는 사용자 계정에 자동으로 저장됩니다. AWS IoT 콘솔 [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) 이동하여 구성 요소를 볼 수 있습니다. **Greengrass**를 선택한 다음 **코어** 디바이스를 선택합니다. 이 페이지에는 계정과 연결된 AWS IoT Greengrass 코어 디바이스 목록이 있습니다. `PresetDeploymentConfig`에서 모델 구성 요소 이름을 지정하지 않은 경우, 생성되는 기본 이름은 `"SagemakerEdgeManager"` 및 Edge Manager 에이전트 패키징 작업 이름으로 구성됩니다. 다음 예제에서는 `CreateEdgePackagingJob` API를 사용하여 a AWS IoT Greengrass V2 구성 요소를 생성하기 위해를 Edge Manager에 지정하는 방법을 보여줍니다.

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

또한 SageMaker AI 콘솔로 자동 생성 구성 요소를 만들 수 있습니다. [모델 패키징(Amazon SageMaker AI 콘솔)](edge-packaging-job-console.md)의 1\$16단계를 따릅니다.

패키징 작업의 출력과 선택 암호화 키를 저장할 Amazon S3 버킷 URI를 입력합니다.

다음을 완료하여 모델 구성 요소를 생성합니다.

1. **배포 사전 설정**을 선택합니다.

1. 구성 요소 이름을 **구성 요소 이름** 필드에 지정합니다.

1. 선택적으로 **구성 요소 설명**, **구성 요소 버전**, **플랫폼 OS**, **플랫폼 아키텍처**에 각각 구성 요소 설명, 구성 요소 버전, 플랫폼 OS 또는 플랫폼 아키텍처를 입력합니다.

1. **제출**을 선택합니다.

## Hello World 사용자 지정 구성 요소 생성
<a name="edge-greengrass-create-custom-component-how"></a>

사용자 지정 애플리케이션 구성 요소는 엣지 디바이스에서 추론 수행 시 사용됩니다. SageMaker Edge Manager에 모델을 로드하고, 추론을 위해 Edge Manager 에이전트를 호출하고, 구성 요소가 종료될 때 모델을 언로드하는 역할을 합니다. 구성 요소를 생성하기 전에 에이전트와 애플리케이션이 Edge Manager와 통신할 수 있는지 확인합니다. 이 작업을 수행하려면 [gRPC](https://grpc.io/)를 구성합니다. Edge Manager 에이전트는 Protobuf 버퍼 및 gRPC 서버에 정의된 메서드를 사용하여 엣지 디바이스 및 클라우드의 클라이언트 애플리케이션과 통신을 설정합니다.

gRPC를 사용하려면 다음을 수행해야 합니다.

1. Amazon S3 릴리스 버킷에서 Edge Manager 에이전트를 다운로드할 때 입력된 .proto 파일을 사용하여 gRPC 스터브를 생성합니다.

1. 선호하는 언어로 클라이언트 코드를 작성합니다.

.proto 파일에 서비스를 정의할 필요는 없습니다. Amazon S3 릴리스 버킷에서 Edge Manager 에이전트 릴리스 바이너리를 다운로드할 때 서비스 .proto 파일이 압축된 TAR 파일에 포함됩니다.

호스트 머신에 gRPC 및 기타 필요한 도구를 설치하고 Python에서 GrPC 스터브 `agent_pb2_grpc.py`, `agent_pb2.py`을(를) 생성합니다. 로컬 디렉터리에 `agent.proto`이(가) 있는지 확인하세요.

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

이전 코드는 .proto 서비스 정의에서 gRPC 클라이언트 및 서버 인터페이스를 생성합니다. 즉, Python에서 gRPC 모델을 생성합니다. API 디렉터리에는 에이전트와 통신하기 위한 Protobuf 사양이 포함되어 있습니다.

다음으로 gRPC API로 서비스 (2) 클라이언트 및 서버를 작성합니다. 다음 예제 스크립트 `edge_manager_python_example.py`에서는 Python을 사용하여 `yolov3` 모델을 로드하고 나열하고 엣지 디바이스로 언로드합니다.

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

동일한 클라이언트 코드 예제를 사용하는 경우가 모델을 포함하는 AWS IoT Greengrass 구성 요소의 이름을 `model_path` 가리키는지 확인합니다.

gRPC 스텁을 생성하고 Hello World 코드를 준비하면 AWS IoT Greengrass V2 Hello World 구성 요소를 생성할 수 있습니다. 그렇게 하려면 다음을 수행하세요.
+ `edge_manager_python_example.py`, `agent_pb2_grpc.py`, `agent_pb2.py`을(를) Amazon S3 버킷에 업로드하고 Amazon S3 경로를 기록해 둡니다.
+  AWS IoT Greengrass V2 콘솔에서 프라이빗 구성 요소를 생성하고 구성 요소의 레시피를 정의합니다. 다음 레시피에 따라 Hello World 애플리케이션과 gRPC 스터브에 Amazon S3 URI를 지정합니다.

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

Hello World 레시피 생성에 대한 자세한 내용은 AWS IoT Greengrass 설명서의 [첫 번째 구성 요소 생성을 참조하세요](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#create-first-component).