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

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

将您自己的推理代码用于托管服务

本节介绍亚马逊如何与运行您自己的托管服务推理代码的 Docker 容器进行 SageMaker 交互。使用此信息编写推理代码并创建 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"]

    exec 形式的 ENTRYPOINT 指令直接启动可执行文件,而不是 /bin/sh 的子级。这使它能够接收像SIGTERM SageMaker API 操作一样SIGKILL的信号,这是一项要求。

     

    例如,当您使用 CreateEndpointAPI 创建终端节点时, SageMaker会预置您在请求中指定的终端节点配置所需的 ML 计算实例数量。 SageMaker 在这些实例上运行 Docker 容器。

     

    如果您减少支持终端节点的实例数量(通过调用 UpdateEndpointWeightsAndCapacitiesAPI),则在正在终止的实例上 SageMaker 运行命令以停止 Docker 容器。此命令发送 SIGTERM 信号,然后在 30 秒后发送 SIGKILL 信号。

     

    如果您更新终端节点(通过调用 UpdateEndpointAPI),则会 SageMaker 启动另一组 ML 计算实例,并在这些实例上运行包含您的推理代码的 Docker 容器。然后,它会运行一条命令来停止以前的 Docker 容器。要停止 Docker 容器,命令发送SIGTERM信号,然后在 30 秒后发送SIGKILL信号。

     

  • SageMaker 使用您在CreateModel请求中提供的容器定义为容器设置环境变量和 DNS 主机名,如下所示:

     

    • 它使用ContainerDefinition.Environment string-to-string地图设置环境变量。

    • 它使用 ContainerDefinition.ContainerHostname 设置 DNS 主机名。

       

  • 如果您计划使用 GPU 设备进行模型推断(通过在CreateEndpointConfig请求中指定基于 GPU 的 ML 计算实例),请确保您的容器nvidia-docker兼容。不要将 NVIDIA 驱动程序与镜像捆绑。有关 nvidia-docker 的更多信息,请参阅 NVIDIA/nvidia-docker

     

  • 你不能使用tini初始化器作为 SageMaker容器中的入口点,因为它会被trainserve参数混淆。

如何 SageMaker 加载模型工件

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

ModelDataUrl 必须指向 tar.gz 文件。否则,将 SageMaker 无法下载该文件。

如果您在中训练模型 SageMaker,则模型构件将作为单个压缩 tar 文件保存在 Amazon S3 中。如果您在外部训练模型 SageMaker,则需要创建这个压缩的 tar 文件并将其保存在 S3 位置。 SageMaker 在容器启动之前,将此 tar 文件解压缩到 /opt/ml/model 目录中。

容器如何使用请求

容器必须实施在端口 8080 上响应 /invocations/ping 的 Web 服务器。

容器应如何响应推理请求

为了获得推理结果,客户端应用程序将向 SageMaker 终端节点发送 POST 请求。有关更多信息,请参阅 InvokeEndpointAPI。 SageMaker 将请求传递给容器,并将容器的推断结果返回给客户端。请注意以下几点:

  • SageMaker 除支持的POST标题以外的所有标题除外InvokeEndpoint。 SageMaker 可能会添加其他标题。推理容器必须能够安全地忽略这些额外标头。

  • 要接收推理请求,容器必须有一个在端口 8080 上侦听的 Web 服务器,并且必须接受到 POST 终端节点的 /invocations 请求。

  • 客户的模型容器必须在 250 毫秒内接受套接字连接请求。

  • 客户的模型容器必须在 60 秒内响应请求。在响应之前,模型本身的最大处理时间为 60 秒/invocations。如果您的模型需要 50 到 60 秒的处理时间,则开发工具包套接字超时应设置为 70 秒。

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

SageMaker 以下情况下情况下情况下情况下情况下情况下:

  • 响应CreateEndpointUpdateEndpoint、和UpdateEndpointWeightsAndCapacities API 调用

  • 安全修补

  • 替换运行状况不佳的实例

容器启动后不久, SageMaker 开始定期向/ping终端节点发送 GET 请求。

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

如果容器在启动后的 4 分钟内,通过持续响应 200 秒来开始通过运行状况检查,则新实例启动将失败。这将CreateEndPoint导致失败,使端点处于故障状态。请求的更新UpdateEndpoint将无法完成,不会应用安全补丁,也不会替换运行状况不佳的实例。

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