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

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

此部分介绍 Amazon SageMaker 如何与运行您自己的推理代码的 Docker 容器进行交互,以便进行批量转换。使用此信息编写推理代码并创建 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 在容器上设置 CreateModelCreateTransformJob 中指定的环境变量。此外,将填充以下环境变量:

    • 当容器运行批量转换时,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 – 允许算法在运行期间为作业提供最佳调整参数。根据容器可用的内存和 CPU,算法为作业选择适当的 MaxConcurrentTransformsBatchStrategyMaxPayloadInMB 值。

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

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

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

  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 秒。