

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

# 인스턴스 풀을 사용하여 여러 인스턴스 유형에 배포
<a name="realtime-endpoints-heterogeneous"></a>

SageMaker AI 엔드포인트에 모델을 배포할 때 일반적으로 프로덕션 변형에 대해 단일 인스턴스 유형을 지정합니다. 대상 가용 영역에서 해당 인스턴스 유형을 사용할 수 없는 경우 용량 부족 오류(ICE)로 인해 배포가 실패하므로 다른 인스턴스 유형으로 수동으로 다시 시도해야 합니다.

인스턴스 풀을 사용하면 프로덕션 변형에 대해 최대 5개의 인스턴스 유형으로 구성된 정렬된 목록을 지정할 수 있습니다. SageMaker AI는 우선 순위가 가장 높은 유형(우선 순위 1)부터 인스턴스를 프로비저닝하려고 시도하며 용량을 사용할 수 없는 경우 자동으로 우선 순위가 더 낮은 유형으로 돌아갑니다. 따라서 수동 재시도가 필요 없으며 엔드포인트 가용성이 향상됩니다.

인스턴스 풀은 실시간 추론 엔드포인트와 비동기 추론 엔드포인트를 모두 지원합니다. 단일 모델 엔드포인트 및 추론 구성 요소와 함께 사용할 수 있습니다.

다음 단계에서는 인스턴스 풀 프로비저닝의 작동 방식을 설명합니다.

1. SageMaker AI는 우선순위가 가장 높은 풀(우선순위 1)에서 인스턴스를 프로비저닝하려고 합니다.

1. SageMaker AI에서 현재 인스턴스 유형에 대해 용량 부족 오류(ICE)가 발생하면 우선 순위에 따라 자동으로 다음 풀로 돌아갑니다.

1. 이는 필요한 수의 인스턴스가 프로비저닝되거나, 모든 풀이 소진되거나, 총 프로비저닝 제한 시간(`VariantInstanceProvisionTimeoutInSeconds`)에 도달할 때까지 계속됩니다.

