本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建模型包映像
Amazon SageMaker AI 模型包是一种预先训练的模型,可以进行预测,不需要买家进行任何进一步的培训。您可以在 A SageMaker I 中创建模型包并在上发布您的机器学习产品 AWS Marketplace。以下各节将介绍如何为其创建模型包 AWS Marketplace。这包括创建容器映像以及在本地构建和测试映像。
概览
模型包包含以下组件:
-
存储在 Amazon Elastic Container Registry
(Amazon ECR) 中的推理映像 -
(可选)模型构件,单独存储在 Amazon S3
中
注意
模型构件是模型用来进行预测的文件,通常是您自己的训练过程的结果。构件可以是模型所需的任何文件类型,但必须压缩为 .tar.gz。对于模型包,它们可以捆绑在您的推理图像中,也可以单独存储在 Ama SageMaker zon AI 中。存储在 Amazon S3 中的模型构件将在运行时加载到推理容器中。发布您的模型包时,这些项目会发布并存储在买家无法直接访问的 AWS Marketplace 自有的 Amazon S3 存储桶中。
提示
如果您的推理模型是使用 Gluon、Keras、、、、 TensorFlow-Lite 或 ONNX 等深度学习框架构建的 MXNet PyTorch TensorFlow,请考虑使用 Amazon AI Neo。 SageMaker Neo 可以自动优化部署到特定云实例类型(例如,ml.c4
和 ml.p2
等)的推理模型。有关更多信息,请参阅 Amazon A SageMaker I 开发者指南中的使用 Neo 优化模型性能。
下图显示了发布和使用模型包产品的工作流程。

