

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

# SageMaker AI 다중 모델 엔드포인트용 자체 컨테이너 구축
<a name="build-multi-model-build-container"></a>

자체 컨테이너 및 종속성을 다중 모델 엔드포인트로 가져오려면 다음 섹션을 참조하세요.

**Topics**
+ [

## CPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
](#build-multi-model-container-cpu)
+ [

## GPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
](#build-multi-model-container-gpu)
+ [

## SageMaker AI 추론 도구 키트 사용
](#multi-model-inference-toolkit)
+ [

# 다중 모델 엔드포인트를 위한 사용자 지정 컨테이너 계약
](mms-container-apis.md)

## CPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
<a name="build-multi-model-container-cpu"></a>

사전 빌드된 컨테이너 이미지 중 요구 사항을 충족하는 이미지가 없는 경우 CPU 지원 다중 모델 엔드포인트와 함께 사용할 자체 컨테이너를 빌드할 수 있습니다.

Amazon SageMaker AI에 배포된 사용자 지정 Amazon Elastic Container Registry(Amazon ECR) 이미지는 자체 추론 코드를 실행하는 Docker 컨테이너와 SageMaker AI가 상호 작용하는 방법을 제어하는 기본 계약([호스팅 서비스를 사용한 사용자 지정 추론 코드](your-algorithms-inference-code.md)에 설명)을 준수해야 합니다. 컨테이너가 여러 모델을 동시에 로드하고 제공할 수 있으려면 따라야 할 추가적인 API 및 동작이 있습니다. 이 추가 계약에는 모델을 로드, 나열, 가져 오기 및 언로드하는 새로운 API와 모델을 호출하는 다른 API가 포함됩니다. 또한 API가 준수해야 하는 오류 시나리오에 대한 다른 동작이 있습니다. 컨테이너가 추가 요구 사항을 준수한다는 것을 나타내기 위해 Docker 파일에 다음 명령을 추가할 수 있습니다.

```
LABEL com.amazonaws.sagemaker.capabilities.multi-models=true
```

또한 SageMaker AI는 환경 변수를 컨테이너에 주입합니다.

```
SAGEMAKER_MULTI_MODEL=true
```

직렬 추론 파이프라인에 대한 다중 모델 엔드포인트를 생성하는 경우 Docker 파일에 다중 모델 및 직렬 추론 파이프라인에 필요한 레이블이 있어야 합니다. 직렬 정보 파이프라인에 대한 자세한 내용은 [추론 파이프라인을 사용하여 실시간으로 예측 실행하기](inference-pipeline-real-time.md) 섹션을 참조하세요.

사용자 지정 컨테이너에 대한 이러한 요구 사항을 충족하는 데 도움이 되도록 두 개의 라이브러리를 사용할 수 있습니다.
+ [Multi Model Server](https://github.com/awslabs/multi-model-server)는 새로운 다중 모델 엔드포인트 컨테이너 API에 대한 요구 사항을 충족하는 프런트 엔드를 제공하기 위해 컨테이너에 설치할 수 있는 기계 학습 모델을 제공하는 오픈 소스 프레임워크입니다. 단일 컨테이너 내에서 여러 모델을 호스팅하고, 모델을 컨테이너에 동적으로 로드 및 언로드하고, 지정된 로드 모델에 대한 추론을 수행할 수 있도록 다중 모델 엔드포인트에 필요한 HTTP 프런트 엔드 및 모델 관리 특성을 제공합니다. 또한 자체 알고리즘을 구현할 수 있는 플러그형 사용자 지정 백엔드 핸들러를 지원하는 플러그형 백엔드를 제공합니다.
+ [SageMaker AI 추론 도구 키트](https://github.com/aws/sagemaker-inference-toolkit)는 SageMaker AI 다중 모델 엔드포인트와 호환할 수 있게 해주는 구성 및 설정으로 다중 모델 서버를 부트스트랩하는 라이브러리입니다. 또한 시나리오의 필요에 따라 모델당 작업자 수와 같은 중요한 성능 파라미터를 조정할 수 있습니다.

## GPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
<a name="build-multi-model-container-gpu"></a>

GPU 지원 인스턴스가 있는 다중 모델 엔드포인트의 Bring Your Own Container(BYOC) 기능은 현재 다중 모델 서버 및 SageMaker AI 추론 도구 키트 라이브러리에서 지원되지 않습니다.

GPU 지원 인스턴스로 다중 모델 엔드포인트를 만들려면 SageMaker AI가 지원하는 [NVIDIA Triton 추론 서버](https://docs.aws.amazon.com/sagemaker/latest/dg/triton.html)를 [NVIDIA Triton 추론 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)와 함께 사용할 수 있습니다. 자체 종속성을 가져오려면 SageMaker AI가 지원하는 [NVIDIA Triton 추론 서버](https://docs.aws.amazon.com/sagemaker/latest/dg/triton.html)를 Docker 파일의 기본 이미지로 사용하여 자체 컨테이너를 구축할 수 있습니다.

```
FROM 301217895009.dkr.ecr.us-west-2.amazonaws.com/sagemaker-tritonserver:22.07-py3
```

**중요**  
Triton 추론 서버가 있는 컨테이너는 GPU 지원 다중 모델 엔드포인트에 사용할 수 있도록 지원되는 유일한 컨테이너입니다.

## SageMaker AI 추론 도구 키트 사용
<a name="multi-model-inference-toolkit"></a>

**참고**  
SageMaker AI 추론 도구 키트는 CPU 지원 다중 모델 엔드포인트에만 지원됩니다. SageMaker AI 추론 도구 키트는 현재 CPU 지원 다중 모델 엔드포인트에 지원되지 않습니다.

다중 모델 엔드포인트를 지원하는 사전 빌드된 컨테이너는 [다중 모델 엔드포인트용으로 지원되는 알고리즘, 프레임워크, 인스턴스](multi-model-support.md)에 나열되어 있습니다. 다른 프레임워크나 알고리즘을 사용하려면 컨테이너를 빌드해야 합니다. 가장 쉬운 방법은 [SageMaker AI 추론 도구 키트](https://github.com/aws/sagemaker-inference-toolkit)를 사용하여 미리 구축된 기존의 컨테이너를 확장하는 것입니다. SageMaker AI 추론 도구 키트는 SageMaker AI에서 배포할 수 있는 엔드포인트를 만드는 다중 모델 서버(MMS)의 애플리케이션입니다. SageMaker AI에서 다중 모델 엔드포인트를 지원하는 사용자 지정 컨테이너를 설정하고 배포하는 방법을 보여주는 샘플 노트북에 대한 내용은 [다중 모델 엔드포인트 BYOC 샘플 노트북](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/advanced_functionality/multi_model_bring_your_own)을 참조하세요.

**참고**  
SageMaker AI 추론 도구 키트는 Python 모델 핸들러만 지원합니다. 다른 언어로 핸들러를 구현하려면 추가 다중 모델 엔드포인트 API를 구현하는 자체 컨테이너를 빌드해야 합니다. 자세한 내용은 [다중 모델 엔드포인트를 위한 사용자 지정 컨테이너 계약](mms-container-apis.md) 단원을 참조하세요.

**SageMaker AI 추론 도구 키트를 사용해 컨테이너를 확장하려면 다음과 같이 합니다.**

1. 모델 핸들러를 생성합니다. MMS는 모델 핸들러를 기대합니다. 이 핸들러는 사전 처리할 함수를 구현하여 모델에서 예측 결과를 가져와서 모델 핸들러에서 출력을 처리하는 Python 파일입니다. 모델 핸들러의 예는 샘플 노트북의 [model\$1handler.py](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/multi_model_bring_your_own/container/model_handler.py)를 참조하세요.

1. 추론 도구 키트를 가져와서 해당 `model_server.start_model_server` 함수를 사용해 MMS를 시작합니다. 다음 예는 샘플 노트북의 `dockerd-entrypoint.py` 파일에서 가져온 것입니다. `model_server.start_model_server`에 대한 호출은 이전 단계에서 설명한 모델 핸들러를 전달합니다.

   ```
   import subprocess
   import sys
   import shlex
   import os
   from retrying import retry
   from subprocess import CalledProcessError
   from sagemaker_inference import model_server
   
   def _retry_if_error(exception):
       return isinstance(exception, CalledProcessError or OSError)
   
   @retry(stop_max_delay=1000 * 50,
          retry_on_exception=_retry_if_error)
   def _start_mms():
       # by default the number of workers per model is 1, but we can configure it through the
       # environment variable below if desired.
       # os.environ['SAGEMAKER_MODEL_SERVER_WORKERS'] = '2'
       model_server.start_model_server(handler_service='/home/model-server/model_handler.py:handle')
   
   def main():
       if sys.argv[1] == 'serve':
           _start_mms()
       else:
           subprocess.check_call(shlex.split(' '.join(sys.argv[1:])))
   
       # prevent docker exit
       subprocess.call(['tail', '-f', '/dev/null'])
       
   main()
   ```

1. `Dockerfile`에서 첫 번째 단계에서 모델 핸들러를 복사하고 이전 단계의 Python 파일을 `Dockerfile`의 진입점으로 지정합니다. 다음 라인은 샘플 노트북에 사용되는 [Dockerfile](https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/multi_model_bring_your_own/container/Dockerfile)에서 가져온 것입니다.

   ```
   # Copy the default custom service file to handle incoming data and inference requests
   COPY model_handler.py /home/model-server/model_handler.py
   
   # Define an entrypoint script for the docker image
   ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"]
   ```

1. 컨테이너를 빌드하고 등록합니다. 다음과 같은 샘플 노트북의 쉘 스크립트는 컨테이너를 빌드하고 AWS 계정의 Amazon Elastic 컨테이너 레지스트리 리포지토리에 이를 업로드합니다.

   ```
   %%sh
   
   # The name of our algorithm
   algorithm_name=demo-sagemaker-multimodel
   
   cd container
   
   account=$(aws sts get-caller-identity --query Account --output text)
   
   # Get the region defined in the current configuration (default to us-west-2 if none defined)
   region=$(aws configure get region)
   region=${region:-us-west-2}
   
   fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest"
   
   # If the repository doesn't exist in ECR, create it.
   aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1
   
   if [ $? -ne 0 ]
   then
       aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null
   fi
   
   # Get the login command from ECR and execute it directly
   $(aws ecr get-login --region ${region} --no-include-email)
   
   # Build the docker image locally with the image name and then push it to ECR
   # with the full name.
   
   docker build -q -t ${algorithm_name} .
   docker tag ${algorithm_name} ${fullname}
   
   docker push ${fullname}
   ```

이제 이 컨테이너를 사용하여 SageMaker AI에서 다중 모델 엔드포인트를 배포할 수 있습니다.

**Topics**
+ [

## CPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
](#build-multi-model-container-cpu)
+ [

## GPU 지원 인스턴스의 다중 모델 엔드포인트에 대한 자체 종속성을 가져오세요.
](#build-multi-model-container-gpu)
+ [

## SageMaker AI 추론 도구 키트 사용
](#multi-model-inference-toolkit)
+ [

# 다중 모델 엔드포인트를 위한 사용자 지정 컨테이너 계약
](mms-container-apis.md)

# 다중 모델 엔드포인트를 위한 사용자 지정 컨테이너 계약
<a name="mms-container-apis"></a>

여러 모델을 처리하려면 필요에 따라 모델을 로드, 나열, 가져오기 및 로드 해제하기 위해 Amazon SageMaker AI가 컨테이너와 통신할 수 있도록 컨테이너에서 일련의 API를 지원해야 합니다. `model_name`는 새 API 세트에서 키 입력 파라미터로 사용됩니다. 고객 컨테이너는 매핑 키로 `model_name`을 사용하여 로드된 모델을 추적해야 합니다. 또한 `model_name`는 불투명 식별자로, `InvokeEndpoint` API에 전달된 `TargetModel` 파라미터의 값이 아닐 수도 있습니다. `InvokeEndpoint` 요청의 원래 `TargetModel` 값은 `X-Amzn-SageMaker-Target-Model` 헤더로서 API의 컨테이너에 전달되어 로깅 목적으로 사용할 수 있습니다.

**참고**  
GPU 지원 인스턴스용 다중 모델 엔드포인트는 현재 SageMaker AI의 [NVIDIA Triton 추론 서버 컨테이너](https://docs.aws.amazon.com/sagemaker/latest/dg/triton.html)에서만 지원됩니다. 이 컨테이너는 아래에 정의된 계약을 이미 구현하고 있습니다. 고객은 추가 작업 없이 다중 모델 GPU 엔드포인트와 함께 이 컨테이너를 직접 사용할 수 있습니다.

CPU 지원 다중 모델 엔드포인트를 위해 컨테이너에서 다음 API를 구성할 수 있습니다.

**Topics**
+ [

## 모델 API 로드
](#multi-model-api-load-model)
+ [

## 모델 API 나열
](#multi-model-api-list-model)
+ [

## 모델 API 가져오기
](#multi-model-api-get-model)
+ [

## 모델 API 언로드
](#multi-model-api-unload-model)
+ [

## 모델 API 간접 호출
](#multi-model-api-invoke-model)

## 모델 API 로드
<a name="multi-model-api-load-model"></a>

고객 컨테이너의 메모리에 본문의 `url` 필드에 존재하는 특정 모델을 로드하고 할당된 `model_name`으로 이를 추적하도록 컨테이너에게 지시합니다. 모델이 로드된 후에는 컨테이너가 이 `model_name`을 사용하여 추론 요청을 처리 할 준비가 되어 있어야 합니다.

```
POST /models HTTP/1.1
Content-Type: application/json
Accept: application/json

{
     "model_name" : "{model_name}",
     "url" : "/opt/ml/models/{model_name}/model",
}
```

**참고**  
`model_name`이 이미 로드된 경우 이 API는 409를 반환해야 합니다. 메모리 부족이나 다른 리소스로 인해 모델을 로드할 수 없을 때마다 이 API는 507 HTTP 상태 코드를 SageMaker AI로 반환해야 합니다. 그런 다음 사용되지 않은 모델을 로드 해제하여 회수합니다.

## 모델 API 나열
<a name="multi-model-api-list-model"></a>

고객 컨테이너의 메모리에 로드된 모델의 목록을 반환합니다.

```
GET /models HTTP/1.1
Accept: application/json

Response = 
{
    "models": [
        {
             "modelName" : "{model_name}",
             "modelUrl" : "/opt/ml/models/{model_name}/model",
        },
        {
            "modelName" : "{model_name}",
            "modelUrl" : "/opt/ml/models/{model_name}/model",
        },
        ....
    ]
}
```

이 API는 페이지 매김도 지원합니다.

```
GET /models HTTP/1.1
Accept: application/json

Response = 
{
    "models": [
        {
             "modelName" : "{model_name}",
             "modelUrl" : "/opt/ml/models/{model_name}/model",
        },
        {
            "modelName" : "{model_name}",
            "modelUrl" : "/opt/ml/models/{model_name}/model",
        },
        ....
    ]
}
```

SageMaker AI는 처음에 `next_page_token`에 대한 값을 제공하지 않고 모델 API 나열을 직접적으로 호출할 수 있습니다. 응답의 일부로 반환된 `nextPageToken` 필드는 후속 모델 나열 호출에서 `next_page_token`의 값으로 제공됩니다. `nextPageToken`가 반환되지 않으면 반환할 모델이 더 이상 없다는 의미입니다.

## 모델 API 가져오기
<a name="multi-model-api-get-model"></a>

이것은 `model_name` 엔터티에 대한 간단한 읽기 API입니다.

```
GET /models/{model_name} HTTP/1.1
Accept: application/json

{
     "modelName" : "{model_name}",
     "modelUrl" : "/opt/ml/models/{model_name}/model",
}
```

**참고**  
`model_name`이 로드되지 않은 경우 이 API는 404를 반환해야 합니다.

## 모델 API 언로드
<a name="multi-model-api-unload-model"></a>

고객 컨테이너에 명령하여 메모리에서 모델을 로드 해제하도록 SageMaker AI 플랫폼에 지시합니다. 이렇게 하면 새 모델을 로드하는 프로세스를 시작할 때 플랫폼에 의해 결정된대로 후보 모델의 퇴거가 개시됩니다. `model_name`에 프로비저닝된 리소스는 이 API가 응답을 반환할 때 컨테이너에서 회수되어야 합니다.

```
DELETE /models/{model_name}
```

**참고**  
`model_name`이 로드되지 않은 경우 이 API는 404를 반환해야 합니다.

## 모델 API 간접 호출
<a name="multi-model-api-invoke-model"></a>

제공된 특정 `model_name`에서 예측 요청을 만듭니다. SageMaker AI Runtime `InvokeEndpoint` 요청은 간접 호출에 대해 지정된 모델의 상대 경로를 가져오는 새 헤더로 `X-Amzn-SageMaker-Target-Model`을 지원합니다. SageMaker AI 시스템은 `CreateModel` API 직접 호출의 일부로 제공되는 접두사를 모델의 상대 경로와 결합하여 모델의 절대 경로를 구성합니다.

```
POST /models/{model_name}/invoke HTTP/1.1
Content-Type: ContentType
Accept: Accept
X-Amzn-SageMaker-Custom-Attributes: CustomAttributes
X-Amzn-SageMaker-Target-Model: [relativePath]/{artifactName}.tar.gz
```

**참고**  
`model_name`이 로드되지 않은 경우 이 API는 404를 반환해야 합니다.

또한 GPU 인스턴스에서 메모리 또는 기타 리소스 부족으로 `InvokeEndpoint`에 오류가 발생하는 경우 이 API는 507 HTTP 상태 코드를 SageMaker AI에 반환해야 하며, 그러면 사용하지 않는 모델 로드 해제를 시작하여 리클레임합니다.