AWS SageMaker Pipeline导入utils模块失败的问题解决咨询
问题解决:SageMaker Pipeline中找不到utils模块
核心原因
当你仅通过code="process.py"指定入口脚本时,SageMaker只会将process.py单个文件上传到容器的/opt/ml/processing/input/code目录,同目录下的utils.py不会被自动上传,因此Python无法找到该模块。
解决方案:必须指定source_dir
即使两个脚本在同一根目录,也需要通过source_dir参数指定根目录,这样SageMaker会将该目录下的所有文件(包括子文件/目录)全部上传到容器中,保证process.py能找到utils.py。
具体操作步骤
修改sklearn_processor.run的参数,添加source_dir并指定为你的根目录路径(当前工作目录用./即可),同时保留code="process.py"指定入口脚本:
step_args = sklearn_processor.run( inputs=[ ProcessingInput(source=s3_bucket, destination="/opt/ml/processing/input"), ], outputs=[ ProcessingOutput(output_name="train", source="/opt/ml/processing/train"), ProcessingOutput(output_name="test", source="/opt/ml/processing/test") ], source_dir="./", # 指定根目录为source_dir code="process.py", # 指定执行的入口脚本 )
原理说明
指定source_dir后,SageMaker会将该目录下的所有文件打包上传到容器的/opt/ml/processing/input/code目录,此时process.py和utils.py处于同一目录层级,Python的模块导入机制可以正常找到utils模块。
备选方案(不推荐)
如果暂时不想修改source_dir,可以在process.py开头添加代码将当前脚本所在目录加入Python路径:
import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from utils import ( # 你的函数 )
但这种方式仅解决路径问题,无法保证其他依赖文件被上传,因此优先推荐使用source_dir的规范方式。
内容的提问来源于stack exchange,提问作者Sam Baker
相关产品推荐
相关产品推荐

