Sagemaker模型质量监控基线作业负载超限问题求助
问题背景
使用SageMaker Model Monitoring模块创建模型质量基线时,调用suggest_baseline()启动的Batch Transform Job报错:
2023-07-28T15:04:37.163:[sagemaker logs]: MaxConcurrentTransforms=1, MaxPayloadInMB=6, BatchStrategy=MULTI_RECORD
2023-07-28T15:04:38.084:[sagemaker logs]: X.csv: Too much data for max payload size
默认的MaxPayloadInMB=6不足以处理当前数据文件,但无法通过Model Quality Monitor的直接API参数配置该值,以下是两种可行解决方法:
解决方案1:通过transform_job_kwargs传递自定义参数
在调用suggest_baseline()时,添加transform_job_kwargs参数,直接覆盖Batch Transform的默认配置,调整MaxPayloadInMB到合适大小。修改后的代码片段如下:
model_quality_monitor.suggest_baseline( baseline_dataset=baseline_dataset_uri, dataset_format=DatasetFormat.csv(header=True), output_s3_uri=( f"s3://{bucket}/{endpoint_name}/{schema_version}/model-quality/baseline/results" ), problem_type="BinaryClassification", inference_attribute="prediction", probability_attribute="probability", ground_truth_attribute="label", wait=True, logs=True, # 新增配置,调整负载大小和批处理策略 transform_job_kwargs={ "MaxPayloadInMB": 15, # 根据数据实际大小设置,比如10、20等 "BatchStrategy": "MULTI_RECORD" } )
这个参数会直接传递到底层启动的Batch Transform Job,覆盖默认的6MB限制。
解决方案2:拆分过大的基线数据文件
如果SDK版本不支持上述参数,可以将过大的X.csv拆分为多个小文件,每个文件大小不超过默认的6MB(或你设置的新阈值),再将文件所在的S3前缀作为baseline_dataset_uri传入。
示例拆分脚本(可在本地或Lambda中执行):
import pandas as pd import boto3 s3 = boto3.client('s3') bucket_name = "your-bucket-name" input_file_key = f"{endpoint_name}/{schema_version}/model-quality/baseline/X.csv" output_prefix = f"{endpoint_name}/{schema_version}/model-quality/baseline/split_files/" # 读取S3上的大文件 obj = s3.get_object(Bucket=bucket_name, Key=input_file_key) df = pd.read_csv(obj['Body']) # 按行数拆分,根据数据每行大小调整chunk_size chunk_size = 1000 for idx, chunk in enumerate([df[i:i+chunk_size] for i in range(0, df.shape[0], chunk_size)]): chunk_file_key = f"{output_prefix}X_chunk_{idx}.csv" # 保存拆分后的文件到S3 chunk.to_csv(f"s3://{bucket_name}/{chunk_file_key}", index=False) # 之后将baseline_dataset_uri设置为s3://{bucket_name}/{output_prefix}
验证
修改后重新运行基线生成任务,查看SageMaker日志确认MaxPayloadInMB已更新,且不再出现负载过大的错误提示。
内容的提问来源于stack exchange,提问作者mxmrpn

