我使用 AWS SageMaker 创建了一个 XGBoost 模型。现在我正尝试通过批量转换作业使用它,对于小批量来说一切都非常顺利。
但是,在一个 ~16MB 的文件中有一批稍大一些的 600.000 行,我无法一次性运行它。我尝试了两件事:
1.
将转换作业的“最大有效负载大小”设置为其最大值(100 MB):
transformer = sagemaker.transformer.Transformer(
model_name = config.model_name,
instance_count = config.inference_instance_count,
instance_type = config.inference_instance_type,
output_path = "s3://{}/{}".format(config.bucket, config.s3_inference_output_folder),
sagemaker_session = sagemaker_session,
base_transform_job_name = config.inference_job_prefix,
max_payload = 100
)
但是,我仍然收到错误(通过控制台 CloudWatch 日志):
413 Request Entity Too Large
The data value transmitted exceeds the capacity limit.
2.
将 max_payload 设置为 0,根据规范,Amazon SageMaker 应将其解释为对有效负载大小没有限制。
在这种情况下,作业成功完成,但输出文件为空(0 字节)。
有什么想法是我做错了什么,或者如何运行更大的批次?
大多数 SageMaker 算法在 MaxPayloadInMB 中将自己的默认执行参数设置为 6 MB,因此如果您从 SageMaker 算法中获得 413,则您可能超出了它们可以支持的最大负载。假设文件中的每一行小于 6 MB,您可以通过不设置 MaxPayloadInMB 来回退到算法的默认大小并将 SplitType 设置为“Line”来解决这个问题,这样它就可以将数据分成更小的批次(https:/ /docs.aws.amazon.com/sagemaker/latest/dg/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType)。
这通过在
strategy='SingleRecord'
中设置 transformer
帮助我解决了问题 + 您还可以通过 instance_type
添加更强大的实例并通过 instance_count
分发。
我已经尝试了上述解决方案,但不幸的是它们对我不起作用。
这对我有用:https://stackoverflow.com/a/55920737/7091978
基本上,我将“max_payload”设置为 0 到 1。
我认为 Sagemaker 方面的最大有效载荷是有限的。因此,您的最大有效载荷大小被限制在 100MB 以下(据我所知,对于 KNN - defulat 为 6MB) 解决方法是在根据您的内容类型(
SplitType
或 TFRecord
)执行转换器作业时使用 RecordIO
transformer.transform([your data path], content_type='application/x-recordio-protobuf',split_type='TFRecord')
https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html
然后你可以无缝转换大于6MB的数据。