SageMaker更新端点挂起失败且触发4XX错误的技术咨询
问题成因分析
1. Cannot update in-progress endpoint报错原因
该报错的本质是SageMaker端点的状态限制:只有端点处于InService状态时,才允许调用UpdateEndpoint接口执行更新操作,只要端点处于正在更新、正在回滚、正在调整实例数等进行中状态,更新请求都会直接返回该ValidationException。触发该问题的常见场景如下:
- Databricks定时任务配置了不合理的重试机制:第一次更新请求已经触发了端点状态变更,请求超时或者任务误判为失败后触发重试,重复发起更新请求。
- 定时任务和其他端点运维操作时间冲突:存在其他修改端点配置的脚本、手动调整操作和每周定时任务的触发时间重合,导致端点已经处于进行中状态。
2. 4XX错误飙升原因
SageMaker官方说明的无停机更新是默认滚动更新策略下的正常更新场景,出现4XX飙升通常是以下原因导致:
- 新模型/镜像存在兼容性问题:你使用的
mode="replace"模式会直接替换端点配置,滚动更新过程中会逐步用新实例替换旧实例,如果新模型的入参要求、返回格式和旧模型不兼容,或是镜像依赖缺失、模型加载失败,新实例处理请求时就会返回大量4XX错误。 - 更新回滚过程的流量波动:如果更新触发失败,SageMaker会启动回滚流程,该过程中也会再次切换实例流量,高QPS场景下如果上游服务没有配置重试策略,就会产生明显的4XX错误尖峰。
解决方案
针对更新冲突报错的修复
- 在执行更新前添加端点状态检查逻辑:调用boto3的
describe_endpoint接口查询当前端点的EndpointStatus字段,只有状态为InService时才执行mlflow的deploy操作,否则等待状态恢复或直接终止当前任务。示例检查代码:
import boto3 sm_client = boto3.client('sagemaker', region_name=region) endpoint_info = sm_client.describe_endpoint(EndpointName='modelName') if endpoint_info['EndpointStatus'] != 'InService': raise Exception("Endpoint is not in service, skip update")
- 调整Databricks定时任务的重试配置:要么关闭自动重试,要么将重试间隔调整到30分钟以上,预留足够的端点更新完成时间。
针对4XX错误飙升的修复
- 替换直接更新的部署模式:放弃
mode="replace"的直接更新方式,改用蓝绿部署策略:先创建独立的临时端点验证新模型的可用性、兼容性,确认无误后再触发生产端点的更新,或者在更新时配置SageMaker的流量逐步切换规则,先切10%流量到新模型验证错误率,符合预期后再全量切换。 - 配置端点更新保护策略:在调用更新接口时添加
DeploymentConfig参数,设置滚动更新的最大不可用实例比例不超过20%,同时配置自动回滚规则,只要更新过程中4XX错误率超过预设阈值,就自动终止更新并切回旧配置。 - 前置模型验证环节:在定时任务触发更新前,先对新模型做接口兼容性测试、批量预测验证,确认新模型的入参出参、错误率符合生产要求后再执行更新。
- 上游服务增加重试逻辑:给调用SageMaker端点的业务服务配置指数退避重试策略,针对更新过程中出现的4XX、5XX错误做重试,降低业务侧感知到的错误率。
内容的提问来源于stack exchange,提问作者user491880
相关产品推荐
相关产品推荐

