带有 Batch 转换的自定义推理代码 - Amazon SageMaker

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

带有 Batch 转换的自定义推理代码

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

如何 SageMaker 运行你的推理图像

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

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

    docker run image serve

    在批量转换时,输入格式必须是可以拆分为较小文件的格式,以便并行处理。这些格式包括CSV、JSON、Lin JSONes 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基于机器学习的计算实例),请确保您的容器兼容 nvidia-docker。不要将NVIDIA驱动程序与映像捆绑在一起。有关 nvidia-docker 的更多信息,请参阅 /nvidia-docker。NVIDIA

     

  • 你不能在 SageMaker容器中使用init初始化器作为入口点,因为它会被 train 和 serve 参数混淆。

如何 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 在发送调用请求之前,等待HTTP200状态码和空正文以获得 ping 请求成功。当调用请求发出后,您可以使用 ping 请求将模型加载到内存中,以生成推理。

  • (可选)execution-parameters – 允许算法在运行期间为作业提供最佳调整参数。该算法根据内存和容器的CPUs可用内存为作业选择相应的MaxConcurrentTransformsBatchStrategy、和MaxPayloadInMB值。

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

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

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

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

    参数 默认值
    MaxConcurrentTransforms

    1

    BatchStrategy

    MULTI_RECORD

    MaxPayloadInMB

    6

GET执行参数请求的响应是一个带有MaxConcurrentTransformsBatchStrategy、和MaxPayloadInMB参数的密钥的JSON对象。以下是一个有效响应的示例:

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

容器应如何响应推理请求

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

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

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

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

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