

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

# Amazon SageMaker AI를 사용한 모델 배포를 위한 모델 서버
<a name="deploy-model-frameworks"></a>

TorchServe, DJL Serving 및 Triton Inference Server와 같은 인기 모델 서버를 사용하여 SageMaker AI에 모델을 배포할 수 있습니다. 다음 주제에서는 방법을 설명합니다.

**Topics**
+ [TorchServe를 통한 모델 배포](deploy-models-frameworks-torchserve.md)
+ [DJL Serving으로 모델 배포하기](deploy-models-frameworks-djl-serving.md)
+ [Triton Inference Server로 모델 배포](deploy-models-frameworks-triton.md)

# TorchServe를 통한 모델 배포
<a name="deploy-models-frameworks-torchserve"></a>

TorchServe는 PyTorch 용으로 권장되는 모델 서버이며, AWS PyTorch Deep Learning Container (DLC)에 사전 설치되어 있습니다. 이 강력한 도구는 고객에게 일관되고 사용자 친화적인 경험을 제공하여 모델 크기 또는 배포에 관계없이 CPU, GPU, Neuron 및 Graviton을 포함한 다양한 AWS 인스턴스에 여러 PyTorch 모델을 배포하는 데 높은 성능을 제공합니다.

TorchServe는 동적 일괄 처리, 마이크로 일괄처리, 모델 A/B 테스트, 스트리밍, 토치 XLA, TensorRT, ONNX, IPEX를 비롯한 고급 기능을 폭넓게 지원합니다. 또한 PyTorch의 대규모 모델 솔루션인 PiPPY와의 원활한 통합으로 대규모 모델을 효율적으로 처리할 수 있습니다. 그뿐 아니라, TorchServe는 DeepSpeed, Accelerate, Fast Transformer 등과 같은 인기 있는 오픈소스 라이브러리도 추가로 지원하므로, 더욱 다양한 기능을 활용할 수 있습니다. TorchServe를 사용하면 AWS 사용자는 다양한 하드웨어 구성 및 모델 유형에서 다목적성과 최적화된 성능을 활용하여 PyTorch 모델을 자신 있게 배포하고 제공할 수 있습니다. 더 자세한 내용은 [PyTorch 설명서](https://pytorch.org/serve/)와 [GitHub의 TorchServe 항목](https://github.com/pytorch/serve)을 참조하시기 바랍니다.

다음 표에는 AWS TorchServe에서 지원하는 PyTorch DLCs 나열되어 있습니다. TorchServe


| 인스턴스 유형 | SageMaker AI PyTorch DLC 링크 | 
| --- | --- | 
| CPU 및 GPU | [SageMaker AI PyTorch 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) | 
| Neuron | [PyTorch Neuron 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#neuron-containers) | 
| Graviton | [SageMaker AI PyTorch Graviton 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-graviton-containers-sm-support-only) | 

다음 섹션에는 Amazon SageMaker AI에서 PyTorch DLC를 구축하고 테스트하기 위한 설정이 설명되어 있습니다.

## 시작하기
<a name="deploy-models-frameworks-torchserve-prereqs"></a>

시작하려면, 다음과 같은 사전 조건이 갖추어졌는지 확인하세요.

1.  AWS 계정에 액세스할 수 있는지 확인합니다. 가 AWS IAM 사용자 또는 IAM 역할을 통해 계정에 액세스할 AWS CLI 수 있도록 환경을 설정합니다. IAM 역할을 사용하는 것을 추천합니다. 사용자의 개인 계정에서 테스트를 수행하기 위해 다음과 같은 관리형 권한 정책을 IAM 역할에 연결할 수 있습니다.
   + [AmazonEC2ContainerRegistryFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess)
   + [AmazonEC2FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2FullAccess)
   + [AWS ServiceRoleForAmazonEKSNodegroup](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSServiceRoleForAmazonEKSNodegroup)
   + [AmazonSageMakerFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)
   + [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonS3FullAccess)

1. 다음 예제와 같이 종속성 설정을 로컬에서 구성합니다.

   ```
   from datetime import datetime
       import os
       import json
       import logging
       import time
       
       # External Dependencies:
       import boto3
       from botocore.exceptions import ClientError
       import sagemaker
       
       sess = boto3.Session()
       sm = sess.client("sagemaker")
       region = sess.region_name
       account = boto3.client("sts").get_caller_identity().get("Account")
       
       smsess = sagemaker.Session(boto_session=sess)
       role = sagemaker.get_execution_role()
       
       # Configuration:
       bucket_name = smsess.default_bucket()
       prefix = "torchserve"
       output_path = f"s3://{bucket_name}/{prefix}/models"
       print(f"account={account}, region={region}, role={role}")
   ```

1. 다음 예제와 같이 해당 PyTorch DLC 이미지를 가져옵니다.

   SageMaker AI PyTorch DLC 이미지는 모든 AWS 리전에서 사용할 수 있습니다. 자세한 내용은 [DLC 컨테이너 이미지 목록](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)을 참조하세요.

   ```
   baseimage = sagemaker.image_uris.retrieve(
           framework="pytorch",
           region="<region>",
           py_version="py310",
           image_scope="inference",
           version="2.0.1",
           instance_type="ml.g4dn.16xlarge",
       )
   ```

1. 로컬 워크스페이스를 생성하세요.

   ```
   mkdir -p workspace/
   ```

## 패키지 추가하기
<a name="deploy-models-frameworks-torchserve-package"></a>

다음 섹션은 PyTorch DLC 이미지에 패키지를 추가하고 사전 설치하는 방법에 대해 설명합니다.

**BYOC 활용 사례**

다음은 PyTorch DLC 이미지에 패키지를 추가하는 단계별 방법입니다. 컨테이너 사용자 지정에 대한 자세한 내용은 [AWS 딥 러닝 컨테이너 사용자 지정 이미지 빌드를](https://github.com/aws/deep-learning-containers/blob/master/custom_images.md) 참조하세요.

1. PyTorch DLC 도커 이미지에 패키지를 추가하고 싶다고 가정해 보겠습니다. 다음 예제와 같이 `docker` 디렉터리 아래에 Dockerfile을 생성합니다.

   ```
   mkdir -p workspace/docker
       cat workspace/docker/Dockerfile
       
       ARG BASE_IMAGE
       
       FROM $BASE_IMAGE
       
       #Install any additional libraries
       RUN pip install transformers==4.28.1
   ```

1. 다음 [build\$1and\$1push.sh](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/workspace/docker/build_and_push.sh) 스크립트를 사용하여 사용자 지정된 도커 이미지를 빌드하고 게시합니다.

   ```
   # Download script build_and_push.sh to workspace/docker
       ls workspace/docker
       build_and_push.sh  Dockerfile
       
       # Build and publish your docker image
       reponame = "torchserve"
       versiontag = "demo-0.1"
       
       ./build_and_push.sh {reponame} {versiontag} {baseimage} {region} {account}
   ```

**SageMaker AI 사전 설치 사용 사례**

다음 예제는 PyTorch DLC 컨테이너에 패키지를 사전 설치하는 방법을 보여줍니다. `requirements.txt` 파일은 `workspace/code` 디렉터리 아래에 로컬로 생성해야 합니다.

```
mkdir -p workspace/code
    cat workspace/code/requirements.txt
    
    transformers==4.28.1
```

## TorchServe 모델 아티팩트 생성하기
<a name="deploy-models-frameworks-torchserve-artifacts"></a>

다음 예제에서는 사전 훈련된 [MNIST 모델](https://github.com/pytorch/serve/tree/master/examples/image_classifier/mnist)이 사용되었습니다. 먼저 `workspace/mnist` 디렉터리를 생성하고, [TorchServe 사용자 지정 서비스 지침](https://github.com/pytorch/serve/blob/master/docs/custom_service.md#custom-service)에 따라 [mnist\$1handler.py](https://github.com/pytorch/serve/blob/master/examples/image_classifier/mnist/mnist_handler.py)를 구현한 다음, [model-config.yaml](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/workspace/lama/model-config.yaml)에서 [모델 파라미터](https://github.com/pytorch/serve/tree/master/model-archiver#config-file)(예: 배치 크기 및 작업자)를 구성합니다. 그 다음에는 TorchServe 도구 `torch-model-archiver`를 사용하여 모델 아티팩트를 빌드하고 Amazon S3에 업로드합니다.

1. `model-config.yaml`에서 모델 파라미터를 구성합니다.

   ```
   ls -al workspace/mnist-dev
       
       mnist.py
       mnist_handler.py
       mnist_cnn.pt
       model-config.yaml
       
       # config the model
       cat workspace/mnist-dev/model-config.yaml
       minWorkers: 1
       maxWorkers: 1
       batchSize: 4
       maxBatchDelay: 200
       responseTimeout: 300
   ```

1. [torch-model-archiver](https://github.com/pytorch/serve/tree/master/model-archiver#torch-model-archiver-for-torchserve)를 사용하여 모델 아티팩트를 빌드합니다.

   ```
   torch-model-archiver --model-name mnist --version 1.0 --model-file workspace/mnist-dev/mnist.py --serialized-file workspace/mnist-dev/mnist_cnn.pt --handler workspace/mnist-dev/mnist_handler.py --config-file workspace/mnist-dev/model-config.yaml --archive-format tgz
   ```

   패키지를 사전 설치하고자 하는 경우, `code` 디렉터리를 `tar.gz` 파일에 반드시 포함시켜야 합니다.

   ```
   cd workspace
       torch-model-archiver --model-name mnist --version 1.0 --model-file mnist-dev/mnist.py --serialized-file mnist-dev/mnist_cnn.pt --handler mnist-dev/mnist_handler.py --config-file mnist-dev/model-config.yaml --archive-format no-archive
       
       cd mnist
       mv ../code .
       tar cvzf mnist.tar.gz .
   ```

1. `mnist.tar.gz`를 Amazon S3에 업로드합니다.

   ```
   # upload mnist.tar.gz to S3
       output_path = f"s3://{bucket_name}/{prefix}/models"
       aws s3 cp mnist.tar.gz {output_path}/mnist.tar.gz
   ```

## 단일 모델 엔드포인트를 사용하여 TorchServe로 배포하기
<a name="deploy-models-frameworks-torchserve-single-model"></a>

다음 예제는 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/)를 사용하여 [단일 모델 실시간 추론 엔드포인트](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-deployment.html)를 생성하고, 모델을 엔드포인트에 배포하고, 엔드포인트를 테스트하는 방법을 보여줍니다.

```
from sagemaker.model import Model
    from sagemaker.predictor import Predictor
    
    # create the single model endpoint and deploy it on SageMaker AI
    model = Model(model_data = f'{output_path}/mnist.tar.gz', 
                  image_uri = baseimage,
                  role = role,
                  predictor_cls = Predictor,
                  name = "mnist",
                  sagemaker_session = smsess)
                  
    endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
    predictor = model.deploy(instance_type='ml.g4dn.xlarge',
                             initial_instance_count=1,
                             endpoint_name = endpoint_name,
                             serializer=JSONSerializer(),
                             deserializer=JSONDeserializer())  
                             
    # test the endpoint
    import random
    import numpy as np
    dummy_data = {"inputs": np.random.rand(16, 1, 28, 28).tolist()}
    
    res = predictor.predict(dummy_data)
```

## 다중 모델 엔드포인트를 사용하여 TorchServe로 배포하기
<a name="deploy-models-frameworks-torchserve-multi-model"></a>

[다중 모델 엔드포인트](https://docs.aws.amazon.com/sagemaker/latest/dg/multi-model-endpoints.html)는 하나의 엔드포인트 뒤에서 많은 수의 모델을 호스팅하기 위한 확장 가능하고 비용 효율적인 솔루션입니다. 이는 동일한 리소스 플릿를 공유하고 컨테이너가 모든 모델을 호스팅할 수 있도록 지원함으로써 엔드포인트 활용도를 높여줍니다. 또한 SageMaker AI가 모델을 동적으로 로드 및 로드 해제하고 트래픽 패턴에 따라 리소스를 유연하게 조정하게 되면서 배포 오버헤드가 줄어드는 효과도 있습니다. 다중 모델 엔드포인트는 가속화된 컴퓨팅 파워가 요구되는 딥 러닝 및 생성형 AI 모델에 특히 유용합니다.

SageMaker AI 다중 모델 엔드포인트에서 TorchServe를 사용할 경우, 이미 익숙한 기존 제공 스택을 사용하면서 SageMaker AI 다중 모델 엔드포인트가 제공하는 리소스 공유 및 단순화된 모델 관리 기능을 활용해 개발 속도를 끌어올릴 수 있게 됩니다.

다음 예제는 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/)를 사용하여 다중 모델 엔드포인트를 생성하고, 모델을 엔드포인트에 배포하고, 엔드포인트를 테스트하는 방법을 보여줍니다. 이 [노트북 예제](https://github.com/aws/amazon-sagemaker-examples/blob/main/inference/torchserve/mme-gpu/torchserve_multi_model_endpoint.ipynb)에서 추가적인 세부 정보를 확인할 수 있습니다.

```
from sagemaker.multidatamodel import MultiDataModel
    from sagemaker.model import Model
    from sagemaker.predictor import Predictor
    
    # create the single model endpoint and deploy it on SageMaker AI
    model = Model(model_data = f'{output_path}/mnist.tar.gz', 
                  image_uri = baseimage,
                  role = role,
                  sagemaker_session = smsess)
                  
    endpoint_name = 'torchserve-endpoint-' + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
    mme = MultiDataModel(
        name = endpoint_name,
        model_data_prefix = output_path,
        model = model,
        sagemaker_session = smsess)
    
    mme.deploy(
        initial_instance_count = 1,
        instance_type = "ml.g4dn.xlarge",
        serializer=sagemaker.serializers.JSONSerializer(),
        deserializer=sagemaker.deserializers.JSONDeserializer())
    
    # list models
    list(mme.list_models())
    
    # create mnist v2 model artifacts
    cp mnist.tar.gz mnistv2.tar.gz
    
    # add mnistv2
    mme.add_model(mnistv2.tar.gz)
    
    # list models
    list(mme.list_models())
    
    predictor = Predictor(endpoint_name=mme.endpoint_name, sagemaker_session=smsess)
                             
    # test the endpoint
    import random
    import numpy as np
    dummy_data = {"inputs": np.random.rand(16, 1, 28, 28).tolist()}
    
    res = predictor.predict(date=dummy_data, target_model="mnist.tar.gz")
```

## Metrics
<a name="deploy-models-frameworks-torchserve-metrics"></a>

TorchServe는 시스템 수준의 지표와 모델 수준의 지표를 모두 지원합니다. `TS_METRICS_MODE` 환경 변수를 통해 지표를 로그 형식 모드 또는 Prometheus 모드에서 활성화하는 것이 가능합니다. TorchServe 중앙 지표 구성 파일인 `metrics.yaml`을 사용하여 요청 수, 지연 시간, 메모리 사용량, GPU 사용률 등과 같이 추적을 수행할 지표의 유형을 지정할 수 있습니다. 이 파일을 참조하면, 배포된 모델의 성능 및 상태에 대한 인사이트를 얻고 TorchServe 서버의 실시간 동작을 효과적으로 모니터링할 수 있게 됩니다. 더 자세한 내용은 [TorchServe 지표 설명서](https://github.com/pytorch/serve/blob/master/docs/metrics.md#torchserve-metrics)를 참조하세요.

Amazon CloudWatch 로그 필터를 통해 StatSD 형식과 유사한 TorchServe 지표 로그에 액세스하는 것이 가능합니다. 다음은 TorchServe 지표 로그의 예제입니다.

```
CPUUtilization.Percent:0.0|#Level:Host|#hostname:my_machine_name,timestamp:1682098185
    DiskAvailable.Gigabytes:318.0416717529297|#Level:Host|#hostname:my_machine_name,timestamp:1682098185
```

# DJL Serving으로 모델 배포하기
<a name="deploy-models-frameworks-djl-serving"></a>

DJL Serving은 고성능의 범용 독립 실행형 모델 서빙 솔루션입니다. 딥 러닝 모델, 여러가지 모델 또는 워크플로를 지원하며, 이를 HTTP 엔드포인트를 통해 사용할 수 있게 해줍니다.

DJL Serving [Deep Learning Containers (DLCs)](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/what-is-dlc.html) 중 하나를 사용하여 AWS상의 모델을 서빙할 수 있습니다. 지원되는 모델 유형 및 프레임워크에 대해 알아보려면 [DJL Serving GitHub 리포지토리](https://github.com/deepjavalibrary/djl-serving)를 참조하세요.

DJL Serving은 모델을 고성능으로 배포할 수 있게 해주는 다음과 같이 다양한 특장점을 제공합니다.
+ 사용 편의성 - DJL Serving은 별도의 수정 없이 대부분의 모델을 서빙할 수 있습니다. 사용자가 모델 아티팩트를 가져오면, DJL Serving은 이를 호스팅할 수 있습니다.
+ 다중 디바이스 및 액셀러레이터 지원 - DJL Serving은 CPUs, GPUs 및 AWS Inferentia에 모델 배포를 지원합니다.
+ 성능 - DJL Serving은 단일 Java 가상 머신(JVM) 에서 멀티스레드 추론을 실행하여 처리량을 높입니다.
+ 동적 일괄 처리 - DJL Serving은 처리량 향상을 위해 동적 일괄 처리를 지원합니다.
+ Auto Scaling - DJL Serving은 트래픽 부하에 따라 작업자의 규모를 자동으로 늘리거나 줄여줍니다.
+ 다중 엔진 지원 - DJL Serving은 서로 다른 프레임워크(예: PyTorch 및 TensorFlow)를 사용하여 여러 모델을 동시에 호스팅할 수 있습니다.
+ 앙상블 및 워크플로 모델 - DJL Serving은 복수의 모델로 구성된 복잡한 워크플로의 배포를 지원하며, 워크플로의 일부는 CPU에서 실행하고 다른 부분은 GPU에서 실행하는 것도 가능합니다. 워크플로에 포함된 모델은 다양한 프레임워크를 활용할 수 있습니다.

다음 섹션에서는 SageMaker AI 상에서 DJL Serving을 사용하여 엔드포인트를 설정하는 방법에 대해 설명합니다.

## 시작하기
<a name="deploy-models-frameworks-djl-prereqs"></a>

시작하려면, 다음과 같은 사전 조건이 갖추어졌는지 확인하세요.

1.  AWS 계정에 액세스할 수 있는지 확인합니다. 가 AWS IAM 사용자 또는 IAM 역할을 통해 계정에 액세스할 AWS CLI 수 있도록 환경을 설정합니다. IAM 역할을 사용하는 것을 추천합니다. 사용자의 개인 계정에서 테스트를 수행하기 위해 다음과 같은 관리형 권한 정책을 IAM 역할에 연결할 수 있습니다.
   + [AmazonEC2ContainerRegistryFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess)
   + [AmazonEC2FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonEC2FullAccess)
   + [AmazonSageMakerFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonSageMakerFullAccess)
   + [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AmazonS3FullAccess)

1. 대상 시스템에 [Docker](https://docs.docker.com/get-docker/) 클라이언트가 설치되어 있는지 확인하세요.

1. Amazon Elastic Container Registry에 로그인하여 다음 환경 변수를 설정합니다.

   ```
   export ACCOUNT_ID=<your_account_id>
   export REGION=<your_region>
   aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
   ```

1. 도커 이미지를 가져옵니다.

   ```
   docker pull 763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118
   ```

   사용 가능한 DJL Serving 컨테이너 이미지를 모두 확인하려면 [대규모 모델 추론 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#large-model-inference-containers) 그리고 [DJL Serving CPU 추론 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#djl-cpu-full-inference-containers)를 참조하세요. 이전 링크의 테이블에서 이미지를 선택할 때 예제 URL 열의 AWS 리전을 현재 리전으로 바꿉니다. DLC는 [Available Deep Learning Containers Images](https://github.com/aws/deep-learning-containers/blob/master/available_images.md) 페이지 상단의 테이블에 나열된 리전에서 사용이 가능합니다.

## 컨테이너 사용자 지정하기
<a name="deploy-models-frameworks-djl-byoc"></a>

기본 DLC 이미지에 패키지를 추가하면 컨테이너의 사용자 지정이 가능합니다. `763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118` 도커 이미지에 패키지를 추가하려고 한다고 가정해 보겠습니다. 이 경우 원하는 이미지를 기본 이미지로 사용하여 dockerfile을 생성하고, 필요한 패키지를 추가하고, 해당 이미지를 Amazon ECR로 푸시해야 합니다.

패키지를 추가하려면 다음과 같은 단계를 완료하세요.

1. 기본 이미지의 dockerfile에서 원하는 라이브러리 또는 패키지를 구동하기 위한 지침을 지정합니다.

   ```
   FROM 763104351884.dkr.ecr.us-west-2.amazonaws.com/djl-inference:0.22.1-deepspeed0.9.2-cu118
                           
   ## add custom packages/libraries
   RUN git clone https://github.com/awslabs/amazon-sagemaker-examples
   ```

1. Dockerfile로부터 도커 이미지를 빌드합니다. 사용할 Amazon ECR 리포지토리, 기본 이미지 이름, 해당 이미지에 맞는 태그를 지정합니다. Amazon ECR 리포지토리가 없는 경우, *Amazon ECR 사용 설명서*의 [AWS CLI에서 Amazon ECR 사용](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html) 페이지에서 리포지토리를 생성하는 방법을 확인하세요.

   ```
   docker build -f Dockerfile -t <registry>/<image_name>:<image_tag>
   ```

1. 도커 이미지를 Amazon ECR 리포지토리에 푸시합니다.

   ```
   docker push $ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/<image_name>:<image_tag>
   ```

그러면 모델 서빙에 사용할 수 있는 사용자 지정 컨테이너 이미지가 얻어지게 됩니다. 컨테이너 사용자 지정에 대한 자세한 예는 [AWS 딥 러닝 컨테이너 사용자 지정 이미지 빌드를](https://github.com/aws/deep-learning-containers/blob/master/custom_images.md) 참조하세요.

## 모델 아티팩트 준비하기
<a name="deploy-models-frameworks-djl-artifacts"></a>

모델을 SageMaker AI에 배포하려면 먼저 모델 아티팩트를 `.tar.gz` 파일로 패키징해야 합니다. DJL Serving은 사용자의 아카이브에 다음과 같은 아티팩트를 수락합니다.
+ 모델 체크포인트: 모델 가중치를 저장하는 파일입니다.
+ `serving.properties`: 각 모델을 위해 추가할 수 있는 구성 파일입니다. `serving.properties`를 귀하의 모델 파일과 동일한 디렉터리에 배치합니다.
+ `model.py`: 추론 핸들러 코드입니다. 이는 Python 모드를 사용할 때만 적용 가능합니다. `model.py`를 지정하지 않을 경우, djl-serving은 기본 핸들러 중 하나를 사용하게 됩니다.

다음은 `model.tar.gz` 구조의 예시입니다.

```
 - model_root_dir # root directory
    - serving.properties            
    - model.py # your custom handler file for Python, if you choose not to use the default handlers provided by DJL Serving
    - model binary files # used for Java mode, or if you don't want to use option.model_id and option.s3_url for Python mode
```

DJL Serving은 DJL 또는 Python 엔진으로 구동되는 Java 엔진을 지원합니다. 선행 아티팩트가 모두 필요한 것은 아니며, 필요한 아티팩트는 사용자가 어떤 모드를 선택하는지에 따라 달라집니다. 예를 들어 Python 모드에서는 `serving.properties` 파일에 있는 `option.model_id`만 지정하면 되며, LMI 컨테이너 내부의 모델 체크포인트는 지정할 필요가 없습니다. Java 모드에서는 반드시 모델 체크포인트를 패키징해야 합니다. `serving.properties`를 구성하여 다양한 엔진으로 작동시키는 방법에 대한 자세한 내용은 [DJL Serving Operation Modes](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md) 페이지를 참조하세요.

## 단일 모델 엔드포인트를 사용하여 DJL Serving으로 배포하기
<a name="deploy-models-frameworks-djl-single-model"></a>

필요한 모델 아티팩트가 준비되면 SageMaker AI 엔드포인트에 모델을 배포할 수 있습니다. 이 섹션은 DJL Serving으로 엔드포인트에 단일 모델을 배포하는 방법을 설명합니다. 여러 모델을 배포하려는 경우, 이 섹션을 건너뛰고 [다중 모델 엔드포인트를 사용하여 DJL Serving으로 배포하기](#deploy-models-frameworks-djl-mme)으로 이동하세요.

다음 예제는 Amazon SageMaker Python SDK를 사용하여 모델 객체를 생성하는 방법을 보여줍니다. 이 경우 다음과 같은 필드를 지정해야 합니다.
+ `image_uri`: 이 예제에서와 같이 기본 DJL Serving 이미지 중 하나를 가져오거나, 또는 [컨테이너 사용자 지정하기](#deploy-models-frameworks-djl-byoc)에 나와 있는 지침을 따른 경우 본인의 Amazon ECR 리포지토리에서 사용자 지정 도커 이미지를 지정할 수 있습니다.
+ `model_s3_url`: 귀하의 `.tar.gz` 파일을 가리키는 Amazon S3 URI입니다.
+ `model_name`: 모델 객체의 이름을 지정합니다.

```
import boto3
 import sagemaker
from sagemaker.model import Model
from sagemaker import image_uris, get_execution_role

aws_region = "aws-region"
sagemaker_session = sagemaker.Session(boto_session=boto3.Session(region_name=aws_region))
role = get_execution_role()

def create_model(model_name, model_s3_url):
    # Get the DJL DeepSpeed image uri
    image_uri = image_uris.retrieve(
        framework="djl-deepspeed",
        region=sagemaker_session.boto_session.region_name,
        version="0.20.0"
    )
    model = Model(
        image_uri=image_uri,
        model_data=model_s3_url,
        role=role,
        name=model_name,
        sagemaker_session=sagemaker_session,
    )
    return model
```

## 다중 모델 엔드포인트를 사용하여 DJL Serving으로 배포하기
<a name="deploy-models-frameworks-djl-mme"></a>

하나의 엔드포인트에 여러 모델을 배포해야 하는 경우, SageMaker AI는 대량의 모델을 배포하기 위한 확장 가능하고 비용 효율적인 솔루션인 다중 모델 엔드포인트를 제공합니다. 또한 DJL Serving은 여러 모델을 동시에 로드한 다음 각 모델에서 추론을 동시에 실행할 수 있는 옵션을 지원합니다. DJL Serving 컨테이너는 SageMaker AI 다중 모델 엔드포인트 계약을 준수하며, 다중 모델 엔드포인트를 배포하는 용도로 사용이 가능합니다.

개별 모델 아티팩트는 앞서 [모델 아티팩트 준비하기](#deploy-models-frameworks-djl-artifacts) 섹션에서 설명한 것과 동일한 방식으로 패키징되어야 합니다. `serving.properties` 파일에서는 모델별 구성을 설정하고, `model.py`에서는 모델별 추론 핸들러 코드를 설정할 수 있습니다. 다중 모델 엔드포인트인 경우, 모델을 다음과 같은 방식으로 정렬해야 합니다.

```
 root_dir
        |-- model_1.tar.gz
        |-- model_2.tar.gz
        |-- model_3.tar.gz
            .
            .
            .
```

Amazon SageMaker Python SDK는 다중 모델 엔드포인트를 인스턴스화하기 위해 [MultiDataModel](https://sagemaker.readthedocs.io/en/stable/api/inference/multi_data_model.html) 객체를 사용합니다. 루트 디렉터리에 대한 Amazon S3 URI는 `MultiDataModel` 생성자에 대한 `model_data_prefix` 인수로서 전달되어야 합니다.

또한 DJL Serving은 `required_memory_mb`나 `reserved_memory_mb` 등의 모델 메모리 요구 사항을 관리하기 위한 여러가지 구성 파라미터를 제공하며, 이러한 파라미터는 [serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) 파일에서 각 모델별로 구성이 가능합니다. 이러한 파라미터는 메모리 부족 오류를 보다 적절하게 처리하는 데 유용합니다. 구성 가능한 모든 파라미터에 대해서는 [OutofMemory handling in djl-serving](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/out_of_memory_management.md)을 참조하세요.

DJL Serving의 Auto Scaling 기능을 사용하면, 들어오는 트래픽에 맞게 모델 크기를 손쉽게 조정할 수 있게 됩니다. 기본적으로, DJL Serving은 가용 하드웨어(예: CPU 코어 또는 GPU 디바이스)를 기반으로 지원 가능한 모델에 맞는 최대 작업자 수를 결정합니다. 항상 최소한의 트래픽 수준이 보장되고 단일 모델이 가용 리소스를 모두 소비하는 일이 없도록, 각 모델에 대한 하한과 상한을 설정할 수 있습니다. [serving.properties](https://github.com/deepjavalibrary/djl-serving/blob/master/serving/docs/modes.md#servingproperties) 파일에서 다음과 같은 속성을 설정할 수 있습니다.
+ `gpu.minWorkers`: GPU에서의 최소 작업자 수입니다.
+ `gpu.maxWorkers`: GPU에서의 최대 작업자 수입니다.
+ `cpu.minWorkers`: CPU에서의 최소 작업자 수입니다.
+ `cpu.maxWorkers`: CPU에서의 최대 작업자 수입니다.

DJL Serving 컨테이너를 사용하여 SageMaker AI에 다중 모델 엔드포인트를 배포하는 방법에 대한 포괄적인 예시를 보려면 [Multi-Model-Inference-Demo.ipynb](https://github.com/deepjavalibrary/djl-demo/blob/master/aws/sagemaker/Multi-Model-Inference-Demo.ipynb) 예시 노트북을 참조하세요.

# Triton Inference Server로 모델 배포
<a name="deploy-models-frameworks-triton"></a>

[Triton Inference Server](https://github.com/triton-inference-server/server)는 AI 추론 작업을 간소화하는 오픈 소스 방식의 추론 서빙 소프트웨어입니다. Triton을 사용하면 TensorRT, TensorFlow, PyTorch, ONNX, OpenVino, Python, RAPIDS FIL 등 여러 딥 러닝 및 기계 학습 프레임워크로 구축된 모델을 모두 배포할 수 있습니다.

SageMaker AI Triton 컨테이너는 SageMaker AI Hosting 플랫폼에 Triton Inference Server를 배포하여 프로덕션 환경의 훈련된 모델을 제공할 수 있게 해줍니다. 또한 SageMaker AI가 작동하는 서로 다른 여러 모드를 지원합니다. SageMaker AI에서 사용이 가능한 Triton Inference Server 컨테이너의 목록은 [NVIDIA Triton Inference Containers(SM 지원만 해당)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#nvidia-triton-inference-containers-sm-support-only)를 참조하세요.

종합적인 노트북 예제를 보려면, [amazon-sagemaker-examples 리포지토리](https://github.com/aws/amazon-sagemaker-examples/tree/main/sagemaker-triton)를 살펴보는 것이 좋습니다.

## 호스팅 모드
<a name="deploy-models-frameworks-triton-modes"></a>

Triton 컨테이너에서는 다음과 같은 SageMaker AI 호스팅 모드를 지원합니다.
+ 단일 모델 엔드포인트
  + 이는 SageMaker AI의 기본 작동 모드입니다. 이 모드에서 Triton 컨테이너는 단일 모델 또는 단일 앙상블 모델을 로드할 수 있습니다.
  + 모델의 이름은 반드시 `CreateModel` SageMaker AI API 직접 호출의 일부를 구성하는 컨테이너 환경의 속성으로서 전달되어야 합니다. 모델 이름을 전달하는 데 사용되는 환경 변수는 `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME`입니다.
+ 앙상블이 적용된 단일 모델 엔드포인트
  + Triton Inference Server는 *앙상블*을 지원하며, 앙상블은 일종의 파이프라인 또는 모델의 방향성 비순환 그래프(DAG)입니다. 앙상블은 엄밀히 말하면 여러 모델로 구성되어 있지만, 기본적인 단일 모델 엔드포인트 모드에서 SageMaker AI는 *앙상블 적합*(파이프라인을 나타내는 메타 모델)을 로드할 주 모델로 취급하고, 그 이후에 관련 모델을 로드할 수 있습니다.
  + 모델을 로드하려면 해당 앙상블 적합의 모델 이름을 사용해야 합니다. 이는 반드시 `CreateModel` SageMaker API 직접 호출의 일부를 구성하는 컨테이너 환경의 속성으로서 전달되어야 합니다. 모델 이름을 전달하는 데 사용되는 환경 변수는 `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME`입니다.
+ 다중 모델 엔드포인트
  + 이 모드에서 SageMaker AI는 단일 엔드포인트에서 복수의 모델을 제공할 수 있습니다. 이 모드를 사용하려면 환경 변수 `‘MultiModel’: true`을 `CreateModel` SageMaker API 직접 호출의 일부를 구성하는 컨테이너 환경의 속성으로서 지정해야 합니다.
  + 기본 설정은 인스턴스 시작 시 아무 모델도 로드되지 않는 것입니다. 특정 모델에 대해 추론 요청을 실행하려면, 해당 모델의 `*.tar.gz` 파일을 `InvokeEndpoint` SageMaker API 직접 호출의 `TargetModel` 속성에 대한 인수로서 지정하세요.
+ 앙상블이 적용된 다중 모델 엔드포인트
  + 이 모드에서 SageMaker AI는 다중 모델 엔드포인트에 대한 설명대로 작동합니다. 하지만 SageMaker AI Triton 컨테이너는 복수의 앙상블 모델을 로드할 수 있습니다. 즉, 여러 모델 파이프라인을 동일한 인스턴스에서 실행 가능합니다. SageMaker AI는 모든 앙상블을 하나의 모델로 취급하며, 각 모델의 앙상블 적합은 해당하는 `*.tar.gz` 아카이브를 `TargetModel`로 지정함으로써 간접적으로 호출될 수 있습니다.
  + 메모리 `LOAD` 및 `UNLOAD`가 동적으로 이루어지는 동안 메모리를 더 잘 관리하려면, 앙상블 크기를 되도록 작게 유지하는 것이 좋습니다.

## 추론 페이로드 유형
<a name="deploy-models-frameworks-triton-payloads"></a>

Triton은 네트워크를 통한 추론 페이로드 전송 시 `json` 및 `binary+json`(또는 바이너리로 인코딩된 json) 두 가지 방법을 지원합니다. 두 경우 모두에서 JSON 페이로드는 데이터 유형, 모양, 실제 추론 요청 텐서를 포함합니다. 요청 텐서는 반드시 바이너리 텐서여야 합니다.

`binary+json` 형식을 사용할 경우, Triton이 바이너리 페이로드를 올바르게 파싱할 수 있도록 헤더에 요청 메타데이터의 길이를 지정해두어야 합니다. SageMaker AI Triton 컨테이너에서는 다음과 같이 사용자 지정된 `Content-Type` 헤더(`application/vnd.sagemaker-triton.binary+json;json-header-size={}`)를 사용하여 이 작업을 수행합니다. SageMaker AI에서는 사용자 지정 헤더가 허용되지 않으므로 이는 독립 실행형 Triton Inference Server에서 `Inference-Header-Content-Length` 헤더를 사용하는 방식과는 다릅니다.

## config.pbtxt를 사용하여 모델 구성 설정하기
<a name="deploy-models-frameworks-triton-config"></a>

SageMaker AI 상의 Triton Inference Server의 경우, 각 모델에는 최소한 다음과 같은 모델 구성을 지정해 주는 `config.pbtxt` 파일이 포함되어 있어야 합니다.
+ `name`: 이는 SageMaker AI 이외에서 실행되는 모델을 위한 선택 사항이지만, SageMaker AI 상의 Triton에서 실행할 모델의 이름은 항상 제공하는 것이 좋습니다.
+ [`platform` 또는 `backend`](https://github.com/triton-inference-server/backend/blob/main/README.md#backends): 모델 유형을 지정하려면 백엔드 설정이 필수적입니다. 일부 백엔드에는 `tensorflow_savedmodel` 또는 ` tensorflow_graphdef`와 같은 추가적인 분류가 적용됩니다. 이러한 옵션은 `backend` 키뿐만 아니라 `platform` 키의 일부로서도 지정될 수 있습니다. 가장 일반적인 백엔드는 `tensorrt`, `onnxruntime`, `tensorflow`, `pytorch`, `python`, `dali`, `fil` 및 `openvino`입니다.
+ `input`: `name`, `data_type` 및 `dims`(모양)를 입력의 세 가지 속성으로 지정합니다.
+ `output`: `name`, `data_type` 및 `dims`(모양)를 출력의 세 가지 속성으로 지정합니다.
+ `max_batch_size`: Triton이 모델에 사용하게 되어 있는 최대 배치 크기를 나타내는 1보다 크거나 같은 값으로 배치 크기를 설정합니다.

`config.pbtxt` 구성에 대한 자세한 내용은 Triton의 GitHub [리포지토리](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md)를 참조하세요. Triton은 모델의 세부적 동작을 조정할 수 있는 몇 가지 구성을 제공합니다. 가장 일반적이고 중요한 구성 옵션은 다음과 같습니다.
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#instance-groups): 인스턴스 그룹은 특정 모델의 숫자와 위치 값을 지정할 수 있도록 해줍니다. 여기에는 `count`, `kind` 및 `gpus`(`kind`가 `KIND_GPU`일 경우 사용됨) 속성이 포함됩니다. `count` 속성은 작업자 수와 동일한 값입니다. 일반적인 모델 서빙의 경우, 모든 작업자는 각자의 모델 사본을 가지게 됩니다. 마찬가지로, Triton에서는 `count` 값이 디바이스당 모델 사본 수를 지정합니다. 예를 들어 `instance_group` 유형이 `KIND_CPU`인 경우, CPU는 `count`개의 모델 사본을 가지게 됩니다.
**참고**  
GPU 인스턴스에서는 `instance_group` 구성이 GPU 디바이스별로 적용됩니다. 예를 들어, 어떤 GPU 디바이스가 모델을 로드할 것인지 사용자가 명시적으로 지정하지 않는 한, 각 GPU 디바이스에는 `count`개의 모델 사본이 저장됩니다.
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/model_configuration.md#dynamic-batcher) 및 [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#stateful-models): 동적 일괄 처리 방식은 상태 비저장 모델에서 사용되고, 시퀀스 일괄 처리 방식은 상태 저장 모델(요청을 매번 동일한 모델 인스턴스로 라우팅하려는 경우)에서 사용됩니다. 일괄 처리 스케줄러는 모델별 대기열을 활성화하므로, 일괄 처리의 구성에 따라 처리량을 늘리는 것이 가능해집니다.
+ [https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/architecture.md#ensemble-models): 앙상블 모델은 하나 이상의 모델로 구성된 일종의 *파이프라인*으로, 해당 모델들 간의 입력 및 출력 텐서 연결 상태를 나타냅니다. 이는 `platform` 값을 `ensemble`로 지정함으로써 구성 가능합니다. 앙상블 구성은 해당 모델 파이프라인의 표현일 뿐입니다. SageMaker AI에서는 앙상블을 구성하는 모든 모델이 앙상블 모델의 종속 모델로서 취급되며, 이는 `LoadedModelCount`처럼 SageMaker AI 지표에 대해 단일 모델로 간주됩니다.

## Amazon CloudWatch에 기본 Triton 지표 게시하기
<a name="deploy-models-frameworks-triton-metrics"></a>

NVIDIA Triton Inference Container는 Triton Inference Server에서 사용되는 다양한 모델 및 GPU에 대한 지표를 8002 포트(구성 가능함)에서 노출합니다. 사용 가능한 기본 지표에 대한 전체 세부 사항은 GitHub의 [Triton Inference Server 지표](https://github.com/triton-inference-server/server/blob/main/docs/user_guide/metrics.md) 페이지를 참조하세요. 이러한 지표는 Prometheus 형식이며, 이는 Prometheus 스크레이퍼 구성을 사용하여 스크랩할 수 있습니다.

버전 v23.07 이후의 SageMaker AI Triton 컨테이너는 몇 가지 환경 변수를 지정하여 이러한 지표를 Amazon CloudWatch에 게시할 수 있도록 지원합니다. SageMaker AI Triton 컨테이너는 Prometheus 지표를 스크랩하기 위해 Amazon CloudWatch 에이전트를 활용합니다.

지표 수집을 위해 사용자가 지정하도록 되어 있는 필수 환경 변수는 다음과 같습니다.


| 환경 변수 | 설명 | 예시 값 | 
| --- | --- | --- | 
|  `SAGEMAKER_TRITON_ALLOW_METRICS`  |  Triton이 자체 Prometheus 엔드포인트에 지표를 게시할 수 있도록 하려면 이 옵션을 지정합니다.  | "true" | 
|  `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH`  |  Amazon CloudWatch에 지표를 게시하는 데 필요한 사전 검사를 시작하려면 이 옵션을 지정합니다.  | "true" | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP`  |  지표가 기록될 대상 로그 그룹을 가리키려면 이 옵션을 지정합니다.  | "/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesTest" | 
|  `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE`  |  확인하고자 하는 지표 네임스페이스를 가리키고 지표를 플로팅하려면 이 옵션을 지정합니다.  | "/aws/SageMaker AI/Endpoints/TritonMetrics/SageMakerTwoEnsemblesPublicTest" | 
|  `SAGEMAKER_TRITON_METRICS_PORT`  |  이 포트를 8002 또는 다른 포트로 지정합니다. 지정된 포트를 SageMaker AI가 차단하지 않았다면 해당 포트가 사용됩니다. 그 밖의 경우, 차단되지 않은 다른 포트가 자동으로 선택됩니다.  | "8002" | 

SageMaker AI에서 Triton을 사용하여 지표를 게시할 경우 다음과 같은 제한 사항에 유의합니다.
+ C-API 및 Python 백엔드(v23.05 이후)를 통해 사용자 지정 지표를 생성하는 것은 가능하지만, 이를 Amazon CloudWatch에 게시하는 것은 현재 지원되지 않습니다.
+ SageMaker AI 다중 모델 엔드포인트(MME) 모드에서는 각 모델(앙상블 모델 제외)이 마치 자체적인 모델 리포지토리에 있는 것처럼 취급되므로 Triton은 모델 네임스페이스를 사용해야 하는 조건의 환경에서 실행되게 됩니다. 현재는 이로 인해 지표 사용이 제한됩니다. 모델 네임스페이스가 활성화되어 있다면, Triton은 서로 다른 앙상블에 속하는 동일한 이름을 가진 두 모델 간의 지표를 따로 구분하지 않습니다. 해결 방법은, 배포되는 모든 모델에 고유한 이름을 개별적으로 지정하면 됩니다. 또한 이렇게 하면 CloudWatch에서 지표를 더 쉽게 조회할 수 있습니다.

## 환경 변수
<a name="deploy-models-frameworks-triton-variables"></a>

다음 표에는 SageMaker AI 상의 Triton에서 지원되는 환경 변수가 나와 있습니다.


| 환경 변수 | 설명 | 형식 | 가능한 값 | 
| --- | --- | --- | --- | 
| `SAGEMAKER_MULTI_MODEL` | Triton이 SageMaker AI 다중 모델 엔드포인트 모드에서 작동될 수 있도록 지원합니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_DEFAULT_MODEL_NAME` | SageMaker AI 단일 모델(기본값) 모드에서 로드할 모델을 지정합니다. 앙상블 모드인 경우, 앙상블 적합의 이름을 지정합니다. | 문자열 | config.pbtxt에 지정되어 있는 *<model\$1name>* | 
| `SAGEMAKER_TRITON_PING_MODE` | SageMaker AI의 단일 모델 모드에서 기본값 모드는 `'ready'`이고, SageMaker AI의 다중 모델 엔드포인트 모드에서 기본값 모드는 `'live'`입니다. | 문자열 | `ready`, `live` | 
| `SAGEMAKER_TRITON_DISABLE_MODEL_NAMESPACING` | SageMaker AI Triton 컨테이너에서는 이 옵션이 기본적으로 `true`로 설정되어 있습니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_BIND_TO_PORT` | SageMaker AI 사용 시 기본 포트는 8080번입니다. 다중 컨테이너 시나리오에서는 다른 포트로의 사용자 지정도 가능합니다. | 문자열 | *<port\$1number>* | 
| `SAGEMAKER_SAFE_PORT_RANGE` | 이는 다중 컨테이너 모드 사용 시 SageMaker AI 플랫폼에서 설정됩니다. | 문자열 | *<port\$11>*–*<port\$12>* | 
| `SAGEMAKER_TRITON_ALLOW_GRPC` | SageMaker AI는 현재 GRPC를 지원하지 않지만, 사용자 지정 역방향 프록시 앞에서 Triton을 사용하는 경우라면 GRPC를 사용해도 됩니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_GRPC_PORT` | GRPC의 기본 포트는 8001이지만, 사용자가 변경할 수 있습니다. | 문자열 | *<port\$1number>* | 
| `SAGEMAKER_TRITON_THREAD_COUNT` | 기본 HTTP 요청 핸들러 스레드 수를 임의로 설정할 수 있습니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_LOG_VERBOSE` | SageMaker AI에서 기본적으로 `true`이지만, 이 옵션은 필요에 따라 끌 수 있습니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_INFO` | SageMaker AI에서 기본적으로 `false`입니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_WARNING` | SageMaker AI에서 기본적으로 `false`입니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_LOG_ERROR` | SageMaker AI에서 기본적으로 `false`입니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_SHM_DEFAULT_BYTE_SIZE` | Python 백엔드의 shm 크기를 바이트 단위로 지정합니다. 기본값은 16MB이지만 늘릴 수 있습니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_SHM_GROWTH_BYTE_SIZE` | Python 백엔드의 shm 성장 크기를 바이트 단위로 지정합니다. 기본값은 1MB이지만 더 큰 단위의 증감을 위해 늘릴 수 있습니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_TENSORFLOW_VERSION` | 기본값은 `2`입니다. Triton은 Triton v23.04 버전부터는 Tensorflow 2를 지원하지 않습니다. 이전 버전에서는 이 변수를 구성할 수 있습니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_MODEL_LOAD_GPU_LIMIT` | 모델 로딩에 사용되는 최대 GPU 메모리 비율을 제한함으로써 그 나머지를 추론 요청에 사용할 수 있도록 해줍니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_ALLOW_METRICS` | SageMaker AI에서 기본적으로 `false`입니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_METRICS_PORT` | 기본 포트는 8002입니다. | 문자열 | *<number>* | 
| `SAGEMAKER_TRITON_PUBLISH_METRICS_TO_CLOUDWATCH` | SageMaker AI에서 기본적으로 `false`입니다. Triton 기본 지표가 Amazon CloudWatch로 푸시될 수 있도록 하려면 이 변수를 `true`로 설정하세요. 이 옵션을 활성화한 경우, 지표가 계정에 게시될 때 발생하는 CloudWatch 비용은 사용자가 부담해야 합니다. | 부울 | `true`, `false` | 
| `SAGEMAKER_TRITON_CLOUDWATCH_LOG_GROUP` | CloudWatch에 대한 지표 게시를 활성화한 경우 필수입니다. | 문자열 | *<cloudwatch\$1log\$1group\$1name>* | 
| `SAGEMAKER_TRITON_CLOUDWATCH_METRIC_NAMESPACE` | CloudWatch에 대한 지표 게시를 활성화한 경우 필수입니다. | 문자열 | *<cloudwatch\$1metric\$1namespace>* | 
| `SAGEMAKER_TRITON_ADDITIONAL_ARGS` | Triton Server를 시작할 때 별도의 인수를 추가해줍니다. | 문자열 | *<additional\$1args>* | 