

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

# 엣지 디바이스에서 Neo 설정
<a name="neo-getting-started-edge"></a>

Amazon SageMaker Neo를 시작하기 위한 이 안내서는 모델을 컴파일하고, 디바이스를 설정하고, 디바이스에서 추론을 수행하는 방법을 보여줍니다. 대부분의 코드 예제는 Boto3를 사용합니다. 해당하는 AWS CLI 경우를 사용하는 명령과 Neo의 사전 조건을 충족하는 방법에 대한 지침을 제공합니다.

**참고**  
다음 코드 스니펫은 로컬 컴퓨터, SageMaker 노트북, Amazon SageMaker Studio 내에서 또는 엣지 디바이스(엣지 디바이스에 따라 다름)에서 실행할 수 있습니다. 설정은 비슷하지만 SageMaker 노트북 인스턴스 또는 SageMaker Studio 세션 내에서 이 가이드를 실행하는 경우 두 가지 주요 예외가 있습니다.  
Boto3를 설치할 필요가 없습니다.
`‘AmazonSageMakerFullAccess’` IAM 정책을 추가할 필요가 없습니다.

 이 가이드에서는 엣지 디바이스에서 다음 지침을 실행하고 있다고 가정합니다.

# 사전 조건
<a name="neo-getting-started-edge-step0"></a>

SageMaker Neo는 기계 학습 모델을 한 번 훈련시켜 클라우드와 엣지 어디서나 실행할 수 있는 기능입니다. Neo로 모델을 컴파일하고 최적화하려면 먼저 몇 가지 사전 조건을 설정해야 합니다. 필요한 Python 라이브러리를 설치하고, AWS 자격 증명을 구성하고, 필요한 권한이 있는 IAM 역할을 생성하고, 모델 아티팩트를 저장하기 위한 S3 버킷을 설정해야 합니다. 훈련된 기계 학습 모델도 준비해야 합니다. 다음 단계는 설정을 안내합니다.

1. **Boto3 설치**

   엣지 디바이스에서 이러한 명령을 실행하는 경우 AWS SDK for Python (Boto3)을 설치해야 합니다. Python 환경(가급적 가상 환경) 내에서 다음을 엣지 디바이스의 터미널이나 Jupyter notebook 인스턴스 내에서 로컬로 실행합니다.

------
#### [ Terminal ]

   ```
   pip install boto3
   ```

------
#### [ Jupyter Notebook ]

   ```
   !pip install boto3
   ```

------

1.  ** AWS 자격 증명 설정** 

   Python용 SDK(Boto3)를 실행하려면 디바이스에서 Amazon Web Services 자격 증명을 설정해야 합니다. 기본적으로 자격 AWS 증명은 `~/.aws/credentials` 엣지 디바이스의 파일에 저장되어야 합니다. 자격 증명 파일에는 두 개의 환경 변수인 `aws_access_key_id` 및 `aws_secret_access_key`가 표시되어야 합니다.

   터미널에서 다음을 실행합니다.

   ```
   $ more ~/.aws/credentials
   
   [default]
   aws_access_key_id = YOUR_ACCESS_KEY
   aws_secret_access_key = YOUR_SECRET_KEY
   ```

   [AWS 일반 참조 안내서](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)에는 필요한 `aws_access_key_id` 및 `aws_secret_access_key`를 얻는 방법에 대한 지침이 있습니다. 디바이스에서 자격 증명을 설정하는 방법에 대한 자세한 내용은 [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration) 설명서를 참조하세요.

1.  **IAM 역할을 설정하고 정책을 연결합니다.**

   Neo는 S3 버킷 URI에 액세스해야 합니다. SageMaker AI를 실행할 수 있고 S3 URI에 액세스할 수 있는 권한이 있는 IAM 역할을 생성합니다. Python용 SDK(Boto3), 콘솔 또는 AWS CLI를 사용하여 IAM 역할을 생성할 수 있습니다. 다음 예제는 Python용 SDK(Boto3)를 사용하여 IAM 역할을 생성하는 방법을 보여줍니다.

   ```
   import boto3
   
   AWS_REGION = 'aws-region'
   
   # Create an IAM client to interact with IAM
   iam_client = boto3.client('iam', region_name=AWS_REGION)
   role_name = 'role-name'
   ```

   콘솔 AWS CLI을 사용하거나 AWS API를 통해 IAM 역할을 생성하는 방법에 대한 자세한 내용은 [AWS 계정에서 IAM 사용자 생성을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_api).

    연결하려는 IAM 정책을 설명하는 사전을 만드세요. 이 정책은 새 IAM 역할을 생성하는 데 사용됩니다.

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

   위에서 정의한 정책을 사용하여 새 IAM 역할을 생성합니다.

   ```
   import json 
   
   new_role = iam_client.create_role(
       AssumeRolePolicyDocument=json.dumps(policy),
       Path='/',
       RoleName=role_name
   )
   ```

   이후 단계에서 컴파일 작업을 생성할 때 Amazon 리소스 이름(ARN)이 무엇인지 알아야 하므로 변수에도 저장하세요.

   ```
   role_arn = new_role['Role']['Arn']
   ```

    이제 새 역할을 만들었으니 Amazon SageMaker AI 및 Amazon S3와 상호 작용하는 데 필요한 권한을 연결합니다.

   ```
   iam_client.attach_role_policy(
       RoleName=role_name,
       PolicyArn='arn:aws:iam::aws:policy/AmazonSageMakerFullAccess'
   )
   
   iam_client.attach_role_policy(
       RoleName=role_name,
       PolicyArn='arn:aws:iam::aws:policy/AmazonS3FullAccess'
   );
   ```

