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

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

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

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

SageMaker 如何运行您的推理映像

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

  • 对于批量转换,SageMaker 通过以下方法运行容器:

    docker run image serve

    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 请求。对于批量转换,您可以选择设置算法以实施 execution-parameters 请求,以便为 SageMaker 提供动态运行时配置。SageMaker 使用以下终端节点:

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

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

在发出调用请求前,SageMaker 尝试调用 execution-parameters 请求。在创建批量转换作业时,您可以为 MaxConcurrentTransformsBatchStrategyMaxPayloadInMB 参数提供值。SageMaker 使用以下优先级顺序确定这些参数的值:

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

  2. 调用 execution-parameters 终端节点时模型容器返回的值>SageMaker

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

    参数 默认值
    MaxConcurrentTransforms

    1

    BatchStrategy

    MULTI_RECORD

    MaxPayloadInMB

    6

execution-parameters 请求的响应是一个 JSON 对象,包含 GETMaxConcurrentTransformsBatchStrategy 参数的键。MaxPayloadInMB以下是一个有效响应的示例:

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

容器应如何响应推理请求

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

要接收推理请求,容器必须有一个在端口 8080 上侦听的 Web 服务器,并且必须接受到针对 /invocations 终端节点的 POST 请求。模型容器必须在 600 秒内响应请求。

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

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

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