AWS IoT Greengrass V2 구성 요소 생성 - Amazon SageMaker

AWS IoT Greengrass V2 구성 요소 생성

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

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

  2. 모델 구성 요소(AWS SDK for Python (Boto3) API 또는 SageMaker console로 기계 학습 모델 패키징 시 자동 생성). 자세한 내용은 자동 생성 구성 요소 생성을 참조하세요.

  3. Edge Manager 에이전트 클라이언트 애플리케이션을 구현하고 추론 결과의 사전 처리 및 사후 처리를 수행하는 프라이빗 사용자 지정 구성 요소. 사용자 지정 구성 요소 생성 방법에 대한 자세한 정보는 자동 생성 구성 요소 생성 또는 사용자 지정 AWS IoT Greengrass 구성 요소 생성하기에서 확인하세요.

자동 생성 구성 요소 생성

CreateEdgePackagingJob API로 모델 구성 요소를 생성하고 GreengrassV2Component을(를) SageMaker Edge Manager 패키징 작업 API 필드 PresetDeploymentType에 지정합니다. CreateEdgePackagingJob API를 호출하면 Edge Manager는 Amazon S3에서 SageMakerNeo로 컴파일된 모델을 가져와 모델 구성 요소를 생성합니다. 모델 구성 요소는 사용자 계정에 자동으로 저장됩니다. AWS IoT 콘솔(https://console.aws.amazon.com/iot/)로 이동하여 모든 구성 요소를 볼 수 있습니다. Greengrass를 선택한 다음 코어 디바이스를 선택합니다. 페이지에는 계정과 관련된 AWS IoT Greengrass 코어 디바이스 목록이 있습니다. PresetDeploymentConfig에서 모델 구성 요소 이름을 지정하지 않은 경우, 생성되는 기본 이름은 "SagemakerEdgeManager" 및 Edge Manager 에이전트 패키징 작업 이름으로 구성됩니다. 다음 예제에서 CreateEdgePackagingJob API로 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 = 'edge-manager-amzn-s3-demo-bucket' # 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 Console로 자동 생성 구성 요소를 생성할 수도 있습니다. 모델 패키징(Amazon SageMaker Console)의 1~6단계를 따릅니다.

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

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

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

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

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

  4. 제출을 선택합니다.

Hello World 사용자 지정 구성 요소 생성

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

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

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

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

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

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

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 설명서 내)에서 확인하세요.