

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon A SageMaker I 进行批量转换以进行推理
<a name="batch-transform"></a>

当您需要执行以下操作时，请使用批量转换：
+ 预处理数据集以从数据集中删除可能干扰训练或推理的噪声或偏差。
+ 从大型数据集获取推理。
+ 当您不需要持续性终端节点时运行推理。
+ 将输入记录与推理相关联，以帮助解释结果。

要在执行推理前筛选输入数据，或要将输入记录与有关这些记录的推理相关联，请参阅[将预测结果与输入记录关联](batch-transform-data-processing.md)。例如，您可以筛选输入数据，为创建和解释有关输出数据的报告提供上下文。

**Topics**
+ [

## 使用批量转换从大型数据集中获取推理
](#batch-transform-large-datasets)
+ [

## 加快批量转换作业
](#batch-transform-reduce-time)
+ [

## 使用批量转换测试生产变体
](#batch-transform-test-variants)
+ [

## 批量转换示例笔记本
](#batch-transform-notebooks)
+ [

# 将预测结果与输入记录关联
](batch-transform-data-processing.md)
+ [

# 批量转换中的存储
](batch-transform-storage.md)
+ [

# 问题排查
](batch-transform-errors.md)

## 使用批量转换从大型数据集中获取推理
<a name="batch-transform-large-datasets"></a>

批量处理在指定参数的限制内自动管理大型数据集的处理。例如，在 S3 存储桶中存储一个数据集文件 `input1.csv`。输入文件的内容可能如下示例所示。

```
Record1-Attribute1, Record1-Attribute2, Record1-Attribute3, ..., Record1-AttributeM
Record2-Attribute1, Record2-Attribute2, Record2-Attribute3, ..., Record2-AttributeM
Record3-Attribute1, Record3-Attribute2, Record3-Attribute3, ..., Record3-AttributeM
...
RecordN-Attribute1, RecordN-Attribute2, RecordN-Attribute3, ..., RecordN-AttributeM
```

当批量转换作业启动时， SageMaker AI 会启动计算实例并在它们之间分配推理或预处理工作负载。批量转换功能按照键对输入中的 Amazon S3 对象进行分区，并将 Amazon S3 对象映射到实例。当您有多个文件时，一个实例可能处理 `input1.csv`，而另一个实例可能处理名为 `input2.csv` 的文件。如果只有一个输入文件，但初始化了多个计算实例，则只有一个实例会处理输入文件。其余实例处于闲置状态。

您也可以将输入文件拆分为较小的批处理。例如，您可以通过仅包含其中两个记录，以便从 `input1.csv` 创建一个小批次。

```
Record3-Attribute1, Record3-Attribute2, Record3-Attribute3, ..., Record3-AttributeM
Record4-Attribute1, Record4-Attribute2, Record4-Attribute3, ..., Record4-AttributeM
```

**注意**  
SageMaker AI 分别处理每个输入文件。它不会组合来自不同输入文件的小批次来符合 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB               ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB               ) 限制。

要在创建批处理转换作业时将输入文件拆分为小批量，请`Line`将[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType             ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType             )参数值设置为。 SageMaker 在以下情况下，AI 会在单个请求中使用整个输入文件：
+ `SplitType` 设置为 `None`。
+ 输入文件无法分割成小批次。

.请注意，批量转换不支持包含换行符的 CSV 格式输入。您可以使用 `[BatchStrategy](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-BatchStrategy)` 和 `[MaxPayloadInMB](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-MaxPayloadInMB)` 参数控制较小批处理的大小。`MaxPayloadInMB` 不得超过 100 MB。如果指定可选的 `[MaxConcurrentTransforms](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-MaxConcurrentTransforms)` 参数，则 `(MaxConcurrentTransforms * MaxPayloadInMB)` 的值也不得超过 100 MB。

如果批处理转换任务成功处理了输入文件中的所有记录，就会创建一个输出文件。输出文件具有相同的名称和 `.out` 文件扩展名。对于 `input1.csv` 和 `input2.csv` 等多个输入文件，输出文件将分别名为 `input1.csv.out` 和 `input2.csv.out`。批量转换作业将输出文件存储在 Amazon S3 中的指定位置，如 `s3://amzn-s3-demo-bucket/output/`。

输出文件中的预测按与输入文件中对应的记录相同的顺序列出。输出文件 `input1.csv.out` 的内容（基于早前显示的输入文件）如下所示。

```
Inference1-Attribute1, Inference1-Attribute2, Inference1-Attribute3, ..., Inference1-AttributeM
Inference2-Attribute1, Inference2-Attribute2, Inference2-Attribute3, ..., Inference2-AttributeM
Inference3-Attribute1, Inference3-Attribute2, Inference3-Attribute3, ..., Inference3-AttributeM
...
InferenceN-Attribute1, InferenceN-Attribute2, InferenceN-Attribute3, ..., InferenceN-AttributeM
```

如果将 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType             ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType             ) 设置为 `Line`，则您可以将 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-AssembleWith             ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-AssembleWith             ) 参数设置为 `Line`，将输出记录与行分隔符连接起来。这并不会更改输出文件的数量。输出文件的数量等于输入文件的数量，并且使用 `AssembleWith` 不会合并文件。如果不指定 `AssembleWith` 参数，输出记录默认以二进制格式连接。

当输入数据非常大并且使用 HTTP 分块编码传输时，要将数据流式传输到算法，请将 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB) 设置为 `0`。Amazon SageMaker AI 内置算法不支持此功能。

