如何指定S3子目录存储SageMaker管道运行文件?改步骤名遇报错求助
解决SageMaker管道S3目录组织与步骤名称冲突问题
问题根源
你尝试通过修改ProcessingStep的名称来指定S3子目录,但SageMaker的步骤名称不能包含斜杠/——因为步骤名称会被用于生成管道定义中的属性引用(比如Steps.StepName.ProcessingOutputConfig...),斜杠会破坏这个引用的语法结构,导致解析失败。
正确解决方案
不要修改步骤名称,而是直接在每个ProcessingOutput中指定s3_uri参数,明确输出到默认存储桶的目标子目录。这样既可以实现目录结构化,又能保证步骤名称符合语法要求,不影响后续步骤的属性引用。
修改后的代码示例
import sagemaker from sagemaker.processing import ProcessingStep, ProcessingOutput # 获取默认S3存储桶 default_bucket = sagemaker.session.Session().default_bucket() # 定义子目录前缀(根据你的需求调整层级) s3_prefix = f"sagemaker/cross-project/{project_name}/{run_datetime}/preprocess" step_process = ProcessingStep( name="CrossPreprocess-Data", # 恢复为无斜杠的合法步骤名称 processor=sklearn_processor, outputs=[ ProcessingOutput( output_name="train", source="/opt/ml/processing/train", s3_uri=f"s3://{default_bucket}/{s3_prefix}/train" ), ProcessingOutput( output_name="validation", source="/opt/ml/processing/val", s3_uri=f"s3://{default_bucket}/{s3_prefix}/validation" ), ProcessingOutput( output_name="test", source="/opt/ml/processing/test", s3_uri=f"s3://{default_bucket}/{s3_prefix}/test" ), ProcessingOutput( output_name="metafiles", source="/opt/ml/processing/metafiles", s3_uri=f"s3://{default_bucket}/{s3_prefix}/metafiles" ), ], code=os.path.join(BASE_DIR, "preprocess.py"), job_arguments=["--input-data", input_data, "--run-datetime", run_datetime, "--project-name", project_name], )
关键说明
- 通过
default_bucket()自动获取SageMaker默认存储桶,无需手动硬编码桶名 - 自定义
s3_prefix实现多层目录划分(比如按项目、运行时间、步骤类型归类) - 每个输出都指向独立的子目录,保持S3结构清晰有序
- 步骤名称保持简洁合法,确保后续步骤可以正常引用该步骤的输出(例如
step_process.properties.ProcessingOutputConfig.Outputs['train'].S3Output.S3Uri)
内容的提问来源于stack exchange,提问作者Sayuri Iwai
相关产品推荐
相关产品推荐

