

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

# 自定义用于批次转换的推理代码
<a name="your-algorithms-batch-code"></a>

本节介绍了 Amazon A SageMaker I 如何与 Docker 容器交互，该容器运行您自己的推理代码以进行批量转换。使用此信息编写推理代码并创建 Docker 镜像。

**Topics**
+ [SageMaker AI 如何运行你的推理图像](#your-algorithms-batch-code-run-image)
+ [SageMaker AI 如何加载你的模型工件](#your-algorithms-batch-code-load-artifacts)
+ [容器如何使用请求](#your-algorithms-batch-code-how-containe-serves-requests)
+ [容器应如何响应推理请求](#your-algorithms-batch-code-how-containers-should-respond-to-inferences)
+ [容器应如何响应运行状况检查 (Ping) 请求](#your-algorithms-batch-algo-ping-requests)

## SageMaker AI 如何运行你的推理图像
<a name="your-algorithms-batch-code-run-image"></a>

要配置容器以作为可执行文件运行，请使用 Dockerfile 中的 `ENTRYPOINT` 指令。注意以下几点：
+ 对于批量变换， SageMaker AI 会代表你调用模型。 SageMaker AI 按以下方式运行容器：

  ```
  docker run image serve
  ```

  在批量转换时，输入格式必须是可以拆分为较小文件的格式，以便并行处理。这些格式包括 CSV、[JSON、JSO](https://www.json.org/json-en.html) [N Lines [TFRecord](https://www.tensorflow.org/tutorials/load_data/tfrecord)](https://jsonlines.org/)和 [Recordio。](https://mesos.apache.org/documentation/latest/recordio/)

  SageMaker AI 通过在图像名称后指定`serve`参数来覆盖容器中的默认`CMD`语句。`serve` 参数覆盖您使用 Dockerfile 中的 `CMD` 命令提供的参数。

   
+ 建议您使用 `exec` 形式的 `ENTRYPOINT` 指令：

  ```
  ENTRYPOINT ["executable", "param1", "param2"]
  ```

  例如：

  ```
  ENTRYPOINT ["python", "k_means_inference.py"]
  ```

   
+ SageMaker AI 会设置容器中[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html)和容器[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html)上指定的环境变量。此外，将填充以下环境变量：
  + 当容器运行批量转换时，`SAGEMAKER_BATCH` 设置为 `true`。
  + `SAGEMAKER_MAX_PAYLOAD_IN_MB` 设置为通过 HTTP 发送到容器的最大负载大小。
  + 在调用时，如果容器每个调用发送一条记录，则将 `SAGEMAKER_BATCH_STRATEGY`设置为 `SINGLE_RECORD`，如果容器获取负载中可以容纳的尽可能多的记录，则设置为 `MULTI_RECORD`。
  + `SAGEMAKER_MAX_CONCURRENT_TRANSFORMS` 设置为可以同时打开的 `/invocations` 请求的最大数量。
**注意**  
最后三个环境变量来自用户发出的 API 调用。如果用户没有为这些变量设置值，则不会传递它们。在这种情况下，使用默认值或算法请求的值（用于响应 `/execution-parameters`）。
+ 如果您为模型推理使用 GPU 设备（通过在 `CreateTransformJob` 请求中指定基于 GPU 的 ML 计算实例），请确保您的容器与 nvidia-docker 兼容。不要将 NVIDIA 驱动程序与映像捆绑。有关 nvidia-docker 的更多信息，请参阅 [NVIDIA/nvidia-docker](https://github.com/NVIDIA/nvidia-docker)。

   
+ 你不能使用`init`初始化器作为 SageMaker AI 容器中的入口点，因为它会被 train 和 serve 参数混淆。

  

## SageMaker AI 如何加载你的模型工件
<a name="your-algorithms-batch-code-load-artifacts"></a>

在 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html) 请求中，容器定义包含 `ModelDataUrl` 参数，它标识在 Amazon S3 中存储模型构件的位置。当您使用 SageMaker AI 进行推断时，它会使用此信息来确定从何处复制模型工件。它将构件复制到 Docker 容器中的 `/opt/ml/model` 目录，以供您的推理代码使用。

`ModelDataUrl` 参数必须指向 tar.gz 文件。否则， SageMaker AI 无法下载该文件。如果您使用 SageMaker AI 训练模型，它会将工件作为单个压缩的 tar 文件保存到 Amazon S3 中。如果您在其他框架中训练模型，则需要将模型工件作为压缩的 tar 文件存储在 Amazon S3 中。 SageMaker 在批处理转换作业开始之前，AI 会解压缩此 tar 文件并将其保存在容器中的`/opt/ml/model`目录中。

## 容器如何使用请求
<a name="your-algorithms-batch-code-how-containe-serves-requests"></a>

容器必须实施一个 Web 服务器，以响应端口 8080 上的调用和 ping 请求。对于批量转换，您可以选择设置算法以实现执行参数请求，从而向 AI 提供动态运行时配置。 SageMaker SageMaker AI 使用以下终端节点：
+ `ping`— 用于定期检查容器的运行状况。 SageMaker 在发送调用请求之前，AI 会等待 HTTP `200` 状态码和空正文以获得 ping 请求成功。当调用请求发出后，您可以使用 ping 请求将模型加载到内存中，以生成推理。
+ （可选）`execution-parameters` – 允许算法在运行期间为作业提供最佳调整参数。该算法根据内存和容器的 CPUs 可用内存为作业选择相应的`MaxConcurrentTransforms``BatchStrategy`、和`MaxPayloadInMB`值。

在调用调用请求之前， SageMaker AI 会尝试调用执行参数请求。创建批处理转换作业时，可以为`MaxConcurrentTransforms``BatchStrategy`、和`MaxPayloadInMB`参数提供值。 SageMaker AI 使用以下优先顺序确定这些参数的值：

1. 在您创建 `CreateTransformJob` 请求时提供的参数值。

1. 当 SageMaker AI 调用执行参数端点时，模型容器返回的值>

1. 默认参数值，如下表所列。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/your-algorithms-batch-code.html)

`GET` execution-parameters 请求的响应是一个 JSON 对象，带有 `MaxConcurrentTransforms`、`BatchStrategy` 和 `MaxPayloadInMB` 参数的键值。以下是一个有效响应的示例：

```
{
“MaxConcurrentTransforms”: 8,
“BatchStrategy": "MULTI_RECORD",
"MaxPayloadInMB": 6
}
```

## 容器应如何响应推理请求
<a name="your-algorithms-batch-code-how-containers-should-respond-to-inferences"></a>

为了获得推论，Amazon A SageMaker I 会向推理容器发送一个 POST 请求。POST 请求正文包含来自 Amazon S3 的数据。Amazon SageMaker AI 将请求传递到容器，然后从容器返回推理结果，将响应中的数据保存到 Amazon S3。

要接收推理请求，容器必须有一个在端口 8080 上侦听的 Web 服务器，并且必须接受到针对 `/invocations` 终端节点的 POST 请求。推理请求超时和最大重试次数可通过 `[ModelClientConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ModelClientConfig.html)` 配置。

## 容器应如何响应运行状况检查 (Ping) 请求
<a name="your-algorithms-batch-algo-ping-requests"></a>

容器上的最简单要求是使用 HTTP 200 状态代码和空白正文进行响应。这向 SageMaker AI 表明容器已准备好接受`/invocations`终端节点的推理请求。

虽然最低限制供容器用来返回静态 200，但容器开发人员可使用此功能执行更深入的检查。`/ping` 尝试的请求超时为 2 秒。