1. **Amazon S3 버킷을 생성하여 모델 아티팩트를 저장합니다.**

   SageMaker 네오는 아마존 S3의 모델 아티팩트에 액세스합니다.

------
#### [ Boto3 ]

   ```
   # Create an S3 client
   s3_client = boto3.client('s3', region_name=AWS_REGION)
   
   # Name buckets
   bucket='name-of-your-bucket'
   
   # Check if bucket exists
   if boto3.resource('s3').Bucket(bucket) not in boto3.resource('s3').buckets.all():
       s3_client.create_bucket(
           Bucket=bucket,
           CreateBucketConfiguration={
               'LocationConstraint': AWS_REGION
           }
       )
   else:
       print(f'Bucket {bucket} already exists. No action needed.')
   ```

------
#### [ CLI ]

   ```
   aws s3 mb s3://'name-of-your-bucket' --region specify-your-region 
   
   # Check your bucket exists
   aws s3 ls s3://'name-of-your-bucket'/
   ```

------

1. **기계 훈련 모델 훈련**

   Amazon SageMaker AI를 사용하여 기계 학습 모델을 훈련시키는 방법에 대한 자세한 내용은 [Train a Model with Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-training.html)를 참조하세요. 선택적으로 로컬에서 훈련된 모델을 Amazon S3 URI 버킷에 직접 업로드할 수 있습니다.