有关使用 API 创建批量转换作业的信息，请参阅 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) API。有关批量变换输入和输出对象之间关系的更多信息，请参阅 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputDataConfig.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputDataConfig.html)。有关如何使用批量转换的示例，请参阅[（可选）利用批量转换进行预测](ex1-model-deployment.md#ex1-batch-transform)。

## 加快批量转换作业
<a name="batch-transform-reduce-time"></a>

如果使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) API，您可以通过使用最佳参数值来缩短完成批量转换作业所需的时间。这包括 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxPayloadInMB)、[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxConcurrentTransforms](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-MaxConcurrentTransforms) 或 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-BatchStrategy](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-BatchStrategy) 等参数。`MaxConcurrentTransforms` 的理想值等于批量转换作业中的计算工作线程数。

如果您使用的是 SageMaker AI 控制台，请在 Batc **h 转换作业****配置页面的其他配置**部分中指定这些最佳参数值。 SageMaker AI 会自动为内置算法找到最佳参数设置。对于自定义算法，通过 [execution-parameters](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-batch-code.html#your-algorithms-batch-code-how-containe-serves-requests) 端点提供这些值。

## 使用批量转换测试生产变体
<a name="batch-transform-test-variants"></a>

要测试不同的模型或超参数设置，请为每个新的模型变体创建单独的转换作业并使用验证数据集。对于每个转换作业，为输出文件指定一个唯一的模型名称及位于 Amazon S3 中的位置。要分析结果，请使用 [推理管道日志和指标](inference-pipeline-logs-metrics.md)。

## 批量转换示例笔记本
<a name="batch-transform-notebooks"></a>

有关使用批量转换的笔记本示例，请参阅[使用 PCA 和 DBSCAN Movie 集群进行批量变换](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker_batch_transform/introduction_to_batch_transform/batch_transform_pca_dbscan_movie_clusters.html)。本笔记本使用主体成分分析 (PCA) 模型进行批量转换，以减少用户项目审查矩阵中的数据。然后，它展示了如何应用基于密度的空间集群算法（DBSCAN）对电影进行集群分析。

 有关创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择**SageMaker示例**选项卡以查看所有 SageMaker AI 示例的列表。使用 NTM 算法的主题建模示例笔记本位于**高级功能**部分中。要打开笔记本，请选择其 **Use (使用)** 选项卡，然后选择 **Create copy (创建副本)**。

# 将预测结果与输入记录关联
<a name="batch-transform-data-processing"></a>

当针对大型数据集进行预测时，可以排除进行预测时不需要的属性。进行预测后，您可以将某些排除的属性和这些预测或报告中的其他输入数据关联起来。通过使用批量转换来执行这些数据处理步骤，您通常可以消除其他预处理或后处理。您只能使用 JSON 和 CSV 格式的输入文件。

**Topics**
+ [

## 将推理与输入记录相关联的工作流
](#batch-transform-data-processing-workflow)
+ [

## 在批量转换作业中使用数据处理
](#batch-transform-data-processing-steps)
+ [

## 支持的 JSONPath 运算符
](#data-processing-operators)
+ [

## 批量转换示例
](#batch-transform-data-processing-examples)

## 将推理与输入记录相关联的工作流
<a name="batch-transform-data-processing-workflow"></a>

下图显示将推理与输入记录相关联的工作流程。

![\[将推理与输入记录关联起来的工作流程。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/batch-transform-data-processing.png)


要将推理与输入数据相关联，有三个主要步骤：

1. 筛选进行推理时不需要的输入数据，然后再将输入数据传递到批量转换作业。使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-InputFilter                             ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-InputFilter                             ) 参数来确定要将哪些属性用作模型的输入。

1. 将输入数据和推理结果关联。使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-JoinSource                         ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-JoinSource                         ) 参数将输入数据与推理结合起来。

1. 筛选联接的数据，以保留用来为解释报告中的预测提供上下文所需的输入。使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-OutputFilter                             ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-OutputFilter                             ) 存储输出文件中联接的数据集的指定部分。

## 在批量转换作业中使用数据处理
<a name="batch-transform-data-processing-steps"></a>

在使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) 创建批量转换作业来处理数据时：

1. 使用 `DataProcessing` 数据结构中的 `InputFilter` 参数指定要传输到模型中的输入的部分。

1. 使用 `JoinSource` 参数联接原始输入数据和转换后的数据。

1. 使用 `OutputFilter` 参数指定批量转换作业中哪部分联接输入数据和转换后的数据要包含在输出文件中。

1.  选择 JSON 或 CSV 格式的文件作为输入：
   + 对于 JSON 或 JSON 行格式的输入文件， SageMaker AI 要么将`SageMakerOutput`属性添加到输入文件，要么使用`SageMakerInput`和`SageMakerOutput`属性创建一个新的 JSON 输出文件。有关更多信息，请参阅 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataProcessing.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataProcessing.html)。
   + 对于 CSV 格式的输入文件，联接的输入数据后跟转换后的数据，而输出是 CSV 文件。

如果您使用的是带有 `DataProcessing` 结构的算法，它必须“同时”**对输入和输出文件支持您选择的格式。例如，对于 `CreateTransformJob` API 的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html) 字段，您必须同时将 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#SageMaker-Type-Channel-ContentType](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#SageMaker-Type-Channel-ContentType) 和 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-Accept](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-Accept) 参数设置为以下值之一：`text/csv`、`application/json` 或 `application/jsonlines`。在 CSV 文件中指定列的语法与在 JSON 文件中指定属性的语法是不同的。使用错误的语法会导致错误。有关更多信息，请参阅 [批量转换示例](#batch-transform-data-processing-examples)。有关用于内置算法的输入和输出文件格式的更多信息，请参阅[Amazon 中的内置算法和预训练模型 SageMaker](algos.md)。

