2026 年上半年,Amazon SageMaker AI 围绕推理交付了 13 项更新,覆盖两条部署路径:全托管推理端点与 Amazon SageMaker HyperPod Inference。把这些发布放在一起看,主线并不是简单增加实例类型或配置项,而是同时优化模型选择、容量供给、缓存层次和大模型推理流水线。
对于正在运行生成式 AI 服务的团队,这些变化对应四个直接问题:模型该部署到什么硬件上、突发容量从哪里来、KV Cache 如何避免挤爆昂贵显存,以及 prefill 与 decode 是否还应该绑定在同一组计算资源中。
两条部署路径解决的是不同层级的问题
全托管端点与 HyperPod Inference 都能承载在线推理,但它们面向的控制粒度不同。
| 路径 | 更适合的场景 | 团队主要关注点 |
|---|---|---|
| SageMaker 全托管端点 | 希望减少集群运维、快速上线稳定 API | 实例选择、自动扩缩、版本发布、单请求延迟 |
| SageMaker HyperPod Inference | 大规模模型、复杂并行策略或需要更强基础设施控制 | 跨节点调度、容量池、吞吐、缓存与计算拓扑 |
选择时不要只比较单卡价格。真正影响成本的通常是有效吞吐、扩容等待时间、缓存命中率以及尾延迟。一个单价较低但频繁发生排队或缓存重建的部署,可能比更昂贵但利用率稳定的部署成本更高。
四类更新背后的架构信号
1. 推理推荐从“选实例”走向“用负载做决策”
推理推荐的价值不只是给出某个实例型号,而是缩短模型、硬件和运行参数之间的试错过程。生产评估至少应同时记录:
- 每秒请求数与每秒生成 token 数;
- 首 token 延迟与完整请求延迟;
- P50、P95 和 P99,而不只是平均值;
- 不同输入长度、输出长度和并发度下的表现;
- 单位请求或百万 token 的估算成本。
尤其对大语言模型来说,短问答、长文档摘要和多轮对话不是同一种负载。只用一个固定提示词跑基准,很容易得到无法指导生产选型的结论。
2. 容量感知实例池把容量变成调度输入
容量感知实例池反映出一个现实:推理调度不能假设某一种加速器永远有充足库存。更实用的策略是准备一组经过验证的候选容量,让调度系统根据可用性和策略选择落点。
这也意味着模型制品需要具备一定的硬件可移植性。团队应提前验证候选实例上的容器镜像、量化格式、张量并行配置和显存占用,而不是在容量紧张时临时迁移。
容量池并不等于可以随意混用硬件。不同加速器可能产生吞吐、数值精度和启动时间差异,切换之前仍需设置兼容性门槛与性能下限。
3. 分层 KV Cache 开始处理“显存不是无限的”
自回归生成过程中,KV Cache 可以避免每一步都重新计算历史 token,但它会随上下文长度、批大小和并发会话增长。把全部缓存长期保留在高成本加速器内存中,往往不可持续。
分层 KV Cache 的思路是根据访问频率和延迟要求,将数据放在不同层级:热数据留在最快的内存层,较冷数据下沉到容量更大但访问更慢的层级。它带来的不只是容量扩展,也引入了新的工程取舍:
- 下沉与回迁是否会拉高首 token 或逐 token 延迟;
- 会话路由是否稳定,能否避免缓存频繁跨节点移动;
- 缓存命中率是否足以覆盖数据搬运成本;
- 多租户环境中如何隔离缓存和清理敏感上下文。
因此,缓存层次必须与会话亲和性、批处理策略和可观测性一起设计。
4. Prefill/Decode 分离让两种计算阶段独立扩缩
大模型推理包含特征明显不同的两个阶段:prefill 处理整个输入上下文,通常计算密集;decode 逐 token 生成结果,更容易受内存带宽、缓存访问和调度抖动影响。
如果两个阶段始终绑定在相同实例上,长提示词可能占满计算资源,使正在生成的请求发生抖动。将 prefill 与 decode 解耦后,可以分别选择硬件、并行方式和扩缩指标。例如,prefill 池按待处理输入 token 扩容,decode 池按活跃序列数或生成 token 速率扩容。
代价是系统多了一次阶段间状态传输。只有当资源利用率提升超过 KV 状态传输、网络和调度开销时,分离才真正划算。短上下文、低并发服务未必需要这套复杂度。
可复制的端点基准测试
在采用任何新调度或缓存能力前,先为现有 SageMaker 实时端点建立基线。下面的 Python 脚本会并发调用一个已经部署好的端点,并输出成功率、吞吐以及 P50、P95、P99 延迟。
运行前需要:
- 已配置可调用端点的 AWS 凭证;
- 将
ENDPOINT_NAME改为实际端点名; - 根据模型容器协议修改
PAYLOAD。示例假设端点接受包含inputs字段的 JSON。
python -m pip install boto3
export ENDPOINT_NAME='my-sagemaker-endpoint'
export AWS_REGION='us-east-1'
export CONCURRENCY='8'
export REQUESTS='50'
export PAYLOAD='{"inputs":"Explain why tiered KV caching matters in one paragraph."}'
python benchmark_endpoint.py
将以下内容保存为 benchmark_endpoint.py:
import json
import os
import statistics
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
import boto3
endpoint_name = os.environ["ENDPOINT_NAME"]
region = os.getenv("AWS_REGION", "us-east-1")
concurrency = int(os.getenv("CONCURRENCY", "8"))
request_count = int(os.getenv("REQUESTS", "50"))
payload = os.getenv(
"PAYLOAD",
'{"inputs":"Explain SageMaker inference in one sentence."}',
).encode("utf-8")
client = boto3.client("sagemaker-runtime", region_name=region)
def invoke_once():
started = time.perf_counter()
response = client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType="application/json",
Accept="application/json",
Body=payload,
)
response["Body"].read()
return time.perf_counter() - started
def percentile(values, p):
ordered = sorted(values)
index = round((len(ordered) - 1) * p)
return ordered[index]
latencies = []
errors = []
wall_started = time.perf_counter()
with ThreadPoolExecutor(max_workers=concurrency) as pool:
futures = [pool.submit(invoke_once) for _ in range(request_count)]
for future in as_completed(futures):
try:
latencies.append(future.result())
except Exception as exc:
errors.append(str(exc))
wall_time = time.perf_counter() - wall_started
result = {
"endpoint": endpoint_name,
"requests": request_count,
"successful": len(latencies),
"failed": len(errors),
"throughput_requests_per_second": round(len(latencies) / wall_time, 2),
}
if latencies:
result.update(
{
"mean_ms": round(statistics.mean(latencies) * 1000, 2),
"p50_ms": round(percentile(latencies, 0.50) * 1000, 2),
"p95_ms": round(percentile(latencies, 0.95) * 1000, 2),
"p99_ms": round(percentile(latencies, 0.99) * 1000, 2),
}
)
if errors:
result["sample_error"] = errors[0]
print(json.dumps(result, indent=2))
这段脚本适合做快速回归,不等同于完整压测。正式测试还应加入预热、固定测试时长、输入长度分布、输出 token 统计和限流控制。对流式响应,还要分别记录 time to first token 与 inter-token latency;仅测完整响应时间会掩盖 decode 阶段的问题。
如何决定先采用哪一项能力
可以按瓶颈而不是按功能发布时间安排升级顺序:
- 实例选型反复试错:先建立代表性数据集,再使用推理推荐与基准结果筛选配置。
- 扩容失败或等待时间不可控:验证多个候选实例,设计容量感知的实例池与降级策略。
- 长上下文导致显存压力:观察 KV Cache 占用、命中率和会话迁移,再评估分层缓存。
- 长提示词拖慢正在生成的请求:分别测量 prefill 和 decode,确认是否值得拆分资源池。
- 低并发且模型较小:继续使用简单的全托管端点可能更经济,不必为了架构先进而引入集群复杂度。
上线前还应检查故障回退、跨硬件结果一致性、缓存中的数据隔离、配额、区域容量,以及部署变化对 P99 延迟的影响。
结语
SageMaker AI 在 2026 年上半年的 13 项推理发布,可以看作一组相互关联的能力:推荐系统帮助做部署前决策,容量感知实例池处理供给不确定性,分层 KV Cache 扩展有效内存,而 prefill/decode 分离进一步重塑计算流水线。
采用这些能力时,最稳妥的路径不是一次性重构,而是先记录端点基线,再定位成本或延迟瓶颈,每次只改变一个关键变量。对于多数团队,清晰的负载模型和可信的 P95/P99 数据,往往比选择最新架构更重要。