将您自己的推理代码用于批量转换 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

将您自己的推理代码用于批量转换

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

如何 SageMaker 运行你的推理图像

要配置容器以作为可执行文件运行,请使用 Dockerfile 中的 ENTRYPOINT 指令。请注意以下几点:

  • 对于批量变换, SageMaker 代表您调用模型。 SageMaker 将容器运行为:

    docker run image serve

    在批量转换时,输入格式必须是可以拆分为较小文件的格式,以便并行处理。这些格式包括 CSV、JSONJSON 行TFRecordRecordIO

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

     

  • 建议您使用 exec 形式的 ENTRYPOINT 指令:

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

    例如:

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

     

  • SageMaker 设置容器中CreateModel和容器CreateTransformJob上指定的环境变量。此外,将填充以下环境变量:

    • 当容器运行批量转换时,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

     

  • 不能使用 init 初始化程序作为 SageMaker 容器中的入口点,因为它会被训练参数和服务参数混淆。

如何 SageMaker 加载模型工件

CreateModel 请求中,容器定义包含 ModelDataUrl 参数,它标识在 Amazon S3 中存储模型构件的位置。当您使用 SageMaker 推理时,它会使用此信息来确定从何处复制模型工件。它将构件复制到 Docker 容器中的 /opt/ml/model 目录,以供您的推理代码使用。

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

容器如何使用请求

容器必须实施一个 Web 服务器,以响应端口 8080 上的调用和 ping 请求。对于批量转换,您可以选择设置算法以实现执行参数请求,从而为其提供动态运行时配置。 SageMaker SageMaker使用以下端点:

  • ping— 用于定期检查容器的运行状况。 SageMaker 在发送调用请求之前,会等待 HTTP 200 状态码和空正文以获得 ping 请求成功。当调用请求发出后,您可以使用 ping 请求将模型加载到内存中,以生成推理。

  • (可选)execution-parameters – 允许算法在运行期间为作业提供最佳调整参数。根据容器可用的内存和 CPU,算法为作业选择适当的 MaxConcurrentTransformsBatchStrategyMaxPayloadInMB 值。

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

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

  2. 模型容器在 SageMaker 调用执行参数端点时返回的值>

  3. 默认参数值,如下表所列。

    参数 默认值
    MaxConcurrentTransforms

    1

    BatchStrategy

    MULTI_RECORD

    MaxPayloadInMB

    6

GET execution-parameters 请求的响应是一个 JSON 对象,带有 MaxConcurrentTransformsBatchStrategyMaxPayloadInMB 参数的键值。以下是一个有效响应的示例:

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

容器应如何响应推理请求

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

要接收推理请求,容器必须有一个在端口 8080 上侦听的 Web 服务器,并且必须接受到针对 /invocations 终端节点的 POST 请求。推理请求超时和最大重试次数可通过 ModelClientConfig 配置。

容器应如何响应运行状况检查 (Ping) 请求

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

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