

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

# Edge Manager 에이전트
<a name="edge-device-fleet-about"></a>

Edge Manager 에이전트는 엣지 디바이스용 추론 엔진입니다. 에이전트를 사용하면 엣지 디바이스에 로드된 모델로 예측을 수행할 수 있습니다. 또한 에이전트는 모델 지표를 수집하고 특정 간격으로 데이터를 캡처합니다. 샘플 데이터는 Amazon S3 버킷에 저장됩니다.

Edge Manager 에이전트를 엣지 디바이스에 설치하고 배포하는 방법은 두 가지입니다.

1. Amazon S3 릴리스 버킷에서 에이전트를 바이너리로 다운로드합니다. 자세한 내용은 [Edge Manager 에이전트를 수동으로 다운로드하고 설정합니다.](edge-device-fleet-manual.md) 단원을 참조하십시오.

1.  AWS IoT Greengrass V2 콘솔 또는를 사용하여 AWS CLI 를 배포합니다`aws.greengrass.SageMakerEdgeManager`. [AWS IoT Greengrass V2 구성 요소 생성](edge-greengrass-custom-component.md)을(를) 참조하세요.

# Edge Manager 에이전트를 수동으로 다운로드하고 설정합니다.
<a name="edge-device-fleet-manual"></a>

운영 체제, 아키텍처 및 AWS 리전에 따라 Edge Manager 에이전트를 다운로드합니다. 에이전트는 주기적으로 업데이트되므로 릴리스 날짜 및 버전에 따라 에이전트를 선택할 수 있습니다. 에이전트가 준비되면 JSON 구성 파일을 생성합니다. 디바이스 IoT 사물 이름, 플릿 이름, 디바이스 자격 증명 및 기타 키-값 쌍을 지정합니다. [Edge Manager 에이전트 실행](#edge-device-fleet-running-agent)에서 구성 파일에 지정해야 하는 키의 전체 목록을 확인합니다. 에이전트를 실행 가능한 바이너리로 실행하거나 동적 공유 객체(DSO)에 대한 링크로 실행할 수 있습니다.

## 에이전트 작동 방법
<a name="edge-device-fleet-how-agent-works"></a>

에이전트는 디바이스의 CPU에서 실행됩니다. 에이전트는 컴파일 작업 중에 지정한 대상 디바이스의 프레임워크와 하드웨어에서 추론을 실행합니다. 예를 들어, Jetson Nano용으로 모델을 컴파일한 경우 에이전트는 입력된 [딥 러닝 런타임](https://github.com/neo-ai/neo-ai-dlr)(DLR) 에서 GPU를 지원합니다.

지원되는 운영 체제에 따라 에이전트는 바이너리 형식으로 릴리스됩니다. 운영 체제가 지원되고 다음 테이블의 최소 OS 요구 사항을 충족하는지 확인하세요.

------
#### [ Linux ]

**버전:** Ubuntu 18.04

**지원되는 바이너리 형식:** x86-64비트(ELF 바이너리) 및 ARMv8 64비트(ELF 바이너리)

------
#### [ Windows ]

**버전:** 윈도우 10 버전 1909

**지원되는 바이너리 형식:** x86-32비트(DLL) 및 x86-64비트(DLL)

------

## Edge Manager 에이전트 설치
<a name="edge-device-fleet-installation"></a>

Edge Manager 에이전트를 사용하려면 먼저 릴리스 아티팩트와 루트 인증서를 확보해야 합니다. 릴리스 아티팩트는 `us-west-2` 리전에 있는 Amazon S3 버킷에 저장됩니다. 아티팩트를 다운로드하려면 운영 체제(`<OS>`)와 `<VERSION>`을(를) 지정합니다.

운영 체제에 따라 `<OS>`을(를) 다음 중 하나로 바꿉니다.


| Windows 32비트 | Windows 64비트 | Linux x86-64 | Linux ARMv8 | 
| --- | --- | --- | --- | 
| windows-x86 | windows-x64 | linux-x64 | linux-armv8 | 

`VERSION`은(는) 세 가지 구성 요소 `<MAJOR_VERSION>.<YYYY-MM-DD>-<SHA-7>`(으)로 구분됩니다.
+ `<MAJOR_VERSION>`: 릴리스 버전. 릴리스 버전은 현재 `1`(으)로 설정되어 있습니다.
+ `<YYYY-MM-DD>`: 아티팩트 릴리스의 타임스탬프.
+ `<SHA-7>`: 릴리스가 빌드된 리포지토리 커밋 ID.

`<MAJOR_VERSION>` 및 타임스탬프를 `YYYY-MM-DD` 형식으로 입력해야 합니다. 최신 아티팩트 릴리스 타임스탬프를 사용할 것을 추천합니다.

명령줄에서 다음을 실행하여 최신 타임스탬프를 가져옵니다. `<OS>`을(를) 사용자의 운영 체제로 바꿉니다.

```
aws s3 ls s3://sagemaker-edge-release-store-us-west-2-<OS>/Releases/ | sort -r
```

예를 들어, Windows 32비트 OS 사용 시

```
aws s3 ls s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/ | sort -r
```

반환:

```
2020-12-01 23:33:36 0 

                    PRE 1.20201218.81f481f/
                    PRE 1.20201207.02d0e97/
```

이 예제의 반환 출력에는 두 개의 릴리스 아티팩트가 표시됩니다. 첫 번째 릴리스 아티팩트 파일은 릴리스 버전의 주요 릴리스 버전 `1`, 타임스탬프 `20201218`(YYYY-MM-DD 형식) 및 `81f481f` SHA-7 커밋 ID를 기록합니다.

**참고**  
이전 명령은 사용자가 AWS Command Line Interface을(를) 구성했다고 가정합니다. 가 상호 작용하는 데 AWS CLI 사용하는 설정을 구성하는 방법에 대한 자세한 내용은 CLI 구성을 AWS참조하세요. [AWS](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-configure.html) 

운영 체제에 따라 다음 명령으로 아티팩트를 설치합니다.

------
#### [ Windows 32-bit ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/<VERSION>/<VERSION>.zip .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Windows 64-bit ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x64/Releases/<VERSION>/<VERSION>.zip .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x64/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Linux x86-64 ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Releases/<VERSION>/<VERSION>.tgz .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Linux ARMv8 ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-armv8/Releases/<VERSION>/<VERSION>.tgz .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-armv8/Releases/<VERSION>/sha256_hex.shasum .
```

------

또한 루트 인증서를 다운로드해야 합니다. 이 인증서는 엣지 디바이스에 로드 AWS 하기 전에에서 서명한 모델 아티팩트를 검증합니다.

`<OS>`을(를) 지원되는 운영 체제 목록에 있는 사용 중인 플랫폼으로 바꾸고 `<REGION>`을(를) 사용 중인 AWS 리전으로 바꿉니다.

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-<OS>/Certificates/<REGION>/<REGION>.pem .
```

## Edge Manager 에이전트 실행
<a name="edge-device-fleet-running-agent"></a>

SageMaker AI Edge Manager 에이전트를 실행 가능 및 연결 가능 형식(ELF)의 실행 가능 바이너리 형태의 독립 실행형 프로세스로 실행하거나, 동적 공유 객체(.dll)로 연결할 수 있습니다. Linux에서 지원하는 독립 실행형 바이너리 실행이 기본 설정 모드입니다. Windows에서는 공유 객체(.dll) 실행을 지원합니다.

Linux에서는 초기화(`init`) 시스템의 일부인 서비스를 통해 바이너리를 실행할 것을 권장합니다. 바이너리를 직접 실행하려면 다음 예제와 같이 터미널에서 실행하면 됩니다. 최신 OS를 사용하는 경우 모든 요구 사항이 실행 파일에 정적으로 내장되어 있으므로 에이전트를 실행하기 전에 다른 설치를 할 필요가 없습니다. 터미널에서, 서비스로 또는 컨테이너 내에서 에이전트를 유연하게 실행할 수 있습니다.

에이전트를 실행하려면 우선 JSON 구성 파일을 생성합니다. 다음 키-값 페어를 지정합니다.
+ `sagemaker_edge_core_device_name`: 디바이스 이름. SageMaker Edge Manager 콘솔에서 디바이스 플릿과 함께 등록해야 하는 디바이스 이름.
+ `sagemaker_edge_core_device_fleet_name`: 디바이스가 속한 플릿 이름.
+ `sagemaker_edge_core_region`: 디바이스, 플릿 및 Amazon S3 버킷과 연결된 AWS 리전입니다. 디바이스가 등록되고 Amazon S3 버킷이 생성된 리전에 해당(동일할 것으로 예상). 모델 자체는 다른 리전에서 SageMakerNeo로 컴파일할 수 있습니다. 이 구성은 모델 컴파일 리전과 관련이 없습니다.
+ `sagemaker_edge_core_root_certs_path`: 루트 인증서의 절대 폴더 경로. 이는 관련 AWS 계정으로 디바이스를 검증하는 데 사용됩니다.
+ `sagemaker_edge_provider_aws_ca_cert_file`: 아마존 루트 CA 인증서(AmazonRootca1.pem) 절대 경로. 이는 관련 AWS 계정으로 디바이스를 검증하는 데 사용됩니다. `AmazonCA`는가 소유한 인증서입니다 AWS.
+ `sagemaker_edge_provider_aws_cert_file`: 루트 인증서()에 AWS IoT 서명하는 절대 경로입니다`*.pem.crt`.
+ `sagemaker_edge_provider_aws_cert_pk_file`: AWS IoT 프라이빗 키의 절대 경로입니다. (`*.pem.key`).
+ `sagemaker_edge_provider_aws_iot_cred_endpoint`: AWS IoT 자격 증명 엔드포인트(*identifier*.iot.*region*.amazonaws.com). 자격 증명 검증 시 사용되는 엔드포인트. [AWS IoT에 디바이스 연결하기](https://docs.aws.amazon.com/iot/latest/developerguide/iot-connect-devices.html)에서 자세한 정보를 확인하세요.
+ `sagemaker_edge_provider_provider`: 사용 중인 공급자 인터페이스의 구현을 나타냄. 공급자 인터페이스는 최종 네트워크 서비스와 통신하여 업로드, 하트비트, 등록 검증 수행. 기본값은 `"Aws"`로 설정되어 있습니다. 공급자 인터페이스를 사용자 정의로 구현할 수 있습니다. 공급자가 없을 경우 `None` 또는 관련 공유 객체 경로를 입력하여 사용자 지정 구현 시 `Custom`(으)로 설정할 수 있습니다.
+ `sagemaker_edge_provider_provider_path`: 공급자 구현 공유 객체(.so 또는 .dll 파일) 절대 경로 입력. `"Aws"` 공급자 .dll 또는 .so 파일은 에이전트 릴리스와 함께 입력. 이 필드는 필수항목입니다.
+ `sagemaker_edge_provider_s3_bucket_name`: Amazon S3 버킷 이름(Amazon S3 버킷 URI 아님). 버킷 이름 내에 `sagemaker` 문자열이 있어야 함.
+ `sagemaker_edge_log_verbose`(부울): 선택 사항. 디버그 로그 설정. `True` 또는 `False`을 선택합니다.
+ `sagemaker_edge_telemetry_libsystemd_path`: Linux 전용으로 `systemd`에서 에이전트 충돌 카운터 지표 구현. libsystemd 절대 경로를 설정하여 충돌 카운터 지표 활성화. `whereis libsystemd`을(를) 디바이스 터미널에서 실행하여 기본 libsystemd 경로를 찾을 수 있습니다.
+ `sagemaker_edge_core_capture_data_destination`: 캡처 데이터 업로드 대상. `"Cloud"` 또는 `"Disk"`을 선택합니다. 기본값은 `"Disk"`로 설정됩니다. `"Disk"`(으)로 설정하면 입력 및 출력 텐서와 보조 데이터를 기본 설정 위치에서 로컬 파일 시스템에 작성합니다. `"Cloud"`에 작성할 때는 `sagemaker_edge_provider_s3_bucket_name` 구성에서 입력된 Amazon S3 버킷 이름을 사용합니다.
+ `sagemaker_edge_core_capture_data_disk_path`: `"Disk"`이(가) 대상일 때 캡처 데이터 파일이 기록되는 로컬 파일 시스템의 절대 경로 설정. `"Cloud"`이(가) 대상으로 지정된 경우 이 필드가 사용되지 않음.
+ `sagemaker_edge_core_folder_prefix`: `"Cloud"`을(를) 캡처 대상(`sagemaker_edge_core_capture_data_disk_path)`)으로 지정했을 때 캡처 데이터가 저장되는 Amazon S3 내 상위 접두사. 캡처 데이터는 `sagemaker_edge_core_capture_data_disk_path` 아래 하위 폴더에 저장됨(`"Disk"`이(가) 데이터 대상으로 설정된 경우).
+ `sagemaker_edge_core_capture_data_buffer_size`(정수 값): 캡처 데이터 원형 버퍼 크기. 버퍼에 저장된 최대 요청 수를 나타냄.
+ `sagemaker_edge_core_capture_data_batch_size`(정수 값): 캡처 데이터 배치 크기. 버퍼에서 처리되는 요청 배치의 크기를 나타냄. 이 값은 `sagemaker_edge_core_capture_data_buffer_size` 미만이어야 함. 최대 버퍼 크기의 절반을 버퍼 크기로 권장합니다.
+ `sagemaker_edge_core_capture_data_push_period_seconds`(정수 값): 캡처 데이터 푸시 기간(초). 버퍼에 있는 요청 배치는 버퍼에 배치 크기 요청이 있는 경우 또는 이 기간이 완료될 때(둘 중 먼저 도래하는 날짜에) 처리됩니다. 이 구성은 해당 기간을 설정합니다.
+ `sagemaker_edge_core_capture_data_base64_embed_limit`: 캡처 데이터 업로드 제한(바이트). 정수 값

구성 파일은 다음 예제와 비슷해야 합니다(특정 값 지정 시). 이 예제에서는 기본 AWS 공급자(`"Aws"`)를 사용하며 주기적 업로드를 지정하지 않습니다.

```
{
    "sagemaker_edge_core_device_name": "device-name",
    "sagemaker_edge_core_device_fleet_name": "fleet-name",
    "sagemaker_edge_core_region": "region",
    "sagemaker_edge_core_root_certs_path": "<Absolute path to root certificates>",
    "sagemaker_edge_provider_provider": "Aws",
    "sagemaker_edge_provider_provider_path" : "/path/to/libprovider_aws.so",
    "sagemaker_edge_provider_aws_ca_cert_file": "<Absolute path to Amazon Root CA certificate>/AmazonRootCA1.pem",
    "sagemaker_edge_provider_aws_cert_file": "<Absolute path to AWS IoT signing root certificate>/device.pem.crt",
    "sagemaker_edge_provider_aws_cert_pk_file": "<Absolute path to AWS IoT private key.>/private.pem.key",
    "sagemaker_edge_provider_aws_iot_cred_endpoint": "https://<AWS IoT Endpoint Address>",
    "sagemaker_edge_core_capture_data_destination": "Cloud",
    "sagemaker_edge_provider_s3_bucket_name": "sagemaker-bucket-name",
    "sagemaker_edge_core_folder_prefix": "Amazon S3 folder prefix",
    "sagemaker_edge_core_capture_data_buffer_size": 30,
    "sagemaker_edge_core_capture_data_batch_size": 10,
    "sagemaker_edge_core_capture_data_push_period_seconds": 4000,
    "sagemaker_edge_core_capture_data_base64_embed_limit": 2,
    "sagemaker_edge_log_verbose": false
}
```

릴리스 아티팩트에는 `sagemaker_edge_agent_binary` 바이너리 실행 파일이 `/bin` 디렉터리에 포함되어 있습니다. 바이너리를 실행하려면 `-a` 플래그를 사용하여 선택한 디렉터리에 소켓 파일 설명자(.sock)를 생성하고 `-c` 플래그로 생성한 에이전트 JSON 구성 파일의 경로를 지정합니다.

```
./sagemaker_edge_agent_binary -a <ADDRESS_TO_SOCKET> -c <PATH_TO_CONFIG_FILE>
```

다음 예제에서 디렉터리와 파일 경로가 지정된 코드 조각을 볼 수 있습니다.

```
./sagemaker_edge_agent_binary -a /tmp/sagemaker_edge_agent_example.sock -c sagemaker_edge_config.json
```

이 예제에서는 `sagemaker_edge_agent_example.sock`이라는 소켓 파일 설명자가 `/tmp` 디렉터리에 생성되고 `sagemaker_edge_config.json` 에이전트와 동일한 작업 디렉터리에 있는 구성 파일을 가리킵니다.

# 를 사용한 모델 패키지 및 Edge Manager 에이전트 배포 AWS IoT Greengrass
<a name="edge-greengrass"></a>

SageMaker Edge Manager는 AWS IoT Greengrass 버전 2를 통합하여 Edge Manager 에이전트 및 모델을 디바이스에 액세스, 유지 관리 및 배포하는 작업을 간소화합니다. AWS IoT Greengrass V2가 없으면 SageMaker Edge Manager를 사용하도록 디바이스와 플릿을 설정하려면 Amazon S3 릴리스 버킷에서 Edge Manager 에이전트를 수동으로 복사해야 합니다. 에이전트를 사용하면 엣지 디바이스에 로드된 모델로 예측을 수행할 수 있습니다. AWS IoT Greengrass V2 및 SageMaker Edge Manager 통합을 사용하면 AWS IoT Greengrass V2 구성 요소를 사용할 수 있습니다. 구성 요소는 엣지 디바이스를 AWS 서비스 또는 타사 서비스에 연결할 수 있는 사전 구축된 소프트웨어 모듈입니다 AWS IoT Greengrass.

Edge Manager 에이전트와 모델을 배포하기 위해 AWS IoT Greengrass V2를 사용하려면 AWS IoT Greengrass 코어 소프트웨어를 디바이스(들)에 설치해야 합니다. 디바이스 요구 사항 및 디바이스 설정 방법에 대한 자세한 내용은 AWS IoT Greengrass 설명서의 [AWS IoT Greengrass 코어 디바이스 설정을](https://docs.aws.amazon.com/greengrass/v2/developerguide/setting-up.html) 참조하세요.

다음 세 가지 구성 요소를 사용하여 Edge Manager 에이전트를 배포합니다.
+ *사전 구축 퍼블릭 구성 요소*: SageMaker AI에서 퍼블릭 Edge Manager 구성 요소를 유지 관리.
+ *자동 생성 프라이빗 구성 요소*: 프라이빗 구성 요소는 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html) API로 기계 학습 모델을 패키징하고 `GreengrassV2Component`을(를) Edge Manager API 필드 `PresetDeploymentType`에 지정할 때 자동 생성.
+ *사용자 지정 구성 요소*: 디바이스에서 사전 처리 및 추론을 담당하는 추론 애플리케이션. 필수 생성 구성 요소. 사용자 [지정 AWS IoT Greengrass 구성 요소를 생성하는](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html) 방법에 대한 자세한 내용은 [Hello World 사용자 지정 구성 요소 생성](edge-greengrass-custom-component.md#edge-greengrass-create-custom-component-how) SageMaker Edge Manager 설명서의 또는 AWS IoT Greengrass 설명서의 사용자 지정 구성 요소 생성을 참조하세요.

# Edge Manager 에이전트를 배포하기 위한 사전 조건 완료
<a name="edge-greengrass-prerequisites"></a>

SageMaker Edge Manager는 AWS IoT Greengrass V2를 사용하여 구성 요소를 사용하여 디바이스에 Edge Manager 에이전트, 기계 학습 모델 및 추론 애플리케이션을 간단하게 배포할 수 있습니다. AWS IAM 역할을 더 쉽게 유지 관리할 수 있도록 Edge Manager를 사용하면 기존 AWS IoT 역할 별칭을 재사용할 수 있습니다. 아직 별칭이 없는 경우 Edge Manager는 Edge Manager 패키징 작업의 일부로 역할 별칭을 생성합니다. 더 이상 SageMaker Edge Manager 패키징 작업에서 생성된 역할 별칭을 AWS IoT 역할과 연결할 필요가 없습니다.

시작하기 전에 다음 필수 조건을 총족해야 합니다.

1.  AWS IoT Greengrass 코어 소프트웨어를 설치합니다. 자세한 내용은 [AWS IoT Greengrass 코어 소프트웨어 설치를 참조하세요](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#install-greengrass-v2).

1.  AWS IoT Greengrass V2를 설정합니다. 자세한 내용은 [수동 리소스 프로비저닝을 사용하여 AWS IoT Greengrass 코어 소프트웨어 설치를 참조하세요](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html).
**참고**  
 AWS IoT 사물 이름이 모두 소문자이고 (선택 사항) 대시()를 제외한 문자가 포함되어 있지 않은지 확인합니다`‐`.
IAM 역할은 `SageMaker*`(으)로 시작해야 합니다.

1.  AWS IoT Greengrass V2 설정 중에 생성된 IAM 역할에 다음 권한 및 인라인 정책을 연결합니다.
   + IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))로 이동합니다.
   + **검색(Search)** 필드에 역할 이름을 입력하여 방금 생성한 역할을 검색합니다.
   + 역할을 선택합니다.
   + 다음은 **정책 연결(Attach Policies)**을 선택합니다.
   + **AmazonSageMakerEdgeDeviceFleetPolicy**를 검색합니다.
   + **AmazonSageMakerFullAccess**를 선택합니다(이 단계는 모델 컴파일 및 패키징 시 이 IAM 역할을 보다 쉽게 재사용할 수 있도록 하는 선택적 단계입니다).
   + 역할 권한 정책에 필수 권한을 추가합니다. IAM 사용자에게 인라인 정책을 연결하지 않습니다.

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement":[
           {
             "Sid":"GreengrassComponentAccess",
             "Effect":"Allow",
             "Action":[
                 "greengrass:CreateComponentVersion",
                 "greengrass:DescribeComponent"
             ],
             "Resource":"*"
            }
         ]
     }
     ```

------
   + **정책 연결**을 선택합니다.
   + **신뢰 관계**를 선택합니다.
   + **신뢰 관계 편집**을 선택합니다.
   + 내용을 다음과 같이 바꿉니다.

------
#### [ JSON ]

****  

     ```
     {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "credentials.iot.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
         },
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "sagemaker.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
         }
       ]
     }
     ```

------

1. Edge Manager 디바이스 플릿을 생성합니다. 플릿 생성 방법에 대한 자세한 정보는 [SageMaker Edge Manager에서 디바이스 및 플릿 설정](edge-device-fleet.md)에서 확인하세요.

1.  AWS IoT Greengrass V2 설정 중에 생성된 AWS IoT 사물 이름과 동일한 이름으로 디바이스를 등록합니다.

1. 사용자 지정 프라이빗 AWS IoT Greengrass 구성 요소를 하나 이상 생성합니다. 이 구성 요소는 디바이스에서 추론을 실행하는 애플리케이션입니다. 자세한 내용은 [Hello World 사용자 지정 구성 요소 생성](edge-greengrass-custom-component.md#edge-greengrass-create-custom-component-how) 섹션을 참조하세요.

**참고**  
SageMaker Edge Manager 및 AWS IoT Greengrass 통합은 v2에서만 작동합니다 AWS IoT Greengrass .
 AWS IoT 사물 이름과 Edge Manager 디바이스 이름은 모두 동일해야 합니다.
SageMaker Edge Manager는 로컬 AWS IoT 인증서를 로드하지 않고 AWS IoT 자격 증명 공급자 엔드포인트를 직접 호출합니다. 대신 SageMaker Edge Manager는 AWS IoT Greengrass v2 TokenExchangeService를 사용하고 TES 엔드포인트에서 임시 자격 증명을 가져옵니다.

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

# 구성 요소를 디바이스에 배포합니다.
<a name="edge-greengrass-deploy-components"></a>

 AWS IoT 콘솔 또는를 사용하여 구성 요소를 배포합니다 AWS CLI.

## 구성 요소를 배포하려면(콘솔)
<a name="collapsible-section-gg-deploy-console"></a>

 AWS IoT 콘솔을 사용하여 AWS IoT Greengrass 구성 요소를 배포합니다.

1.  AWS IoT Greengrass 콘솔의 [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) 탐색 메뉴에서 **배포를** 선택합니다.

1. **구성 요소** 페이지의 **퍼블릭 구성 요소** 탭에서 `aws.greengrass.SageMakerEdgeManager`을(를) 선택합니다.

1. `aws.greengrass.SageMakerEdgeManager` 페이지에서 **배포**를 선택합니다.

1. `Add to deployment`에서 다음 중 하나를 선택합니다.

   1. 이 구성 요소를 대상 디바이스의 기존 배포에 병합하려면 **기존 배포에 추가**를 선택한 다음 수정하려는 배포를 선택합니다.

   1. 대상 디바이스에서 새 배포를 생성하려면 **새 배포 생성**을 선택합니다. 디바이스에 기존 배포가 있는 경우 이 단계를 선택하면 기존 배포가 대체됩니다.

1. **대상 지정** 페이지에서 다음 작업을 수행합니다.

   1. **배포 정보** 아래에서 친숙한 배포 이름을 입력하거나 수정합니다.

   1. **배포 대상** 아래에서 배포 대상을 선택하고 **다음**을 선택합니다. 기존 배포 수정 시 배포 대상을 변경할 수 없습니다.

1. **구성 요소 선택** 페이지의 **내 구성 요소**에서 다음을 선택합니다.
   + com. **<CUSTOM-COMPONENT-NAME>
   + `aws.greengrass.SageMakerEdgeManager`
   + SagemakerEdgeManager.*<YOUR-PACKAGING-JOB>*

1. **구성 요소 구성** 페이지에서 **com.Greengrass.SageMakeRedgeManager**를 선택하고 다음을 수행합니다.

   1. **구성 요소 구성**을 선택합니다.

   1. **구성 업데이트** 아래에 있는 **병합할 구성**에 다음 구성을 입력합니다.

      ```
      {
          "DeviceFleetName": "device-fleet-name",
          "BucketName": "bucket-name"
      }
      ```

      *`device-fleet-name`*을(를) 생성한 엣지 디바이스 플릿 이름으로 바꾸고, *`bucket-name`*을(를) 디바이스 플릿과 연결된 Amazon S3 버킷 이름으로 바꿉니다.

   1. **확인**을 선택하고 **다음**을 선택합니다.

1. **고급 설정 구성** 페이지에서 기본 구성 설정을 유지하고 **다음**을 선택합니다.

1. **검토** 페이지에서 **배포**를 선택합니다.

## 구성 요소를 배포하려면(AWS CLI)
<a name="collapsible-section-gg-deploy-cli"></a>

1. ` deployment.json` 파일을 생성하여 SageMaker Edge Manager 구성 요소의 배포 구성을 정의합니다. 이 파일은 다음 예제와 비슷합니다.

   ```
   {
     "targetArn":"targetArn",
     "components": {
       "aws.greengrass.SageMakerEdgeManager": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
           "merge": {
             "DeviceFleetName": "device-fleet-name",
             "BucketName": "bucket-name"
           }
         }
       },
       "com.greengrass.SageMakerEdgeManager.ImageClassification": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
         }
       }, 
       "com.greengrass.SageMakerEdgeManager.ImageClassification.Model": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
         }
       }, 
     }
   }
   ```
   + `targetArn` 필드에서 *`targetArn`*을(를) 다음 형식으로 배포 대상으로 지정할 사물 또는 사물 그룹의 Amazon 리소스 이름(ARN)으로 바꿉니다.
     + 사물: `arn:aws:iot:region:account-id:thing/thingName`
     + 사물 그룹: `arn:aws:iot:region:account-id:thinggroup/thingGroupName`
   + `merge` 필드에서 *`device-fleet-name`*을(를) 생성한 엣지 디바이스 플릿 이름으로 바꾸고, *`bucket-name`*을(를) 디바이스 플릿과 연결된 Amazon S3 버킷 이름으로 바꿉니다.
   + 각 구성 요소의 구성 요소 버전을 사용 가능한 최신 버전으로 바꿉니다.

1. 다음 명령을 실행하여 디바이스에 구성 요소를 배포합니다.

   ```
   aws greengrassv2 create-deployment \
       --cli-input-json file://path/to/deployment.json
   ```

배포를 완료하는 데 몇 분 정도 걸릴 수 있습니다. 다음 단계에서는 구성 요소 로그를 확인하여 배포가 정상적으로 완료되었는지 확인하고 추론 결과를 확인합니다.

개별 디바이스 또는 디바이스 그룹에 구성 요소를 배포하는 방법에 대한 자세한 내용은 [디바이스에 AWS IoT Greengrass 구성 요소 배포를 참조하세요](https://docs.aws.amazon.com/greengrass/v2/developerguide/manage-deployments.html).

# SageMaker Edge Manager 배포 API로 모델 패키지 직접 배포하기
<a name="edge-deployment-plan-api"></a>

SageMaker Edge Manager는 AWS IoT Greengrass없이 디바이스 대상에 모델 배포 시 사용할 수 있는 배포 API를 제공합니다. 펌웨어 업데이트 또는 애플리케이션 배포 메커니즘 모델을 독립적으로 업데이트하고자 하는 경우에 유용합니다. 모델 정확성 검증 후 API를 사용하여 엣지 배포를 CI/CD 워크플로에 통합하여 모델을 자동 배포할 수 있습니다. 또한 API에는 편리한 롤백 및 단계적 롤아웃 옵션이 있어 본격 롤아웃 전 특정 환경에서 모델이 잘 작동하는지 확인할 수 있습니다.

Edge Manager 배포 API를 사용하려면 먼저 모델을 컴파일하고 패키징해야 합니다. 모델 컴파일 및 패키징 방법은 [배포를 위한 모델 준비](edge-getting-started-step2.md)에서 확인하세요. 이 가이드의 다음 섹션에서는 모델을 컴파일하고 패키징한 후 SageMaker API로 엣지 배포를 생성하는 방법을 알아보겠습니다.

**Topics**
+ [엣지 배포 계획 생성하기](#create-edge-deployment-plan)
+ [엣지 배포 시작하기](#start-edge-deployment-stage)
+ [배포 작업 상태 확인하기](#describe-edge-deployment-status)

## 엣지 배포 계획 생성하기
<a name="create-edge-deployment-plan"></a>

[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentPlan.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentPlan.html) API로 엣지 배포 계획을 생성할 수 있습니다. 배포 계획에는 여러 스테이지가 있을 수 있습니다. 각 스테이지를 구성하여 엣지 디바이스 서브셋 배포를 롤아웃할 수 있습니다(비율 기준 또는 디바이스 이름 기준). 또한 각 스테이지에서 롤아웃 실패 처리 방법을 구성할 수 있습니다.

다음 코드 조각에서 1스테이지로 구성된 엣지 배포 계획을 생성하여 컴파일 및 패키지 모델을 2개의 특정 엣지 디바이스에 배포하는 방법을 알아봅시다.

```
import boto3

