当一个模型服务需要满足 Multi-AZ 高可用合规要求时,问题并不只是“启动更多实例”。如果多个模型副本恰好集中在同一个 Availability Zone(AZ),单个可用区故障仍可能让服务整体失去容量。
Salesforce 的实践重点在于:利用 Amazon SageMaker AI Inference Components 的 SchedulingConfig,让模型副本能够分布到多个 AZ,同时保留多模型共托管带来的成本效率。对于共享推理基础设施的团队,这是一种比简单增加实例数量更精细的容量与可用性控制方式。
多模型共托管为什么会遇到 AZ 分布问题
SageMaker Inference Components 允许在推理端点的实例上运行多个模型副本。这样做可以提高硬件利用率,避免为每个模型单独维护一组实例,尤其适合模型流量不均衡、模型数量较多的场景。
但共托管也引入了一个容易被忽略的调度问题:
- 模型副本数量不等于 AZ 数量;
- 副本可能因为当前容量、部署时机或调度策略而集中在少数 AZ;
- 某个 AZ 发生故障时,剩余副本未必能满足延迟和吞吐要求;
- “端点处于 InService”并不自动等于“模型副本满足跨 AZ 合规要求”。
因此,Multi-AZ 合规检查关注的不只是 SageMaker endpoint 是否使用了多 AZ 基础设施,还要确认目标 Inference Component 的副本确实被调度到了所需的可用区。
SchedulingConfig 解决的是副本放置策略
在这类设计中,可以把几个参数分开理解:
RuntimeConfig:描述运行时需要多少个模型副本,以及副本如何运行;SchedulingConfig:描述副本何时算作就绪,以及调度器如何满足副本的可用性要求;- 端点的实例类型和数量:提供模型副本可落地的底层容量。
关键点是,SchedulingConfig 不是用来替代底层基础设施冗余的。它不能在只有一个 AZ、或底层容量不足时凭空创造高可用。要满足 Multi-AZ,通常仍需要:
- 端点部署在支持多 AZ 的网络和实例容量范围内;
- 配置足够的实例或可用计算资源;
- 设置与目标 AZ 分布相匹配的模型副本数量;
- 在部署和扩缩容后验证实际副本位置,而不是只检查配置文件。
例如,目标是让一个模型至少拥有 4 个副本,并覆盖 2 个 AZ。此时需要保证底层端点有足够容量,并让调度配置要求这些副本在达到就绪条件后才被视为可用。具体字段和可选值会随 SageMaker API 与 SDK 版本变化,生产环境应以当前区域的 API 文档和 boto3 模型为准。
一个可改造的 Python 部署示例
下面的示例展示了部署思路:在已有 SageMaker endpoint 和 endpoint variant 上创建一个 Inference Component,为模型配置多个副本,并通过 SchedulingConfig 表达调度要求。
示例假设:
- AWS 区域已经存在名为
prod-realtime的 endpoint; - endpoint 中存在名为
AllTraffic的 production variant; - S3 中已有模型包,并已创建 SageMaker model
risk-model-v3; - 当前使用的
boto3版本支持目标区域中的 Inference Components API。
运行前先设置凭证和区域,并按实际环境修改变量:
python -m pip install --upgrade boto3
export AWS_REGION=us-east-1
export ENDPOINT_NAME=prod-realtime
export VARIANT_NAME=AllTraffic
export MODEL_NAME=risk-model-v3
将以下内容保存为 create_component.py:
import os
import boto3
from botocore.exceptions import ClientError
region = os.environ.get("AWS_REGION", "us-east-1")
endpoint_name = os.environ.get("ENDPOINT_NAME", "prod-realtime")
variant_name = os.environ.get("VARIANT_NAME", "AllTraffic")
model_name = os.environ.get("MODEL_NAME", "risk-model-v3")
component_name = "risk-model-v3-multi-az"
sm = boto3.client("sagemaker", region_name=region)
request = {
"InferenceComponentName": component_name,
"EndpointName": endpoint_name,
"VariantName": variant_name,
"Specification": {
"ModelName": model_name,
"ComputeResourceRequirements": {
"NumberOfCpu coresRequired": 2,
"MinMemoryRequiredInMb": 4096,
},
},
"RuntimeConfig": {
"CopyCount": 4,
},
# 这是跨 AZ 调度的配置入口。字段名称和值域请以当前 boto3/API 版本为准。
"SchedulingConfig": {
"MinReadyInstanceCount": 4,
},
}
try:
response = sm.create_inference_component(**request)
print("Created:", response["InferenceComponentArn"])
except ClientError as exc:
print("Create failed:", exc)
raise
注意:上面的
NumberOfCpu coresRequired仅用于说明资源需求结构,实际代码中应替换成当前 SDK 接受的字段名,例如某些版本使用NumberOfCpuCoresRequired。同样,SchedulingConfig的具体字段应通过当前 SDK 的服务模型确认。这个示例的重点是把“副本数量”和“调度就绪条件”显式纳入部署请求,而不是依赖默认放置行为。
可以用下面的命令检查组件状态:
aws sagemaker describe-inference-component \
--inference-component-name risk-model-v3-multi-az \
--region "$AWS_REGION" \
--query '{Status:InferenceComponentStatus,Runtime:RuntimeConfig,Scheduling:SchedulingConfig}'
在生产环境中,还应将以下信息纳入部署验证和监控:
- Inference Component 的状态是否为
InService; - 实际 ready 副本数是否达到目标;
- 副本是否分布在要求的 AZ 集合中;
- 某个 AZ 被隔离后,剩余副本是否还能满足 SLO;
- 滚动发布、扩缩容或实例替换后,分布是否仍然满足要求。
如果当前 SDK 不接受示例中的字段,先用以下命令确认本地服务模型和版本,再升级 SDK 或根据当前 API 调整请求:
python - <<'PY'
import boto3
print("boto3:", boto3.__version__)
sm = boto3.client("sagemaker", region_name="us-east-1")
operation = sm.meta.service_model.operation_model("CreateInferenceComponent")
print(operation.input_shape.members.keys())
PY
成本效率与高可用之间如何做取舍
跨 AZ 放置不会免费获得容量。为了让调度器有空间分布副本,通常需要预留更多底层实例,或者接受副本数量和单副本资源规格的重新规划。
可以按以下方式做容量设计:
- 先确定故障目标:需要容忍一个 AZ 故障,还是只要求副本跨两个 AZ 分布;
- 再确定副本数量:不要把“每个 AZ 一个副本”误认为足够,还要根据故障后的吞吐需求计算余量;
- 保留共托管优势:把资源需求相近、流量峰值错开的模型放入同一端点,减少碎片化;
- 避免过度共托管:模型之间若存在明显的 CPU、内存或延迟争用,成本节省可能被尾延迟和扩容压力抵消;
- 把验证自动化:发布流水线应在组件变为就绪后检查副本数量和 AZ 分布,不满足条件就阻止上线。
这也是 Salesforce 方案的现实价值所在:不是在“高可用”和“多模型共托管”之间二选一,而是通过更明确的副本调度控制,在满足合规的前提下继续利用共享基础设施。
落地前检查清单
上线类似方案前,可以逐项确认:
- [ ] Endpoint、子网和安全组配置支持目标 AZ;
- [ ] 底层实例类型在每个目标 AZ 有足够容量;
- [ ] Inference Component 的
CopyCount与故障容量目标一致; - [ ]
SchedulingConfig使用的是当前 SDK 支持的字段; - [ ] 部署后能观测 ready 副本数和实际 AZ 分布;
- [ ] 做过单 AZ 故障或容量缩减演练;
- [ ] 共托管模型之间的资源争用有压测数据支持;
- [ ] 扩缩容和滚动更新不会短暂破坏合规分布。
对于需要 Multi-AZ 高可用的 SageMaker 推理服务,真正值得审查的是“每个模型副本在哪里、什么时候可用、故障后还剩多少容量”。把这些问题显式交给 Inference Components 的调度配置,并配合底层容量和自动化验证,才能同时兼顾可靠性、合规性与成本效率。