AWS SageMaker训练任务失败:执行自定义SKLearn脚本出错求助
以下是导致训练脚本执行失败(ExitCode 1)的几个关键问题及修复方法:
1. 重复定义命令行参数
脚本中两次添加了--model-dir参数:
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR']) # ... parser.add_argument("--model-dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
argparse不允许重复定义同名参数,会直接触发解析错误。修复方法:删除其中一行,保留一个即可,推荐使用os.environ.get的版本(避免环境变量未设置时直接崩溃):
# 保留这一行即可 parser.add_argument("--model-dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
2. columns变量未定义
脚本中使用了X_train = train_df[columns]和X_test = test_df[columns],但未定义columns变量。这会抛出NameError,导致脚本终止。修复方法:提前定义要使用的特征列列表,例如:
# 根据你的数据集特征列修改 columns = ['特征列1', '特征列2', '特征列3'] X_train = train_df[columns] X_test = test_df[columns]
3. 缺少必要的库导入
脚本中使用了多个第三方库,但未添加导入语句,会触发ModuleNotFoundError或NameError。修复方法:在脚本开头添加所有需要的导入:
import os import argparse import pandas as pd import joblib from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import f1_score
4. 引用未定义的命令行参数
脚本最后一行print(args.min_samples_leaf),但从未添加--min_samples_leaf参数的定义,会抛出AttributeError。修复方法:要么删除这一行,要么添加对应的参数定义:
# 如果需要这个超参数,添加以下行 parser.add_argument("--min_samples_leaf", type=int, default=1)
5. 环境变量硬引用风险
第一次定义--model-dir时使用了os.environ['SM_MODEL_DIR'],如果环境变量未设置(虽然SageMaker会自动设置,但本地测试时可能出错),会直接抛出KeyError。建议统一使用os.environ.get的方式,允许默认值为空或指定默认路径。
修复以上问题后,重新提交训练任务即可解决ExecuteUserScriptError问题。另外,建议在本地先测试脚本的执行逻辑,确保没有语法或逻辑错误后再上传到SageMaker运行,便于快速排查问题。
内容的提问来源于stack exchange,提问作者skippy_winks

