

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用实例池部署到多个实例类型
<a name="realtime-endpoints-heterogeneous"></a>

将模型部署到 A SageMaker I 终端节点时，通常会为生产变体指定单一实例类型。如果该实例类型在目标可用区域中不可用，则部署将失败并显示容量不足错误 (ICE)，您必须使用其他实例类型手动重试。

使用实例池，您可以为生产变体指定最多五种实例类型的有序列表。 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 在操作失败之前尝试跨所有池配置实例所花费的总时间。

### Real-time 具有单个模型的端点
<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 编译的模型，在另一种实例类型上部署未编译的版本。

### Real-time 带有推理组件的端点
<a name="heterogeneous-endpoint-setup-ic"></a>

当您在实例池中使用推理组件时，有两个选项可以定义规范：
+ Sing@@ **le `Specification`** — 在终端节点的实例池中的所有实例类型中使用相同的模型和资源配置。当模型可以在任何具有相同资源要求的预配置实例类型上运行时，这种方法就会起作用。
+ **多个 `Specifications`**-使用`Specifications`参数（复数）为每种实例类型定义不同的模型或资源配置。每个规范都包含一个`InstanceType`字段，用于将其映射到终端节点实例池中的实例类型。

以下示例创建了一个具有每个实例类型规格的推理组件：

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

使用实例池时，在变体中所有实例中汇总的现有 CloudWatch 指标`CPUUtilization`（例如`Invocations``ModelLatency`、和）将继续以相同的方式工作。此外，还 CloudWatch 会发布带有`InstanceType`维度的这些指标，以便您可以单独监控每种实例类型的性能。

### Per-instance-type 指标
<a name="heterogeneous-observability-per-type"></a>

当生产变体使用实例池时，以下维度组合可用于按实例类型 CloudWatch 进行监控：


| 维度组合 | 使用案例 | 
| --- | --- | 
| EndpointName, VariantName, InstanceType | 筛选变体中特定实例类型的端点级别和调用指标（例如CPUUtilizationInvocations、、ModelLatency）。 | 
| InferenceComponentName, InstanceType | 筛选特定实例类型的推理组件指标。使用它来比较同一个推理组件在不同实例类型上的表现。 | 

这些维度适用于标准 CloudWatch 指标和增强指标。有关可用指标的完整列表，请参阅[亚马逊中的亚马逊 A SageMaker I 指标 CloudWatch](monitoring-cloudwatch.md)和[Amazon SageMaker AI 增强了推理终端节点的指标](monitoring-cloudwatch-enhanced-metrics.md)。

### 查看车队分布
<a name="heterogeneous-observability-distribution"></a>

要查看每个池的当前实例数，请调用 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeEndpoint.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeEndpoint.html)API。响应`ProductionVariants`中包含一个`InstancePools`列表，其中包含每种实例类型的当前计数。这会显示预配置后的队列构成，包括优先级较低的池中的任何备用实例。

如果您使用推理组件，则[https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeInferenceComponent.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_DescribeInferenceComponent.html)响应会在运行时配置摘要中包含一个`PlacementStatus`字段，该字段显示每种实例类型的副本数。使用它来了解推理组件副本如何分布在队列中的实例类型中。

## Auto-scaling 带实例池
<a name="heterogeneous-endpoint-autoscaling"></a>

Auto-scaling 使用实例池的过程与标准终端节点自动缩放的过程相同。您可以注册可扩展目标、定义扩展策略并将其应用于您的终端节点。有关一般的自动缩放设置，请参阅。[自动缩放 Amazon SageMaker 人工智能模型](endpoint-auto-scaling.md)

关键区别在于，当扩展事件触发时， SageMaker AI 是如何配置和释放实例的：

向外扩展（添加实例）  
SageMaker AI 从优先级最高的池（最低优先级值）开始配置实例。如果 SageMaker AI 遇到当前实例类型的容量不足错误，它将按优先级顺序自动回退到下一个池。 SageMaker AI 会继续跨池重试，直到实例配置完毕或达到实例总数`VariantInstanceProvisionTimeoutInSeconds`。

缩小规模（移除实例）  
SageMaker AI 从最低优先级池（最高优先级值）开始释放实例。您的首选、优先级较高的实例类型会尽可能长时间地保持运行，并首先释放备用实例。

### 使用预定义的缩放指标
<a name="heterogeneous-autoscaling-predefined"></a>

预定义的扩展指标，例如`SageMakerVariantInvocationsPerInstance`继续使用实例池。这些指标汇总了变体中所有实例类型，因此扩展行为与标准端点相同。当池中的所有实例类型都具有相似容量时，这是最简单的方法。

有关目标跟踪和步进扩展策略的设置，请参阅[自动缩放 Amazon SageMaker 人工智能模型](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`，`cr_g6e`获取每个实例类型的指标`ConcurrentRequestsPerModel`。该`weighted_avg`表达式将它们与相等的权重 (0.5/0.5) 组合在一起。调整权重以更改策略对每种实例类型负载的响应方式。

**权重如何影响扩展行为：**实例类型的权重越高意味着扩展策略对该类型的负载*更敏感*，而不是更低。权重较低的类型的信号会被抑制，因此它可以在触发缩放事件之前以更高的利用率运行。


| 体重策略 | High-priority 类型容差 | Low-priority 类型容差 | 适用于 | 
| --- | --- | --- | --- | 
| 高优先级的权重更高 (0.7/ 0.3) | 较低（受保护） | 更高（跑得更热） | 保护昂贵或高容量的实例免受过载的影响 | 
| 等于 (0.5/0.5) | 平衡 | 平衡 | 大多数工作负载的默认建议 | 
| 低优先级的权重更高 (0.3/0.7) | 更高（跑得更热） | 较低（受保护） | 防止较小的备用实例饱和 | 

有关使用自动缩放功能的自定义指标的更多信息，请参阅。[定义自定义指标（CloudWatch 指标：CPU利用率）](endpoint-auto-scaling-add-code-define.md#endpoint-auto-scaling-add-code-custom)