如何通过Amazon SageMaker SDK获取训练指标历史数据?
在Amazon SageMaker中获取内置训练任务的指标历史数值
SageMaker内置训练任务的指标历史数据默认存储在CloudWatch中,你可以通过boto3调用CloudWatch API提取这些数据,实现类似Keras绘制指标曲线的功能,具体步骤如下:
1. 获取训练任务名称
从已创建的estimator中提取最新训练任务的名称:
training_job_name = estimator.latest_training_job.name
2. 初始化CloudWatch客户端
确保客户端区域与训练任务所在区域一致:
import boto3 cloudwatch = boto3.client('cloudwatch', region_name='us-east-1') # 替换为你的训练任务区域
3. 查看可用指标(可选)
若不确定具体指标名称,可先列出该训练任务的所有指标:
metrics = cloudwatch.list_metrics( Namespace='aws/sagemaker/TrainingJobs', Dimensions=[{'Name': 'TrainingJobName', 'Value': training_job_name}] ) # 打印所有可用指标 for metric in metrics['Metrics']: print(metric['MetricName'])
4. 提取指标历史数据
调用get_metric_statistics方法获取指定指标的历史数据,参数需根据指标类型调整:
import pandas as pd response = cloudwatch.get_metric_statistics( Namespace='aws/sagemaker/TrainingJobs', MetricName='validation:accuracy', # 替换为你需要的指标名 Dimensions=[{'Name': 'TrainingJobName', 'Value': training_job_name}], StartTime=estimator.latest_training_job.start_time, EndTime=estimator.latest_training_job.end_time, Period=60, # 根据训练日志输出频率调整,比如10、30、60等 Statistics=['Average'], # 可选Sum/Maximum/Minimum,根据指标类型选择 Unit='Percent' # 非百分比指标可省略该参数 ) # 转换为DataFrame并按时间排序 metrics_df = pd.DataFrame(response['Datapoints']) metrics_df = metrics_df.sort_values('Timestamp')
5. 绘制指标曲线
用matplotlib绘制历史指标曲线:
import matplotlib.pyplot as plt plt.plot(metrics_df['Timestamp'], metrics_df['Average']) plt.xlabel('训练时间') plt.ylabel('验证准确率') plt.title(f'训练任务 {training_job_name} - 验证准确率变化') plt.xticks(rotation=45) plt.tight_layout() plt.show()
注意事项
- 指标名称需与训练任务输出的日志一致,SageMaker内置算法(如XGBoost、TensorFlow)会自动输出标准指标,例如XGBoost的
validation:error、TensorFlow的train:loss等。 Period参数需匹配训练日志的指标输出频率,若设置过大可能导致数据聚合,丢失细节。
内容的提问来源于stack exchange,提问作者Luis Leal
相关产品推荐
相关产品推荐

