You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SageMaker端点调用boto3.client('s3')触发递归深度超限错误

SageMaker端点推理脚本调用boto3.client("s3")触发SSL递归深度超限问题分析

核心原因推测

  1. 依赖版本冲突
    SageMaker默认推理容器预装的boto3、botocore或SSL相关依赖,与你打包的自定义依赖版本不兼容。部分旧版本botocore在处理SSLContext配置时存在逻辑缺陷,会触发super(SSLContext, SSLContext).options.__set__的无限递归调用,最终触发递归深度超限。
  2. 全局SSL配置被篡改
    若推理脚本或依赖库中存在修改ssl.SSLContext全局属性的代码(比如自定义options、替换默认上下文),会破坏SageMaker容器内置的SSL逻辑,引发递归调用死循环。
  3. 客户端重复初始化
    即便将s3_client移至导入语句后,若初始化逻辑处于input_handler这类每次推理请求都会执行的函数中,重复创建客户端的操作叠加环境特殊配置,也可能触发递归问题。

可行解决方案

  • 锁定兼容的依赖版本
    在requirements.txt中明确指定与SageMaker默认环境匹配的boto3和botocore版本,示例:
    boto3==1.28.0
    botocore==1.31.0
    
    可通过在官方TensorFlow推理容器中执行pip 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逻辑。

验证建议

  1. 使用官方TensorFlow推理容器在本地模拟SageMaker环境,复现问题并验证解决方案。
  2. 部署测试端点时,添加日志打印当前环境的依赖版本,确认与指定版本一致。

内容的提问来源于stack exchange,提问作者Malhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:08:37