AWS Studio运行管道报No module named 'sagemaker'如何解决
问题根因
导入报错的核心原因是SageMaker Pipeline各步骤运行环境完全隔离:
- 运行
pipeline.py的环境是SageMaker Studio Notebook自带的默认conda环境,预装了sagemaker SDK,因此导入无异常 - 管道调度运行
preprocessing.py时,代码跑在独立拉起的Processing Job临时计算容器中,该容器默认基础镜像未预装sagemaker包。在Notebook单元格中执行pip/conda安装命令仅会修改Notebook自身环境的依赖,不会同步到Pipeline拉起的独立作业容器,因此会出现Notebook中提示依赖已安装,但作业运行时仍报模块不存在的现象。
解决方案
方案1:Processing Step显式声明依赖(最推荐,符合MLOps可复现要求)
定义处理作业步骤时显式传入依赖配置,SageMaker会自动在作业启动前完成依赖安装,两种实现方式可选:
- 依赖文件声明方式
在preprocessing.py同级目录新建requirements.txt,写入需要的依赖:
定义Processing Step时通过sagemaker>=2.200.0 pandas numpydependencies参数传入依赖文件路径:from sagemaker.sklearn.processing import SKLearnProcessor from sagemaker.processing import ProcessingInput, ProcessingOutput from sagemaker.workflow.steps import ProcessingStep sklearn_processor = SKLearnProcessor( framework_version="1.2-1", role=role, instance_type="ml.m5.xlarge", instance_count=1 ) step_process = ProcessingStep( name="ChurnDataPreprocess", processor=sklearn_processor, inputs=[ ProcessingInput(source=input_data_s3_uri, destination="/opt/ml/processing/input"), ], outputs=[ ProcessingOutput(output_name="train", source="/opt/ml/processing/train"), ProcessingOutput(output_name="test", source="/opt/ml/processing/test"), ], code="preprocessing.py", dependencies=["requirements.txt"] ) - 入口脚本内嵌安装逻辑(适合快速调试)
在preprocessing.py所有导入语句前,添加依赖安装代码:import subprocess import sys subprocess.check_call([sys.executable, "-m", "pip", "install", "sagemaker>=2.200.0"]) # 后续正常编写导入逻辑 import sagemaker import pandas as pd
方案2:使用预安装依赖的自定义镜像(适合生产环境)
提前构建预装所有业务依赖的容器镜像,推送至Amazon ECR镜像仓库,定义Processor时通过image_uri参数指定自定义镜像地址即可。该方案无需每次作业启动时在线安装依赖,运行速度更快,环境一致性更强。
方案3:SageMaker Studio Notebook环境安装依赖的正确语法(仅对Notebook内运行的代码生效)
如果需要在Notebook交互环境中安装依赖,避免包安装到无关conda环境,需按以下步骤操作:
- 先查询当前Notebook绑定的conda环境名称
!echo $CONDA_DEFAULT_ENV - 针对对应环境执行安装命令,例如查询到环境名为
python3时:# conda安装方式 !conda install -n python3 -y <package-name> # pip安装方式 !/home/ec2-user/anaconda3/envs/python3/bin/pip install <package-name>
注意:Notebook环境安装的所有依赖,都不会被SageMaker Pipeline拉起的处理、训练、批量推理等独立作业继承,这类作业运行在独立的临时容器中,必须通过作业自身的配置声明依赖。
内容的提问来源于stack exchange,提问作者Bhuvana
相关产品推荐
相关产品推荐