为创建 A SageMaker I 模型包的工作流程 AWS Marketplace 包括以下步骤:
-
卖家创建推理映像(部署后无法访问网络)并将其推送到 Amazon ECR 注册表。
模型构件可以捆绑在推理映像中,也可以单独存储在 S3 中。
-
然后,卖家在 Amazon A SageMaker I 中创建模型包资源并在上发布其机器学习产品 AWS Marketplace。
-
买家订阅机器学习产品并部署模型。
注意
该模型可以部署为实时推理端点,也可以部署为批处理作业,以一次性获取整个数据集的预测。有关更多信息,请参阅部署模型以进行推理。
-
SageMaker AI 运行推理图像。卖家提供的任何未捆绑在推理映像中的模型构件都将在运行时动态加载。
-
SageMaker AI 使用容器的 HTTP 端点将买方的推理数据传递到容器并返回预测结果。
为模型包创建推理映像
本部分提供了将推理代码打包成模型包产品的推理映像的演练。此过程包括以下步骤:
推理映像是包含您的推理逻辑的 Docker 映像。容器在运行时会公开 HTTP 端点,以允许 SageMaker AI 将数据传入和传出您的容器。
注意
以下只是推理映像打包代码的一个示例。有关更多信息,请参阅使用带有 SageMaker AI 的 Docker 容器和上 GitHub的 AWS Marketplace
SageMaker AI 示例
为了简单起见,以下示例使用了 Web 服务 Flask
第 1 步:创建容器映像
为了使推理映像与 SageMaker AI 兼容,Docker 镜像必须公开 HTTP 端点。当您的容器运行时,SageMaker AI 会将买方输入传递给容器的 HTTP 端点,以进行推理。推理结果返回在 HTTP 响应的正文中。
以下演练在使用 Linux Ubuntu 发行版的开发环境中使用 Docker CLI。
创建 Web 服务器脚本
此示例使用名为 Flask
注意
为了简单起见,这里使用 Flask
创建一个 Flask Web 服务器脚本,在 SageMaker AI 使用的 TCP 端口 8080 上为两个 HTTP 端点提供服务。以下是两个预期的端点:
-
/ping
— SageMaker AI 向此端点发出 HTTP GET 请求,以检查您的容器是否准备就绪。当您的容器准备就绪时,它会使用 HTTP 200 响应代码来响应此端点的 HTTP GET 请求。 -
/invocations
— SageMaker AI 向此端点发出 HTTP POST 请求以进行推理。用于推理的输入数据在请求正文中发送。用户指定的内容类型在 HTTP 头中传递。响应的主体是推理输出。有关超时的详细信息,请参阅创建机器学习产品的要求和最佳实操。
./web_app_serve.py
# Import modules import json import re from flask import Flask from flask import request app = Flask(__name__) # Create a path for health checks @app.route("/ping") def endpoint_ping(): return "" # Create a path for inference @app.route("/invocations", methods=["POST"]) def endpoint_invocations(): # Read the input input_str = request.get_data().decode("utf8") # Add your inference code between these comments. # # # # # # Add your inference code above this comment. # Return a response with a prediction response = {"prediction":"a","text":input_str} return json.dumps(response)
在前面的示例中,没有实际的推理逻辑。对于实际的推理映像,请将推理逻辑添加到 Web 应用中,以便它处理输入并返回实际预测。
您的推理图像必须包含其所有必需的依赖项,因为它无法访问互联网,也无法调用任何 AWS 服务依赖项。
注意
实时推断和批量推断都需要同样的代码
为容器运行创建脚本
创建一个名为 SageMaker AI serve
在运行 Docker 容器镜像时运行的脚本。以下脚本启动 HTTP Web 服务器。
./serve
#!/bin/bash # Run flask server on port 8080 for SageMaker flask run --host 0.0.0.0 --port 8080
创建 Dockerfile
在您的构建上下文中创建 Dockerfile
。此示例使用 Ubuntu 18.04,但您可以从适用于您的框架的任何基础映像开始。
./Dockerfile
FROM ubuntu:18.04 # Specify encoding ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 # Install python-pip RUN apt-get update \ && apt-get install -y python3.6 python3-pip \ && ln -s /usr/bin/python3.6 /usr/bin/python \ && ln -s /usr/bin/pip3 /usr/bin/pip; # Install flask server RUN pip install -U Flask; # Add a web server script to the image # Set an environment to tell flask the script to run COPY /web_app_serve.py /web_app_serve.py ENV FLASK_APP=/web_app_serve.py # Add a script that Amazon SageMaker AI will run # Set run permissions # Prepend program directory to $PATH COPY /serve /opt/program/serve RUN chmod 755 /opt/program/serve ENV PATH=/opt/program:${PATH}
Dockerfile
将之前创建的两个脚本添加到映像中。serve
脚本的目录已添加到 PATH 中,因此它可以在容器运行时运行。
打包或上传模型构件
提供从训练模型到推理映像的模型构件的两种方法如下:
-
与推理映像一起静态打包。
-
在运行时动态加载。由于它是动态加载的,因此您可以使用相同的映像来打包不同的机器学习模型。
如果要将模型构件与推理映像打包,请将构件包含在 Dockerfile
中。
如果您想动态加载模型构件,请将这些构件单独存储在 Amazon S3 的压缩文件 (.tar.gz) 中。创建模型包时,请指定压缩文件的位置, SageMaker AI /opt/ml/model/
会在运行容器时提取内容并将其复制到容器目录中。发布您的模型包时,这些构件会发布并存储在买家无法直接访问的 AWS Marketplace
所有 Amazon S3 存储桶中。
第 2 步:在本地构建和测试映像
在构建上下文中,现在存在以下文件:
-
./Dockerfile
-
./web_app_serve.py
-
./serve
-
您的推理逻辑和(可选)依赖项
接下来,构建、运行和测试容器镜像。
构建映像:
在构建上下文中运行 Docker 命令来构建和标记映像。此示例使用标记 my-inference-image
。
sudo docker build --tag my-inference-image ./
运行此 Docker 命令构建映像后,当 Docker 根据您的 Dockerfile
的每一行构建映像时,您该会看到输出。完成后,您应看到类似如下所示的内容:
Successfully built abcdef123456
Successfully tagged my-inference-image:latest
本地运行
构建完成后,您可以在本地测试映像。
sudo docker run \ --rm \ --publish 8080:8080/tcp \ --detach \ --name my-inference-container \ my-inference-image \ serve
下面是有关命令的详细信息:
-
--rm
– 容器停止后自动将其移除。 -
--publish 8080:8080/tcp
— 公开端口 8080 以模拟 SageMaker AI 向其发送 HTTP 请求的端口。 -
--detach
– 在后台运行容器。 -
--name my-inference-container
– 为正在运行的容器提供名称。 -
my-inference-image
– 运行构建的映像。 -
serve
— 运行与 SageMaker AI 在运行容器时运行的脚本相同的脚本。
运行此命令后,Docker 会根据您构建的推理映像创建一个容器并在后台运行它。容器运行 serve
脚本,该脚本会启动您的 Web 服务器以进行测试。
测试 ping HTTP 端点
当 SageMaker AI 运行您的容器时,它会定期 ping 终端节点。 当终端节点返回状态代码为 200 的 HTTP 响应时,它会向 SageMaker AI 发出信号,表示容器已准备好进行推理。您可以通过运行以下命令进行测试,将测试端点并包含响应头。
curl --include http://127.0.0.1:8080/ping
示例输出如下:
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 0
Server: MyServer/0.16.0 Python/3.6.8
Date: Mon, 21 Oct 2019 06:58:54 GMT
测试推理 HTTP 端点
当容器通过向你的 ping 返回 200 状态码来表示已准备就绪时, SageMaker AI 会通过POST
请求将推理数据传递到 /invocations
HTTP 终端节点。通过运行以下命令来测试推理点。
curl \ --request POST \ --data "hello world" \ http://127.0.0.1:8080/invocations
示例输出如下:
{"prediction": "a", "text": "hello
world"}
在这两个 HTTP 端点工作后,推理图像现在与 SageMaker AI 兼容。
注意
您的模型包产品的模型可以通过两种方式部署:实时部署和批量部署。在这两个部署中, SageMaker 人工智能在运行 Docker 容器时使用相同的 HTTP 端点。
要停止容器,请运行以下命令。
sudo docker container stop my-inference-container
当您的推理映像准备就绪并经过测试后,您可以继续将映像上传到 Amazon Elastic Container Registry。