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

Sagemaker部署自定义Sklearn模型失败:scipy模块缺失问题排查

问题解决:Sagemaker部署Sklearn模型时出现ModuleNotFoundError: No module named 'scipy.sparse._csr'

1. 错误原因

  • 本地训练环境(Python 3.9.16)使用的Scipy版本与Sagemaker默认推理环境的Scipy版本不兼容:scipy.sparse._csr是Scipy内部私有模块,不同版本的Scipy对内部模块结构有调整,旧版本可能未暴露该子模块,或新版本将其迁移至其他路径,导致模型加载时无法找到。
  • Sagemaker默认的Sklearn基础镜像预装的Scipy版本,与你本地训练时使用的版本不匹配,模型依赖的内部模块在推理环境中不存在。
  • 你的model.joblib文件序列化时绑定了Scipy的特定内部结构,推理环境的Scipy无法解析。

2. 在Sagemaker环境中安装所需依赖库的方法

Sagemaker支持三种主流依赖管理方式:

  • requirements.txt声明依赖:在模型打包目录中创建该文件,列出需要的依赖及精确版本,Sagemaker部署时会自动执行安装。
  • 推理脚本内动态安装:在inference.py开头添加安装命令(不推荐,会延长端点启动时间):
    import subprocess
    import sys
    subprocess.check_call([sys.executable, "-m", "pip", "install", "scipy==你的本地版本"])
    
  • 自定义Docker镜像:构建包含Python 3.9.16、对应版本Scipy/Sklearn等所有依赖的镜像,上传至ECR后,部署时指定该镜像。

3. 具体解决步骤

步骤1:确认本地依赖版本

在本地终端执行以下命令,记录Scipy和Sklearn的精确版本:

pip show scipy scikit-learn

步骤2:打包模型时添加依赖文件

在存放model.joblib的目录中创建requirements.txt,写入:

scipy==你的本地Scipy版本号
scikit-learn==你的本地Sklearn版本号

步骤3:修改部署脚本main.py(基于Sagemaker Python SDK)

创建模型时指定依赖文件,并匹配框架版本:

from sagemaker.sklearn.model import SKLearnModel

model = SKLearnModel(
    model_data="s3://你的S3存储桶路径/model.tar.gz",
    role="你的Sagemaker角色ARN",
    entry_point="inference.py",
    framework_version="1.2-1",  # 选择与本地Sklearn版本匹配的框架版本
    dependencies=["requirements.txt"]
)

# 针对13.5GB大模型,选择磁盘/内存足够的实例
model.deploy(instance_type="ml.m5.2xlarge", initial_instance_count=1)

注:先将模型文件和requirements.txt打包为model.tar.gz后上传至S3。

步骤4:验证部署

端点创建完成后,调用测试接口验证模型是否能正常加载并返回推理结果。

替代方案:若依赖问题无法解决,外部大模型上传至Sagemaker的部署方式

如果常规依赖管理无法解决问题,可使用自定义Docker容器部署:

  1. 构建自定义镜像
    创建Dockerfile,基于Python 3.9.16镜像安装所有依赖:

    FROM python:3.9.16-slim
    
    # 安装匹配版本的依赖
    RUN pip install scipy==你的版本 scikit-learn==你的版本 joblib
    
    # 复制推理脚本到容器指定路径
    COPY inference.py /opt/ml/model/
    
    ENV SAGEMAKER_PROGRAM inference.py
    

    构建并上传镜像至ECR:

    docker build -t custom-sklearn-model .
    aws ecr create-repository --repository-name custom-sklearn-model
    docker tag custom-sklearn-model:latest <你的ECR仓库URI>:latest
    docker push <你的ECR仓库URI>:latest
    
  2. 部署自定义镜像
    在main.py中使用自定义镜像创建端点:

    from sagemaker.model import Model
    
    model = Model(
        image_uri="<你的ECR仓库URI>:latest",
        model_data="s3://你的S3存储桶路径/model.tar.gz",  # 大模型存放在S3,避免镜像过大
        role="你的Sagemaker角色ARN",
        entry_point="inference.py"
    )
    
    # 选择高配置实例适配大模型
    model.deploy(instance_type="ml.m5.4xlarge", initial_instance_count=1)
    
  3. 注意事项

    • 13.5GB大模型建议存放在S3,在inference.py中添加从S3下载模型到实例本地的逻辑。
    • 必须选择内存和磁盘空间足够的实例类型,避免模型加载失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:30:23