You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:25:22