SageMaker训练XGBoost仅生成profiler_report无训练报告如何解决
问题:SageMaker XGBoost训练任务未生成带特征重要性的训练报告
问题复现
配置SageMaker Debugger的create_xgboost_report()规则,期望自动生成包含特征重要性的XGBoost训练报告,训练完成后遍历规则输出S3路径,仅发现Profiler报告目录,无目标XGBoost训练报告。
使用的核心代码如下:
from sagemaker import get_execution_role import numpy as np import pandas as pd from sagemaker.predictor import csv_serializer from sagemaker.debugger import Rule, rule_configs import boto3 import os import sagemaker # Define IAM role rules=[ Rule.sagemaker(rule_configs.create_xgboost_report()) ] role = get_execution_role() prefix = 'sagemaker/models' my_region = boto3.session.Session().region_name # 拉取XGBoost镜像 xgboost_container = sagemaker.image_uris.retrieve("xgboost", my_region, "latest") bucket_name = 'binary-base' s3 = boto3.resource('s3') try: if my_region == 'us-east-1': s3.create_bucket(Bucket=bucket_name) else: s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region }) print('S3 bucket created successfully') except Exception as e: print('S3 error: ',e) # 上传数据集到S3 boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'train/train.csv')).upload_file('../Data/Base_Model_Data_No_Labels/train.csv') boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'validation/val.csv')).upload_file('../Data/Base_Model_Data_No_Labels/val.csv') boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'test/test.csv')).upload_file('../Data/Base_Model_Data/test.csv') sess = sagemaker.Session() xgb = sagemaker.estimator.Estimator(xgboost_container, role, volume_size =5, instance_count=1, instance_type='ml.m4.xlarge', output_path='s3://{}/{}/output'.format(bucket_name, prefix, 'xgboost_model'), sagemaker_session=sess, rules=rules) xgb.set_hyperparameters(objective='binary:logistic', num_round=100, scale_pos_weight=8.5) xgb.fit({'train': s3_input_train, "validation": s3_input_val}, wait=True)
检查输出路径的代码:
rule_output_path = xgb.output_path + "/" + xgb.latest_training_job.job_name + "/rule-output" ! aws s3 ls {rule_output_path} --recursive
故障原因
- 镜像版本不兼容:使用
latest标签拉取的XGBoost 1.5+版本镜像修改了训练日志输出格式,当前版本的Debuggercreate_xgboost_report()规则无法正确解析日志中的特征重要性指标,默认仅生成系统Profiler报告。 - SDK版本bug:SageMaker Python SDK 2.80以下版本的XGBoost报告规则存在逻辑缺陷,会跳过特征重要性模块的生成逻辑。
- 配置缺失:超参数中未显式指定特征重要性计算类型,且原代码存在语法错误(test.csv上传语句缺失右括号)、输入通道变量未定义的问题,会导致规则无法正常读取训练数据和输出指标。
修复方案
按顺序执行以下调整即可正常生成报告:
- 升级SageMaker SDK到兼容版本,修复规则本身的bug
pip install --upgrade sagemaker>=2.90
- 固定使用与Debugger规则兼容的XGBoost镜像版本,替换原有的
latest标签
# 替换原镜像拉取代码,使用1.3-1版本(1.0~1.4区间版本均兼容) xgboost_container = sagemaker.image_uris.retrieve("xgboost", my_region, "1.3-1")
注意:请勿使用1.5及以上版本的XGBoost内置镜像,这类镜像的日志格式与当前Debugger报告规则不兼容,会导致特征重要性模块无法生成
- 补全代码语法错误,正确定义训练/验证输入通道
# 补全test.csv上传语句缺失的右括号 boto3.Session().resource('s3').Bucket(bucket_name).Object(os.path.join(prefix, 'test/test.csv')).upload_file('../Data/Base_Model_Data/test.csv') # 新增缺失的输入通道定义,指定输入格式为csv from sagemaker.inputs import TrainingInput s3_input_train = TrainingInput( s3_data=f's3://{bucket_name}/{prefix}/train/', content_type='csv' ) s3_input_val = TrainingInput( s3_data=f's3://{bucket_name}/{prefix}/validation/', content_type='csv' )
- 在超参数中显式开启特征重要性计算,指定重要性计算维度
xgb.set_hyperparameters( objective='binary:logistic', num_round=100, scale_pos_weight=8.5, # 新增特征重要性配置 importance_type='gain' )
- (可选强化配置)在Debugger规则中显式开启特征重要性抓取开关,避免规则默认配置遗漏
rules=[ Rule.sagemaker( rule_configs.create_xgboost_report(), rule_parameters={"compute_feature_importance": "True"} ) ]
结果验证
训练完成后重新执行S3路径遍历命令,rule-output路径下会生成xgboost-report目录,目录内包含HTML格式的完整训练报告,打开即可查看特征重要性排序、模型评估指标、训练收敛曲线等内容,同时目录下会附带特征重要性的原始结构化数据文件,可直接读取做后续分析。
内容的提问来源于stack exchange,提问作者Alesandro Russo
相关产品推荐
相关产品推荐

