

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

# 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
```