**참고**  
 사용한 프레임워크에 따라 모델 형식이 올바른지 확인하세요. [SageMaker Neo에 필요한 입력 데이터 셰이프는 무엇입니까?](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-job-compilation.html#neo-job-compilation-expected-inputs)를 참조하세요.

   아직 모델이 없는 경우 `curl` 명령어를 사용하여 TensorFlow 웹사이트에서 `coco_ssd_mobilenet` 모델의 로컬 사본을 가져오세요. 방금 복사한 모델은 [COCO 데이터세트](https://cocodataset.org/#home)에서 훈련된 객체 감지 모델입니다. Jupyter notebook에 다음을 입력합니다.

   ```
   model_zip_filename = './coco_ssd_mobilenet_v1_1.0.zip'
   !curl http://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip \
       --output {model_zip_filename}
   ```

   참고로 이 예제는.zip 파일로 패키지되었습니다. 이후 단계에서 사용하기 전에 이 파일의 압축을 풀고 압축된 tarfile(`.tar.gz`)로 다시 패키징하세요. Jupyter notebook에 다음을 입력합니다.

   ```
   # Extract model from zip file
   !unzip -u {model_zip_filename}
   
   model_filename = 'detect.tflite'
   model_name = model_filename.split('.')[0]
   
   # Compress model into .tar.gz so SageMaker Neo can use it
   model_tar = model_name + '.tar.gz'
   !tar -czf {model_tar} {model_filename}
   ```

1. **훈련된 모델을 S3 버킷에 업로드**

   기계 훈련 모드를 훈련시킨 후에는 S3 버킷에 저장합니다.

------
#### [ Boto3 ]

   ```
   # Upload model        
   s3_client.upload_file(Filename=model_filename, Bucket=bucket, Key=model_filename)
   ```

------
#### [ CLI ]

   `your-model-filename` 및 `amzn-s3-demo-bucket`를 Amazon S3 버킷 이름으로 바꿉니다.

   ```
   aws s3 cp your-model-filename s3://amzn-s3-demo-bucket
   ```

------

# 모델 컴파일
<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)
```

# 디바이스 설정
<a name="neo-getting-started-edge-step2"></a>

디바이스에서 추론할 수 있도록 엣지 디바이스에 패키지를 설치해야 합니다. 또한 [AWS IoT Greengrass](https://docs.aws.amazon.com/greengrass/latest/developerguide/what-is-gg.html) 코어 또는 [딥 러닝 런타임(DLR)](https://github.com/neo-ai/neo-ai-dlr)을 설치해야 합니다. 이 예제에서는 `coco_ssd_mobilenet` 객체 감지 알고리즘을 추론하는 데 필요한 패키지를 설치하고 DLR을 사용합니다.

1. **추가 패키지 설치**

   Boto3 외에도 엣지 디바이스에 특정 라이브러리를 설치해야 합니다. 설치하는 라이브러리는 사용 사례에 따라 다릅니다.

   예를 들어 앞서 다운로드한 `coco_ssd_mobilenet` 객체 감지 알고리즘의 경우 데이터 조작 및 통계를 위해서는 [NumPy](https://numpy.org/)를, 이미지를 로드하려면 [PIL](https://pillow.readthedocs.io/en/stable/)을, 플롯을 생성하려면 [Matplotlib](https://matplotlib.org/)를 설치해야 합니다. Neo를 사용한 컴파일이 베이스라인과 비교하여 미치는 영향을 측정하려면 TensorFlow 사본이 필요합니다.

   ```
   !pip3 install numpy pillow tensorflow matplotlib 
   ```

1. **디바이스에 추론 엔진을 설치하세요.**

   NEO 컴파일 모델을 실행하려면 디바이스에 [딥 러닝 런타임(DLR)](https://github.com/neo-ai/neo-ai-dlr)을 설치하세요. DLR은 딥 러닝 모델 및 의사결정 트리 모델을 위한 작고 일반적인 런타임입니다. Linux를 실행하는 x86\$164 CPU 타겟에서는 다음 `pip` 명령을 사용하여 DLR 패키지의 최신 릴리스를 설치할 수 있습니다.

   ```
   !pip install dlr
   ```

   GPU 대상 또는 x86이 아닌 엣지 디바이스에 DLR을 설치하려면 사전 빌드된 바이너리에 대한 [릴리스](https://github.com/neo-ai/neo-ai-dlr/releases) 또는 소스에서 DLR을 빌드하기 위한 [DLR 설치](https://neo-ai-dlr.readthedocs.io/en/latest/install.html)를 참조하세요. 예를 들어, 라즈베리 파이 3용 DLR을 설치하려면 다음을 사용할 수 있습니다.

   ```
   !pip install https://neo-ai-dlr-release.s3-us-west-2.amazonaws.com/v1.3.0/pi-armv7l-raspbian4.14.71-glibc2_24-libstdcpp3_4/dlr-1.3.0-py3-none-any.whl
   ```

# 디바이스에서 추론하기
<a name="neo-getting-started-edge-step3"></a>

이 예시에서는 Boto3를 사용하여 컴파일 작업의 출력을 엣지 디바이스에 다운로드합니다. 그런 다음 DLR을 가져오고, 데이터세트에서 예제 이미지를 다운로드하고, 모델의 원래 입력과 일치하도록 이미지 크기를 조정한 다음 예측을 수행합니다.

1. **Amazon S3에서 컴파일된 모델을 디바이스로 다운로드하고 압축된 tarfile에서 추출합니다.**

   ```
   # Download compiled model locally to edge device
   object_path = f'output/{model_name}-{target_device}.tar.gz'
   neo_compiled_model = f'compiled-{model_name}.tar.gz'
   s3_client.download_file(bucket_name, object_path, neo_compiled_model)
   
   # Extract model from .tar.gz so DLR can use it
   !mkdir ./dlr_model # make a directory to store your model (optional)
   !tar -xzvf ./compiled-detect.tar.gz --directory ./dlr_model
   ```

1. **DLR 및 초기화된 객체를 `DLRModel` 가져옵니다.**

   ```
   import dlr
   
   device = 'cpu'
   model = dlr.DLRModel('./dlr_model', device)
   ```

1. **추론할 이미지를 다운로드하고 모델이 훈련된 방식에 따라 형식을 지정합니다.**

   `coco_ssd_mobilenet`의 예를 들면 [COCO 데이터세트](https://cocodataset.org/#home)에서 이미지를 다운로드한 다음 이미지를 `300x300`와 같이 수정할 수 있습니다.

   ```
   from PIL import Image
   
   # Download an image for model to make a prediction
   input_image_filename = './input_image.jpg'
   !curl https://farm9.staticflickr.com/8325/8077197378_79efb4805e_z.jpg --output {input_image_filename}
   
   # Format image so model can make predictions
   resized_image = image.resize((300, 300))
   
   # Model is quantized, so convert the image to uint8
   x = np.array(resized_image).astype('uint8')
   ```

1. **DLR을 사용하여 추론하세요.**

   마지막으로 DLR을 사용하여 방금 다운로드한 이미지를 예측할 수 있습니다.

   ```
   out = model.run(x)
   ```

DLR을 사용하여 엣지 디바이스에서 NEO로 컴파일된 모델을 추론하는 예제를 더 보려면 [neo-ai-dlr Github 리포지토리](https://github.com/neo-ai/neo-ai-dlr)를 참조하세요.