**Topics**
+ [인스턴스 풀을 사용하여 엔드포인트 설정](#heterogeneous-endpoint-setup)
+ [인스턴스 풀 모니터링](#heterogeneous-endpoint-observability)
+ [인스턴스 풀을 사용한 Auto Scaling](#heterogeneous-endpoint-autoscaling)

## 인스턴스 풀을 사용하여 엔드포인트 설정
<a name="heterogeneous-endpoint-setup"></a>

인스턴스 풀을 사용하려면 프로덕션 변형의 `InstanceType` 파라미터를 `InstancePools` 목록으로 바꿉니다. 각 항목은 인스턴스 유형과 우선 순위(1\~5, 여기서 1은 가장 높음)를 지정합니다. 선택적으로 `VariantInstanceProvisionTimeoutInSeconds` (300\~3600초)를 설정하여 작업이 실패하기 전에 SageMaker AI가 모든 풀에서 인스턴스 프로비저닝을 시도하는 총 시간을 제어할 수 있습니다.

### 단일 모델을 사용한 실시간 엔드포인트
<a name="heterogeneous-endpoint-setup-realtime"></a>

다음 예제에서는 두 개의 인스턴스 풀이 있는 엔드포인트 구성을 생성합니다. `ml.g6.2xlarge` 인스턴스를 사용할 수 없는 경우 SageMaker AI는 로 돌아갑니다`ml.g6e.2xlarge`.

```
import boto3

sagemaker_client = boto3.client("sagemaker")

endpoint_config_name = "my-heterog-endpoint-config"

sagemaker_client.create_endpoint_config(
    EndpointConfigName=endpoint_config_name,
    ProductionVariants=[
        {
            "VariantName": "AllTraffic",
            "ModelName": "my-model",
            "InitialInstanceCount": 2,
            "InstancePools": [
                {
                    "InstanceType": "ml.g6.2xlarge",
                    "Priority": 1,
                },
                {
                    "InstanceType": "ml.g6e.2xlarge",
                    "Priority": 2,
                },
            ],
            "VariantInstanceProvisionTimeoutInSeconds": 600,
        }
    ],
)

sagemaker_client.create_endpoint(
    EndpointName="my-heterog-endpoint",
    EndpointConfigName=endpoint_config_name,
)
```

각 풀의 `ModelNameOverride` 파라미터를 사용하여 해당 인스턴스 유형에 최적화된 다른 모델을 지정할 수도 있습니다. 예를 들어 한 인스턴스 유형에서는 GPU용으로 컴파일된 모델을 배포하고 다른 인스턴스 유형에서는 컴파일되지 않은 버전을 배포할 수 있습니다.

### 추론 구성 요소가 있는 실시간 엔드포인트
<a name="heterogeneous-endpoint-setup-ic"></a>

인스턴스 풀과 함께 추론 구성 요소를 사용하는 경우 사양을 정의하는 두 가지 옵션이 있습니다.
+ **단일 `Specification`** - 엔드포인트의 인스턴스 풀에 있는 모든 인스턴스 유형에서 동일한 모델 및 리소스 구성을 사용합니다. 이는 리소스 요구 사항이 동일한 프로비저닝된 인스턴스 유형에서 모델을 실행할 수 있는 경우에 작동합니다.
+ **다중 `Specifications`** - `Specifications` 파라미터(복수)를 사용하여 각 인스턴스 유형에 대해 서로 다른 모델 또는 리소스 구성을 정의합니다. 각 사양에는 엔드포인트의 인스턴스 풀에 있는 인스턴스 유형에 매핑하는 `InstanceType` 필드가 포함되어 있습니다.

다음 예제에서는 per-instance-type 사양으로 추론 구성 요소를 생성합니다.

```
sagemaker_client.create_inference_component(
    InferenceComponentName="my-ic",
    EndpointName="my-heterog-endpoint",
    VariantName="AllTraffic",
    Specifications=[
        {
            "InstanceType": "ml.g6.2xlarge",
            "ModelName": "my-model-g6",
            "Container": {
                "Image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/my-image:latest",
            },
            "ComputeResourceRequirements": {
                "NumberOfAcceleratorDevicesRequired": {{1}},
                "MinMemoryRequiredInMb": {{4096}},
            },
        },
        {
            "InstanceType": "ml.g6e.2xlarge",
            "ModelName": "my-model-g6e",
            "Container": {
                "Image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/my-image:latest",
            },
            "ComputeResourceRequirements": {
                "NumberOfAcceleratorDevicesRequired": {{1}},
                "MinMemoryRequiredInMb": {{8192}},
            },
        },
    ],
    RuntimeConfig={
        "CopyCount": 2,
    },
)
```

## 인스턴스 풀 모니터링
<a name="heterogeneous-endpoint-observability"></a>

`Invocations`, `ModelLatency`, 등 변형의 모든 인스턴스에서 집계되는 기존 CloudWatch 지표는 인스턴스 풀을 사용할 때도 동일한 방식으로 `CPUUtilization` 계속 작동합니다. 또한 CloudWatch는 이러한 지표를 `InstanceType`차원과 함께 게시하므로 각 인스턴스 유형에 대한 성능을 개별적으로 모니터링할 수 있습니다.

### per-instance-type 지표
<a name="heterogeneous-observability-per-type"></a>

프로덕션 변형이 인스턴스 풀을 사용하는 경우 CloudWatch에서 per-instance-type 모니터링을 위해 다음 차원 조합을 사용할 수 있습니다.


| 차원 조합 | 사용 사례: | 
| --- | --- | 
| EndpointName, VariantName, InstanceType | 변형 내의 특정 인스턴스 유형에 대한 엔드포인트 수준 및 호출 지표(예: CPUUtilization, Invocations, ModelLatency)를 필터링합니다. | 
| InferenceComponentName, InstanceType | 특정 인스턴스 유형에 대한 추론 구성 요소 지표를 필터링합니다. 이를 사용하여 여러 인스턴스 유형에서 동일한 추론 구성 요소가 어떻게 수행되는지 비교할 수 있습니다. | 

이러한 차원은 표준 CloudWatch 지표와 향상된 지표 모두에 사용할 수 있습니다. 사용 가능한 지표의 전체 목록은 [Amazon CloudWatch의 Amazon SageMaker AI 지표](monitoring-cloudwatch.md) 및 섹션을 참조하세요[추론 엔드포인트에 대한 Amazon SageMaker AI 향상된 지표](monitoring-cloudwatch-enhanced-metrics.md).

### 플릿 배포 확인
<a name="heterogeneous-observability-distribution"></a>

각 풀의 현재 인스턴스 수를 보려면 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeEndpoint.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeEndpoint.html) API를 호출합니다. 응답`ProductionVariants`의 에는 각 인스턴스 유형에 대한 현재 개수가 포함된 `InstancePools` 목록이 포함됩니다. 이는 우선 순위가 낮은 풀의 폴백 인스턴스를 포함하여 프로비저닝 후 플릿 구성을 보여줍니다.

추론 구성 요소를 사용하는 경우 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeInferenceComponent.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeInferenceComponent.html) 응답에는 인스턴스 유형당 복사 수를 보여주는 `PlacementStatus` 필드가 런타임 구성 요약에 포함됩니다. 이를 통해 플릿의 인스턴스 유형에 추론 구성 요소 복사본이 어떻게 배포되는지 이해할 수 있습니다.

## 인스턴스 풀을 사용한 Auto Scaling
<a name="heterogeneous-endpoint-autoscaling"></a>

인스턴스 풀을 사용한 Auto Scaling은 표준 엔드포인트 Auto Scaling과 동일한 프로세스를 따릅니다. 확장 가능 대상을 등록하고, 조정 정책을 정의하고, 엔드포인트에 적용합니다. 일반적인 Auto Scaling 설정은 섹션을 참조하세요[Amazon SageMaker AI 모델의 자동 규모 조정](endpoint-auto-scaling.md).

주요 차이점은 조정 이벤트가 트리거될 때 SageMaker AI가 인스턴스를 프로비저닝하고 릴리스하는 방법입니다.

스케일 아웃(인스턴스 추가)  
SageMaker AI는 우선순위가 가장 높은 풀(가장 낮은 우선순위 값)로 시작하는 인스턴스를 프로비저닝합니다. SageMaker AI에서 현재 인스턴스 유형에 대해 용량 부족 오류가 발생하면 우선 순위에 따라 자동으로 다음 풀로 돌아갑니다. SageMaker AI는 인스턴스가 프로비저닝되거나 합계에 도달할 때까지 풀 간에 계속 재시도`VariantInstanceProvisionTimeoutInSeconds`합니다.

축소(인스턴스 제거)  
SageMaker AI는 우선 순위가 가장 낮은 풀(우선 순위가 가장 높은 값)부터 인스턴스를 릴리스합니다. 우선 순위가 높은 기본 인스턴스 유형은 가능한 한 계속 실행되며 폴백 인스턴스가 먼저 릴리스됩니다.

### 사전 정의된 조정 지표 사용
<a name="heterogeneous-autoscaling-predefined"></a>

와 같이 미리 정의된 조정 지표는 인스턴스 풀에서 `SageMakerVariantInvocationsPerInstance` 계속 작동합니다. 이러한 지표는 변형의 모든 인스턴스 유형에서 집계되므로 조정 동작은 표준 엔드포인트와 동일합니다. 이는 풀의 모든 인스턴스 유형이 비슷한 용량을 가질 때 가장 간단한 접근 방식입니다.

대상 추적 및 단계 조정 정책 설정은 섹션을 참조하세요[Amazon SageMaker AI 모델의 자동 규모 조정](endpoint-auto-scaling.md).

### 혼합 플릿에 가중치 사용자 지정 지표 사용
<a name="heterogeneous-autoscaling-weighted"></a>

인스턴스 풀에 컴퓨팅 용량이 다른 인스턴스 유형이 포함된 경우 CloudWatch 지표 수학을 사용하여 가중치 조정 신호를 생성할 수 있습니다. 이를 통해 각 인스턴스 유형의 로드가 전체 조정 결정에 얼마나 기여하는지 제어할 수 있습니다.

다음 예제에서는 두 인스턴스 유형`ConcurrentRequestsPerModel`에서의 가중 평균을 사용하는 대상 추적 정책을 생성합니다. 가중치는 조정 정책이 각 유형의 로드에 얼마나 민감한지 결정합니다.

```
import boto3

aas_client = boto3.client("application-autoscaling")

# Register the scalable target
aas_client.register_scalable_target(
    ServiceNamespace="sagemaker",
    ResourceId="endpoint/my-heterog-endpoint/variant/AllTraffic",
    ScalableDimension="sagemaker:variant:DesiredInstanceCount",
    MinCapacity=1,
    MaxCapacity=10,
)

# Define target tracking policy with weighted metric math
aas_client.put_scaling_policy(
    PolicyName="weighted-concurrent-requests",
    ServiceNamespace="sagemaker",
    ResourceId="endpoint/my-heterog-endpoint/variant/AllTraffic",
    ScalableDimension="sagemaker:variant:DesiredInstanceCount",
    PolicyType="TargetTrackingScaling",
    TargetTrackingScalingPolicyConfiguration={
        "TargetValue": {{10.0}},
        "CustomizedMetricSpecification": {
            "Metrics": [
                {
                    "Id": "cr_g6",
                    "Label": "ConcurrentRequests-g6-2xlarge",
                    "MetricStat": {
                        "Metric": {
                            "Namespace": "AWS/SageMaker",
                            "MetricName": "ConcurrentRequestsPerModel",
                            "Dimensions": [
                                {"Name": "EndpointName", "Value": "my-heterog-endpoint"},
                                {"Name": "VariantName", "Value": "AllTraffic"},
                                {"Name": "InstanceType", "Value": "ml.g6.2xlarge"},
                            ],
                        },
                        "Stat": "Average",
                    },
                    "ReturnData": False,
                },
                {
                    "Id": "cr_g6e",
                    "Label": "ConcurrentRequests-g6e-2xlarge",
                    "MetricStat": {
                        "Metric": {
                            "Namespace": "AWS/SageMaker",
                            "MetricName": "ConcurrentRequestsPerModel",
                            "Dimensions": [
                                {"Name": "EndpointName", "Value": "my-heterog-endpoint"},
                                {"Name": "VariantName", "Value": "AllTraffic"},
                                {"Name": "InstanceType", "Value": "ml.g6e.2xlarge"},
                            ],
                        },
                        "Stat": "Average",
                    },
                    "ReturnData": False,
                },
                {
                    "Id": "weighted_avg",
                    "Label": "WeightedConcurrentRequests",
                    "Expression": "{{0.5}} * cr_g6 + {{0.5}} * cr_g6e",
                    "ReturnData": True,
                },
            ],
        },
    },
)
```

이 예제에서는 `cr_g6` 인스턴스 per-instance-type `ConcurrentRequestsPerModel` 지표를 `cr_g6e` 가져옵니다. `weighted_avg` 표현식은 이들을 동일한 가중치(0.5/0.5)와 결합합니다. 가중치를 조정하여 정책이 각 인스턴스 유형의 로드에 응답하는 방식을 변경합니다.

**가중치가 조정 동작에 미치는 영향:** 인스턴스 유형의 가중치가 높을수록 조정 정책이 해당 유형의 로드에 *더 민감*하지만 그보다 작지는 않음을 의미합니다. 가중치가 낮은 유형의 신호는 감쇠되므로 조정 이벤트를 트리거하기 전에 더 높은 사용률로 실행할 수 있습니다.


| 가중치 전략 | 우선 순위가 높은 유형 허용치 | 우선 순위가 낮은 유형 허용치 | 최적의 용도 | 
| --- | --- | --- | --- | 
| 우선 순위가 높을수록 가중치가 높음(0.7/0.3) | 낮음(보호됨) | 더 높음(더 뜨거워짐) | 고가 또는 대용량 인스턴스를 오버로드로부터 보호 | 
| 같음(0.5/0.5) | 밸런스 | 밸런스 | 대부분의 워크로드에 대한 기본 권장 사항 | 
| 우선 순위가 낮을수록 가중치가 높음(0.3/0.7) | 더 높음(더 뜨거워짐) | 낮음(보호됨) | 작은 폴백 인스턴스가 포화되지 않도록 방지 | 

Auto Scaling을 사용한 사용자 지정 지표에 대한 자세한 내용은 섹션을 참조하세요[사용자 지정 지표 정의(CloudWatch 지표: CPUUtilization)](endpoint-auto-scaling-add-code-define.md#endpoint-auto-scaling-add-code-custom).