SageMaker脚本模式训练:实验Run重复,参数与指标分离问题
解决SageMaker Experiments中超参数与指标分属不同Run的问题
问题原因
你在启动训练时手动创建了一个Run上下文,同时在训练脚本里又调用load_run()生成了另一个独立的Run,导致超参数和指标被分别记录到两个不同的实验条目里。
解决方案
有两种可行方式将超参数和指标合并到同一个Run中:
方式一:移除启动代码中的手动Run创建(推荐)
SageMaker执行Estimator.fit()时会自动为训练任务创建一个Run,并且自动记录超参数。此时脚本里的load_run()会自动关联这个自动生成的Run,无需额外配置。
修改后的启动代码:
exp_name = "sklearn-script-mode-experiment" sklearn_estimator = SKLearn('train.py', instance_type='ml.m5.large', framework_version='1.0-1', role="arn:aws:iam:::role/service-role/AmazonSageMaker-ExecutionRole-", hyperparameters={'nestimators': 100}, environment={"REGION": REGION}) # SageMaker会自动创建Run并关联训练任务,同时记录超参数 sklearn_estimator.fit({'train': f's3://{BUCKET}/{S3_INPUT_PATH}'}, experiment_name=exp_name)
训练脚本train.py无需修改,保持原有load_run()调用即可:
# 解析参数... model = RandomForestClassifier(n_estimators=args.nestimators, max_depth=5, random_state=1) with load_run(sagemaker_session=sagemaker_session) as run: model.fit(X, y) run.log_metric(name = "Final Test Loss", value = 0.9)
方式二:手动传递Run信息到训练脚本
如果需要在启动代码中手动创建Run,可以将Run的名称通过环境变量传递给训练任务,让脚本里的load_run()加载同一个Run。
修改后的启动代码:
exp_name = "sklearn-script-mode-experiment" with Run( experiment_name=exp_name, sagemaker_session=sess, ) as run: # 将当前Run的名称传入训练环境变量 sklearn_estimator = SKLearn('train.py', instance_type='ml.m5.large', framework_version='1.0-1', role="arn:aws:iam:::role/service-role/AmazonSageMaker-ExecutionRole-", hyperparameters={'nestimators': 100}, environment={"REGION": REGION, "SAGEMAKER_RUN_NAME": run.run_name}) sklearn_estimator.fit({'train': f's3://{BUCKET}/{S3_INPUT_PATH}'})
修改后的训练脚本train.py,指定加载传入的Run名称:
import os # 解析参数... model = RandomForestClassifier(n_estimators=args.nestimators, max_depth=5, random_state=1) # 从环境变量获取Run名称,加载同一个Run run_name = os.environ.get("SAGEMAKER_RUN_NAME") with load_run(run_name=run_name, sagemaker_session=sagemaker_session) as run: model.fit(X, y) run.log_metric(name = "Final Test Loss", value = 0.9)
内容的提问来源于stack exchange,提问作者maRtin
相关产品推荐
相关产品推荐

