SageMaker端点调用boto3.client('s3')触发递归深度超限错误
SageMaker端点推理脚本调用boto3.client("s3")触发SSL递归深度超限问题分析
核心原因推测
- 依赖版本冲突
SageMaker默认推理容器预装的boto3、botocore或SSL相关依赖,与你打包的自定义依赖版本不兼容。部分旧版本botocore在处理SSLContext配置时存在逻辑缺陷,会触发super(SSLContext, SSLContext).options.__set__的无限递归调用,最终触发递归深度超限。 - 全局SSL配置被篡改
若推理脚本或依赖库中存在修改ssl.SSLContext全局属性的代码(比如自定义options、替换默认上下文),会破坏SageMaker容器内置的SSL逻辑,引发递归调用死循环。 - 客户端重复初始化
即便将s3_client移至导入语句后,若初始化逻辑处于input_handler这类每次推理请求都会执行的函数中,重复创建客户端的操作叠加环境特殊配置,也可能触发递归问题。
可行解决方案
- 锁定兼容的依赖版本
在requirements.txt中明确指定与SageMaker默认环境匹配的boto3和botocore版本,示例:
可通过在官方TensorFlow推理容器中执行boto3==1.28.0 botocore==1.31.0pip list查看当前默认版本,避免版本冲突。 - 使用SageMaker内置S3工具
替换手动初始化boto3客户端的逻辑,改用SageMaker SDK提供的S3Downloader,它已适配容器环境,无需手动处理SSL配置:from sagemaker.s3 import S3Downloader def read_latest_file(s3_uri): file_list = S3Downloader.list(s3_uri) latest_file = max(file_list, key=lambda x: x.split('/')[-1]) return S3Downloader.read_file(latest_file) - 全局初始化客户端
将s3_client初始化放在脚本顶层,确保仅在容器启动时执行一次,避免每次推理重复创建:import boto3 s3_client = boto3.client("s3") def read_latest_file(user_heart_rate_uri): bucket, key = user_heart_rate_uri.replace("s3://", "").split("/", 1) # 后续S3操作逻辑 - 排查全局SSL修改代码
检查脚本及依赖库中是否存在修改ssl模块全局配置的代码,移除或调整这类操作,避免破坏容器内置SSL逻辑。
验证建议
- 使用官方TensorFlow推理容器在本地模拟SageMaker环境,复现问题并验证解决方案。
- 部署测试端点时,添加日志打印当前环境的依赖版本,确认与指定版本一致。
内容的提问来源于stack exchange,提问作者Malhar
相关产品推荐
相关产品推荐