输入和输出的记录分隔符也必须符合所选的文件输入。[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html#SageMaker-Type-TransformInput-SplitType) 参数指示如何拆分输入数据集内的记录。[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-AssembleWith                     ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformOutput.html#SageMaker-Type-TransformOutput-AssembleWith                     ) 参数指示如何重组记录以便输出。如果您将输入和输出格式设置为 `text/csv`，还必须将 `SplitType` 和 `AssembleWith` 参数设置为 `line`。如果您将输入和输出格式设置为 `application/jsonlines`，则可以将 `SplitType` 和 `AssembleWith` 这两者设置为 `line`。

对于 CSV 文件，不能使用嵌入式换行符。对于 JSON 文件，属性名称 `SageMakerOutput` 预留用于输出。JSON 输入文件不得具有使用此名称的属性。否则，输入文件中的数据可能被覆盖。

## 支持的 JSONPath 运算符
<a name="data-processing-operators"></a>

要筛选和连接输入数据和推理，请使用 JSONPath 子表达式。 SageMaker AI 仅支持已定义 JSONPath 运算符的子集。下表列出了支持的运 JSONPath 算符。对于 CSV 数据，每行都被视为 JSON 数组，因此 JSONPaths 只能应用基于索引的数组`$[0]`，例如`$[1:]`。CSV 数据也应遵循 [RFC 格式](https://tools.ietf.org/html/rfc4180)。


| JSONPath 操作员 | 描述 | 示例 | 
| --- | --- | --- | 
| \$1 |  查询的根元素。所有路径表达式的开头都需要此运算符。  | \$1 | 
| .<name> |  一个以点表示的子元素。  |  `$.id`  | 
| \$1 |  一个通配符。用来代替属性名称或数值。  |  `$.id.*`  | 
| ['<name>' (,'<name>')] |  一个括号表示的元素或多个子元素。  |  `$['id','SageMakerOutput']`  | 
| [<number> (,<number>)] |  一个索引或索引数组。也支持否定索引值。`-1` 索引指数组中的最后一个元素。  |  `$[1]` , `$[1,3,5]`  | 
| [<start>:<end>] |  数组 Slice 运算符。数组 slice() 方法提取数组的一部分并返回一个新数组。如果省略*<start>*， SageMaker AI 将使用数组的第一个元素。如果省略*<end>*， SageMaker AI 将使用数组的最后一个元素。  |  `$[2:5]`, `$[:5]`, `$[2:]`  | 

使用括号表示法指定给定字段的多个子元素时，不支持在括号内添加子元素。例如，支持 `$.field1.['child1','child2']` 而不支持 `$.field1.['child1','child2.grandchild']`。

有关 JSONPath 运算符的更多信息，请参阅[JsonPath](https://github.com/json-path/JsonPath)上的 GitHub。

## 批量转换示例
<a name="batch-transform-data-processing-examples"></a>

以下示例显示了一些将输入数据与预测结果联接的常用方法。

**Topics**
+ [

### 示例：仅输出推理
](#batch-transform-data-processing-example-default)
+ [

### 示例：输出推理与输入数据联接
](#batch-transform-data-processing-example-all)
+ [

### 示例：输出推理与输入数据联接并从输入中排除 ID 列 (CSV)
](#batch-transform-data-processing-example-select-csv)
+ [

### 示例：输出与 ID 列联接的推理并从输入中排除 ID 列 (CSV)
](#batch-transform-data-processing-example-select-json)

### 示例：仅输出推理
<a name="batch-transform-data-processing-example-default"></a>

默认情况下，[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-DataProcessing](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-CreateTransformJob-request-DataProcessing) 参数不将推理结果与输入联接。它仅输出推理结果。

如果您想明确指定不将结果与输入连接起来，请使用 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)并在转换器调用中指定以下设置。

```
sm_transformer = sagemaker.transformer.Transformer(…)
sm_transformer.transform(…, input_filter="$", join_source= "None", output_filter="$")
```

要使用适用于 Python 的 AWS 软件开发工具包输出推论，请在 CreateTransformJob 请求中添加以下代码。下面的代码模仿了默认行为。

```
{
    "DataProcessing": {
        "InputFilter": "$",
        "JoinSource": "None",
        "OutputFilter": "$"
    }
}
```

### 示例：输出推理与输入数据联接
<a name="batch-transform-data-processing-example-all"></a>

如果您使用 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)将输入数据与输出文件中的推断合并，请在初始化转换器对象时指定`assemble_with`和`accept`参数。使用转换调用时，请为 `join_source` 参数指定 `Input`，同时指定 `split_type` 和 `content_type` 参数。`split_type` 参数的值必须与 `assemble_with` 相同，`content_type` 参数的值必须与 `accept` 相同。[有关参数及其可接受值的更多信息，请参阅 *Amazon A SageMaker I Python SDK* 中的 Transformer 页面。](https://sagemaker.readthedocs.io/en/stable/api/inference/transformer.html#sagemaker.transformer.Transformer)

```
sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv")
sm_transformer.transform(…, join_source="Input", split_type="Line", content_type="text/csv")
```

如果您使用的是 Python AWS 开发工具包 (Boto 3)，请在请求中添加以下代码，将所有输入数据与推理结合起来。[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)`Accept` 和 `ContentType` 的值必须匹配，并且 `AssembleWith` 和 `SplitType` 的值也必须匹配。

```
{
    "DataProcessing": {
        "JoinSource": "Input"
    },
    "TransformOutput": {
        "Accept": "text/csv",
        "AssembleWith": "Line"
    },
    "TransformInput": {
        "ContentType": "text/csv",
        "SplitType": "Line"
    }
}
```

对于 JSON 或 JSON 行输入文件，结果位于输入 JSON 文件的 `SageMakerOutput` 键中。例如，如果输入是一个 JSON 文件，其中包含键值对 `{"key":1}`，则数据转换结果可能是 `{"label":1}`。

SageMaker AI 将两者都存储在`SageMakerInput`密钥的输入文件中。

```
{
    "key":1,
    "SageMakerOutput":{"label":1}
}
```

**注意**  
JSON 的联接结果必须是键值对对象。如果输入不是键值对对象， SageMaker AI 会创建一个新的 JSON 文件。在新的 JSON 文件中，输入数据存储在 `SageMakerInput` 键中，而结果存储为 `SageMakerOutput` 值。

对于 CSV 文件，例如，如果记录 `[1,2,3]`，且标签结果为 `[1]`，则输出文件将包含 `[1,2,3,1]`。

### 示例：输出推理与输入数据联接并从输入中排除 ID 列 (CSV)
<a name="batch-transform-data-processing-example-select-csv"></a>

如果您使用 [Amaz SageMaker on Python SDK](https://sagemaker.readthedocs.io/en/stable) 将输入数据与推理输出连接起来，同时从转换器输入中排除 ID 列，请在转换器调用`input_filter`中指定与前面示例相同的参数以及 JSONPath子表达式。例如，如果您的输入数据包含五列，而第一列是 ID 列，则使用以下转换请求选择除 ID 列之外的所有列作为特征。转换器仍会输出与推理相联接的所有输入列。[有关参数及其可接受值的更多信息，请参阅 *Amazon A SageMaker I Python SDK* 中的 Transformer 页面。](https://sagemaker.readthedocs.io/en/stable/api/inference/transformer.html#sagemaker.transformer.Transformer)

```
sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv")
sm_transformer.transform(…, split_type="Line", content_type="text/csv", input_filter="$[1:]", join_source="Input")
```

如果您使用的是 Python AWS 开发工具包 (Boto 3)，请在`[ CreateTransformJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)`请求中添加以下代码。

```
{
    "DataProcessing": {
        "InputFilter": "$[1:]",
        "JoinSource": "Input"
    },
    "TransformOutput": {
        "Accept": "text/csv",
        "AssembleWith": "Line"
    },
    "TransformInput": {
        "ContentType": "text/csv",
        "SplitType": "Line"
    }
}
```

要在 SageMaker AI 中指定列，请使用数组元素的索引。第一列是索引 0，第二列是索引 1，第六列是索引 5。

要从输入中排除第一列，请将 `[InputFilter](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#SageMaker-Type-DataProcessing-InputFilter )` 设置为 `"$[1:]"`。冒号 (`:`) 告诉 SageMaker AI 包含两个值之间的所有元素（包括在内）。例如，`$[1:4]` 指定第二列到第五列。

如果您省略冒号后的数字，例如 `[5:]`，则子集包含第六列至最后一列的所有列。如果您省略冒号前的数字，例如 `[:5]`，则子集包含第一列（索引 0）至第六列的所有列。

### 示例：输出与 ID 列联接的推理并从输入中排除 ID 列 (CSV)
<a name="batch-transform-data-processing-example-select-json"></a>

如果您使用的是 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)，则可以通过在转换器调用中指定，来指定仅将特定的输入列（例如 ID 列）与推断连接`output_filter`的输出。`output_filter`使用 JSONPath 子表达式来指定在将输入数据与推理结果连接后将哪些列作为输出返回。以下请求显示了如何在排除某个 ID 列的同时进行预测，然后将 ID 列与推理相联接。请注意，在以下示例中，输出的最后一列 (`-1`) 包含推理。如果您使用的是 JSON 文件， SageMaker AI 会将推理结果存储在属性`SageMakerOutput`中。[有关参数及其可接受值的更多信息，请参阅 *Amazon A SageMaker I Python SDK* 中的 Transformer 页面。](https://sagemaker.readthedocs.io/en/stable/api/inference/transformer.html#sagemaker.transformer.Transformer)

```
sm_transformer = sagemaker.transformer.Transformer(…, assemble_with="Line", accept="text/csv")
sm_transformer.transform(…, split_type="Line", content_type="text/csv", input_filter="$[1:]", join_source="Input", output_filter="$[0,-1]")
```

如果您使用的是 Python AWS 开发工具包 (Boto 3)，请在请求中添加以下代码，仅将 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)ID 列与推断相连。

```
{
    "DataProcessing": {
        "InputFilter": "$[1:]",
        "JoinSource": "Input",
        "OutputFilter": "$[0,-1]"
    },
    "TransformOutput": {
        "Accept": "text/csv",
        "AssembleWith": "Line"
    },
    "TransformInput": {
        "ContentType": "text/csv",
        "SplitType": "Line"
    }
}
```

**警告**  
如果您使用的是 JSON 格式的输入文件，该文件不能包含属性名称 `SageMakerOutput`。此属性名称预留供输出文件中的推理使用。如果您的 JSON 格式的输入文件包含具有此名称的属性，则输入文件中的值可能会被推理覆盖。

# 批量转换中的存储
<a name="batch-transform-storage"></a>

当您运行批量转换任务时，Amazon A SageMaker I 会将亚马逊弹性块存储存储卷附加到处理您的任务的 Amazon EC2 实例。该卷存储您的模型，并且存储卷的大小固定为 30 GB。您可以选择在存储卷中静态加密模型。

**注意**  
如果您有大模型，则可能会遇到 `InternalServerError`。

有关 Amazon EBS 存储和功能的更多信息，请参阅以下页面：
+ 《Amazon EC2 用户指南》中的 [Amazon EBS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)
+ 《Amazon EC2 用户指南》中的 [Amazon EBS 卷](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes.html)

**注意**  
G4dn 实例自带本地 SSD 存储。有关 G4dn 实例的更多信息，请参阅 [Amazon EC2 G4 实例](https://aws.amazon.com/ec2/instance-types/g4/)页面。

# 问题排查
<a name="batch-transform-errors"></a>

如果您在 Amazon A SageMaker I Batch Transform 中遇到错误，请参阅以下疑难解答提示。

## 最大超时错误数
<a name="batch-transform-errors-max-timeout"></a>

如果您在运行批量转换作业时遇到最大超时错误，请尝试以下方法：
+ 从单条记录 `[BatchStrategy](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-BatchStrategy)` 开始，批处理大小采用默认值 (6 MB) 或您在 `[MaxPayloadInMB](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-MaxPayloadInMB)` 参数中指定的更小值，并使用小样本数据集。优化最大超时参数 `[InvocationsTimeoutInSeconds](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelClientConfig.html#sagemaker-Type-ModelClientConfig-InvocationsTimeoutInSeconds)`（最大值为 1 小时），直到收到成功的调用响应。
+ 在收到成功的调用响应后，将 `MaxPayloadInMB`（最大值为 100 MB）和 `InvocationsTimeoutInSeconds` 参数一起增加，以找到可支持所需模型超时的最大批处理大小。您可以在此步骤中使用单条记录或多条记录的 `BatchStrategy`。
**注意**  
超过 `MaxPayloadInMB` 限制会导致出错。如果大数据集无法拆分、`SplitType` 参数设置为 none 或数据集内单个记录超过限制，则可能会出现此情况。
+ （可选）调整 `[MaxConcurrentTransforms](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-MaxConcurrentTransforms)` 参数，该参数指定可发送到批量转换作业中的每个实例的最大并行请求数。但是，`MaxConcurrentTransforms * MaxPayloadInMB` 的值不得超过 100 MB。

## 输出不完整
<a name="batch-transform-errors-incomplete"></a>

SageMaker AI 使用 Amazon S3 [分段上传 API](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html) 将批量转换任务的结果上传到 Amazon S3。如果出现错误，则系统会从 Amazon S3 中删除上传的结果。在某些情况下（如发生网络中断时），未完成的分段上传可能会保留在 Amazon S3 中。如果您有多个输入文件，但是 SageMaker AI Batch Transform 无法处理其中一些文件，也可能导致上传不完整。无法处理的输入文件在 Amazon S3 中将不会有相应的输出文件。

为避免产生存储费用，我们建议您将 [S3 存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config)添加到 S3 存储桶生命周期规则中。此策略会删除可能存储在 S3 存储桶中的未完成分段上传。有关更多信息，请参阅[对象生命周期管理](https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html)。

## 作业显示为 `failed`
<a name="batch-transform-errors-failed"></a>

如果批处理转换作业由于数据集问题而无法处理输入文件， SageMaker AI 会将该作业标记为`failed`。如果输入文件包含错误记录，则转换作业不会为该输入文件创建输出文件，因为这样做的话，将无法与输入文件中的转换后数据保持相同的顺序。当数据集具有多个输入文件时，即使转换作业无法处理其中一个输入文件，它也会继续处理这些文件。处理后的文件仍会生成可用的结果。

如果您使用的是自己的算法，则当算法在输入文件中找到错误记录时，您可以使用占位符文本，如 `ERROR`。例如，如果数据集中的最后一条记录是错误的，算法会在输出文件中放入占位符文本来替代该记录。