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容器部署:
构建自定义镜像
创建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部署自定义镜像
在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)注意事项
- 13.5GB大模型建议存放在S3,在
inference.py中添加从S3下载模型到实例本地的逻辑。 - 必须选择内存和磁盘空间足够的实例类型,避免模型加载失败。
- 13.5GB大模型建议存放在S3,在
内容的提问来源于stack exchange,提问作者Sharhad
相关产品推荐
相关产品推荐

