

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

# 모델 컴파일
<a name="neo-getting-started-edge-step1"></a>

[사전 조건](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-getting-started-edge.html#neo-getting-started-edge-step0)을 충족하면 Amazon SageMaker AI Neo를 사용하여 모델을 컴파일할 수 있습니다. [Python용 콘솔 또는 Amazon Web Services SDK(Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) AWS CLI를 사용하여 모델을 컴파일할 수 있습니다. 모델 [컴파일에 Neo 사용을](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-job-compilation.html) 참조하세요. 이 예제에서는 Boto3를 사용하여 모델을 컴파일합니다.

모델을 컴파일하려면 SageMaker Neo에는 다음 정보가 필요합니다.

1.  **훈련된 모델을 저장한 Amazon S3 버킷 URI입니다.**

   사전 요구 사항을 따랐다면 버킷이 `bucket`라는 변수에 저장됩니다. 다음 코드 스니펫은 AWS CLI를 사용하여 모든 버킷을 나열하는 방법을 보여줍니다.

   ```
   aws s3 ls
   ```

   예제: 

   ```
   $ aws s3 ls
   2020-11-02 17:08:50 bucket
   ```

1.  **컴파일된 모델을 저장하려는 Amazon S3 버킷 URI입니다.**

   아래 코드 스니펫은 Amazon S3 버킷 URI를 `output`라는 출력 디렉터리의 이름과 연결합니다.

   ```
   s3_output_location = f's3://{bucket}/output'
   ```

1.  **모델 훈련에 사용한 기계 훈련 프레임워크.**

   모델 훈련에 사용한 프레임워크를 정의하세요.

   ```
   framework = 'framework-name'
   ```

   예를 들어 TensorFlow를 사용하여 훈련된 모델을 컴파일하는데 `tflite` 또는 `tensorflow`를 사용할 수 있습니다. 스토리지 메모리를 적게 사용하는 더 가벼운 버전의 TensorFlow를 사용하려는 경우 `tflite`를 사용하세요.

   ```
   framework = 'tflite'
   ```

   NEO 지원 프레임워크의 전체 목록은 [지원되는 프레임워크, 디바이스, 시스템, 아키텍처](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge.html)를 참조하세요.

1.  **모델 입력의 셰이프.**

    Neo에는 입력 텐서의 이름과 모양이 필요합니다. 이름과 모양은 키-값 페어로 전달됩니다. `value`는 입력 텐서의 정수 크기 목록이며 `key`는 모델에 있는 입력 텐서의 정확한 이름입니다.

   ```
   data_shape = '{"name": [tensor-shape]}'
   ```

   예제:

   ```
   data_shape = '{"normalized_input_image_tensor":[1, 300, 300, 3]}'
   ```
**참고**  
사용한 프레임워크에 따라 모델 형식이 올바른지 확인하세요. [SageMaker Neo에 필요한 입력 데이터 셰이프는 무엇입니까?](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-job-compilation.html#neo-job-compilation-expected-inputs)를 참조하세요. 이 사전의 키를 새 입력 텐서 이름으로 변경해야 합니다.

1.  **컴파일할 대상 디바이스의 이름 또는 하드웨어 플랫폼의 일반 세부 정보** 

   ```
   target_device = {{'target-device-name'}}
   ```

   예를 들어, Raspberry Pi 3에 배포하려면 다음을 사용하세요.

   ```
   target_device = 'rasp3b'
   ```

   지원되는 엣지 디바이스의 전체 목록은 [지원되는 프레임워크, 디바이스, 시스템, 아키텍처](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-supported-devices-edge.html)에서 찾을 수 있습니다.

 이전 단계를 완료했으니 이제 Neo에 컴파일 작업을 제출할 수 있습니다.

```
# Create a SageMaker client so you can submit a compilation job
sagemaker_client = boto3.client('sagemaker', region_name=AWS_REGION)

# Give your compilation job a name
compilation_job_name = 'getting-started-demo'
print(f'Compilation job for {compilation_job_name} started')

response = sagemaker_client.create_compilation_job(
    CompilationJobName=compilation_job_name,
    RoleArn=role_arn,
    InputConfig={
        'S3Uri': s3_input_location,
        'DataInputConfig': data_shape,
        'Framework': framework.upper()
    },
    OutputConfig={
        'S3OutputLocation': s3_output_location,
        'TargetDevice': target_device 
    },
    StoppingCondition={
        'MaxRuntimeInSeconds': 900
    }
)

# Optional - Poll every 30 sec to check completion status
import time

while True:
    response = sagemaker_client.describe_compilation_job(CompilationJobName=compilation_job_name)
    if response['CompilationJobStatus'] == 'COMPLETED':
        break
    elif response['CompilationJobStatus'] == 'FAILED':
        raise RuntimeError('Compilation failed')
    print('Compiling ...')
    time.sleep(30)
print('Done!')
```

디버깅에 대한 추가 정보가 필요하면 다음 인쇄 문장을 포함하세요.

```
print(response)
```

컴파일 작업이 성공하면 컴파일된 모델은 이전에 지정한 출력 Amazon S3 버킷(`s3_output_location`)에 저장됩니다. 컴파일된 모델을 로컬로 다운로드하세요.

```
object_path = f'output/{model}-{target_device}.tar.gz'
neo_compiled_model = f'compiled-{model}.tar.gz'
s3_client.download_file(bucket, object_path, neo_compiled_model)
```