如何实现AWS SageMaker机器学习流水线每周自动运行?
AWS SageMaker 自动化机器学习流水线构建指南(含每周调度)
核心步骤拆解
- S3数据读取:可通过SageMaker内置的
S3DataSource自动挂载S3数据到训练实例,或在自定义脚本中用boto3直接拉取。需确保SageMaker执行角色拥有S3读写权限。 - 自定义模型训练:用SageMaker Estimator封装你的训练脚本,指定实例类型、计算资源,训练输出直接指向目标S3路径。支持官方Python镜像或自定义Docker镜像。
- 模型部署到S3:训练完成后,SageMaker会自动将模型 artifacts 同步到你指定的
output_path;若需额外存储,可在训练脚本末尾用boto3上传模型文件到其他S3位置。 - 每周自动调度:通过Amazon EventBridge创建定时规则,触发SageMaker Pipeline自动执行。
关键操作要点
1. SageMaker Pipeline 编排
推荐用Python SDK定义流水线,每个步骤对应Pipeline的Step组件:
- 数据读取:用
TrainingInput关联S3数据路径 - 训练:用
TrainingStep封装Estimator - 可扩展添加
ProcessingStep做数据预处理(若需要)
2. IAM角色配置
确保角色包含以下权限(建议最小化权限而非全量授权):
AmazonSageMakerFullAccess:流水线执行、训练任务管理- S3权限:允许读写目标数据桶和模型存储桶
AmazonEventBridgeFullAccess:允许EventBridge触发流水线
3. 自定义训练脚本规范
脚本需兼容SageMaker环境变量,核心示例逻辑:
- 从
SM_CHANNEL_TRAINING读取训练数据 - 训练完成后将模型写入
SM_MODEL_DIR,SageMaker自动同步到S3
调度配置步骤
- 进入EventBridge控制台,创建规则,选择「计划」类型
- 设置cron表达式,比如
0 0 ? * SUN *表示每周日凌晨执行 - 选择目标为「SageMaker Pipeline」,指定流水线ARN,配置可选执行参数
- 启用规则,验证触发权限
代码示例片段
流水线定义代码
import sagemaker from sagemaker.workflow.pipeline import Pipeline from sagemaker.workflow.steps import TrainingStep from sagemaker.estimator import Estimator # 初始化会话与角色 sess = sagemaker.Session() role = sagemaker.get_execution_role() # 定义自定义训练Estimator estimator = Estimator( entry_point="train.py", source_dir="./training-scripts", role=role, instance_count=1, instance_type="ml.m5.xlarge", output_path="s3://your-bucket/model-artifacts/", ) # 创建训练步骤 training_step = TrainingStep( name="CustomModelTrainingStep", estimator=estimator, inputs={"training": sagemaker.inputs.TrainingInput(s3_data="s3://your-bucket/training-data/")}, ) # 组装并提交流水线 pipeline = Pipeline( name="WeeklyAutoMLPipeline", steps=[training_step], role=role, ) pipeline.upsert(role_arn=role)
训练脚本train.py示例
import os import boto3 import pandas as pd from sklearn.ensemble import RandomForestClassifier import joblib # 读取S3挂载的训练数据 data_dir = os.environ["SM_CHANNEL_TRAINING"] train_df = pd.read_csv(os.path.join(data_dir, "train_data.csv")) # 数据预处理与训练 X = train_df.drop("target", axis=1) y = train_df["target"] model = RandomForestClassifier(n_estimators=100) model.fit(X, y) # 保存模型到SageMaker指定目录(自动同步到S3) model_dir = os.environ["SM_MODEL_DIR"] joblib.dump(model, os.path.join(model_dir, "trained_model.joblib")) # 可选:额外上传到自定义S3路径 s3_client = boto3.client("s3") s3_client.upload_file( os.path.join(model_dir, "trained_model.joblib"), "your-bucket", "backup-models/weekly-model.joblib" )
内容的提问来源于stack exchange,提问作者Meghana S
相关产品推荐
相关产品推荐

