如何在SageMaker异步端点的失败消息中自定义failureReason?
SageMaker异步端点自定义failureReason字段方案
核心思路
SageMaker异步端点默认的failureReason是通用提示,要自定义该字段,需通过自定义容器镜像+推理脚本异常捕获格式化实现,让端点将你定义的错误详情自动填充到SNS失败消息的failureReason中。
具体步骤
改造推理脚本的错误处理
在predict_fn、model_fn等推理核心函数中,捕获所有业务/系统异常,将异常信息格式化后抛出。SageMaker会自动将抛出的异常文本同步到failureReason字段。
示例代码:def predict_fn(input_data, model): try: # 你的推理逻辑 inference_result = model(input_data) return inference_result except RuntimeError as e: # 捕获CUDA OOM等运行时错误 if "CUDA out of memory" in str(e): raise Exception(f"推理失败:CUDA内存不足 - {str(e)}") raise Exception(f"推理失败:运行时错误 - {str(e)}") except AssertionError as e: # 捕获自定义断言错误 raise Exception(f"推理失败:断言验证不通过 - {str(e)}") except Exception as e: # 兜底捕获其他错误 raise Exception(f"推理失败:未知错误 - {str(e)}")注意:必须将异常包装成
Exception抛出,且异常信息要包含具体错误详情。构建并使用自定义容器镜像
- 基于官方SageMaker推理镜像(如PyTorch/TensorFlow官方镜像),将改造后的推理脚本、依赖包打包进镜像。
- 确保镜像中的SageMaker推理工具包(
sagemaker-inference)为最新版本,旧版本不支持错误信息同步到SNS的failureReason字段。
处理重复消息问题
如果之前同时用boto3发送自定义SNS消息,会导致收到两条失败通知:- 若想保留自动SNS消息并带自定义详情:无需修改端点的ErrorTopic配置,按步骤1、2部署后,自动消息的failureReason会变为你自定义的内容。
- 若只想保留自定义消息:删除端点配置中的ErrorTopic参数,在推理脚本的异常捕获逻辑中,调用boto3发送自定义SNS通知即可。
验证效果
部署自定义镜像的异步端点,构造触发异常的测试请求(如超大输入触发CUDA OOM),查看SNS ErrorTopic收到的消息,此时failureReason字段会显示你自定义的具体错误信息。
内容的提问来源于stack exchange,提问作者Tuna Meral
相关产品推荐
相关产品推荐

