如何使用 AWS SageMaker Batch Transform 运行更大的批处理



我用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
)

但是,我仍然收到错误(通过控制台云观看日志(:

413 Request Entity Too Large
The data value transmitted exceeds the capacity limit.

阿拉伯数字。

将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(。

这帮助我通过在transformer中设置strategy='SingleRecord'来解决问题+您还可以通过instance_type添加更强的实例并通过instance_count分发。

我已经尝试了上述解决方案,但不幸的是它们对我不起作用。

以下是对我有用的方法:https://stackoverflow.com/a/55920737/7091978

基本上,我将"max_payload"从 0 设置为 1。

我认为 Sagemaker 方面的最大有效载荷无论如何都是有限的。因此,您的最大有效载荷大小限制在 100MB 以下(据我所知,对于 KNN - 它是 6MB 作为 defulat( 解决方法是在执行转换器作业时使用SplitType,具体取决于您的内容类型(TFRecordRecordIO(

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的数据。

最新更新