client = boto3.client("sagemaker")

client.create_edge_deployment_plan(
    EdgeDeploymentPlanName="edge-deployment-plan-name",
    DeviceFleetName="device-fleet-name",
    ModelConfigs=[
        {
            "EdgePackagingJobName": "edge-packaging-job-name",
            "ModelHandle": "model-handle"
        }
    ],
    Stages=[
        {
            "StageName": "stage-name",
            "DeviceSelectionConfig": {
                "DeviceSubsetType": "SELECTION",
                "DeviceNames": ["device-name-1", "device-name-2"]
            },
            "DeploymentConfig": {
                "FailureHandlingPolicy": "ROLLBACK_ON_FAILURE"
            }
        }
    ]
)
```

특정 디바이스 대신 플릿 내 디바이스의 일정 비율을 기준으로 모델을 배포하려면 위 예제에서 `DeviceSubsetType` 값을 `"PERCENTAGE"`(으)로 설정하고 `"DeviceNames": ["device-name-1", "device-name-2"]`을(를) `"Percentage": desired-percentage`(으)로 바꿉니다.

테스트 롤아웃 성공 검증 후 새 스테이지 롤아웃을 시작하고자 하는 경우, [CreateEdgeDeploymentStage](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentStage.html) API로 배포 계획 생성 후 스테이지를 추가할 수 있습니다. 배포 스테이지에 대한 자세한 정보는 [DeploymentStage](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeploymentStage.html)에서 확인하세요.

## 엣지 배포 시작하기
<a name="start-edge-deployment-stage"></a>

배포 계획과 배포 스테이지 생성 후 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartEdgeDeploymentStage.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartEdgeDeploymentStage.html) API로 배포를 시작할 수 있습니다.

```
client.start_edge_deployment_stage(
    EdgeDeploymentPlanName="edge-deployment-plan-name",
    StageName="stage-name"
)
```

## 배포 작업 상태 확인하기
<a name="describe-edge-deployment-status"></a>

[DescribeEdgeDeploymentPlan](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeEdgeDeploymentPlan.html) API로 엣지 배포 상태를 확인할 수 있습니다.

```
client.describe_edge_deployment_plan(
    EdgeDeploymentPlanName="edge-deployment-plan-name"
)
```