

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

# 创建模型包映像
<a name="ml-model-package-images"></a>

Amazon SageMaker AI 模型包是一种预先训练的模型，可以进行预测，不需要买家进行任何进一步的培训。您可以在 A SageMaker I 中创建模型包并在上发布您的机器学习产品 AWS Marketplace。以下各节将介绍如何为其创建模型包 AWS Marketplace。这包括创建容器映像以及在本地构建和测试映像。

**Topics**
+ [概述](#ml-model-package-images-overview)
+ [为模型包创建推理映像](#ml-creating-an-inference-image-for-model-packages)

## 概述
<a name="ml-model-package-images-overview"></a>

 模型包包含以下组件：
+  存储在 [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/) (Amazon ECR) 中的推理映像 
+  （可选）模型构件，单独存储在 [Amazon S3](https://aws.amazon.com/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 优化模型性能](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。

下图显示了发布和使用模型包产品的工作流程。

![卖家如何创建模型包映像以及买家如何使用它的示意图。](http://docs.aws.amazon.com/zh_cn/marketplace/latest/userguide/images/ml-model-package-images.png)


为创建 A SageMaker I 模型包的工作流程 AWS Marketplace 包括以下步骤：

1. 卖家创建推理映像（部署后无法访问网络）并将其推送到 Amazon ECR 注册表。

   模型构件可以捆绑在推理映像中，也可以单独存储在 S3 中。

1. 然后，卖家在 Amazon A SageMaker I 中创建模型包资源并在上发布其机器学习产品 AWS Marketplace。

1. 买家订阅机器学习产品并部署模型。
**注意**  
 该模型可以部署为实时推理端点，也可以部署为批处理作业，以一次性获取整个数据集的预测。有关更多信息，请参阅[部署模型以进行推理](https://docs.aws.amazon.com/sagemaker/latest/dg/deploy-model.html)。

1. SageMaker AI 运行推理图像。卖家提供的任何未捆绑在推理映像中的模型构件都将在运行时动态加载。

1.  SageMaker AI 使用容器的 HTTP 端点将买方的推理数据传递到容器并返回预测结果。

## 为模型包创建推理映像
<a name="ml-creating-an-inference-image-for-model-packages"></a>

本部分提供了将推理代码打包成模型包产品的推理映像的演练。此过程包括以下步骤：

**Topics**
+ [第 1 步：创建容器映像](#ml-step-1-creating-the-container-image)
+ [第 2 步：在本地构建和测试映像](#ml-step-2-building-and-testing-the-image-locally)

推理映像是包含您的推理逻辑的 Docker 映像。容器在运行时会公开 HTTP 端点，以允许 SageMaker AI 将数据传入和传出您的容器。

**注意**  
 以下只是推理映像打包代码的一个示例。有关更多信息，请参阅[使用带有 SageMaker AI 的 Docker 容器和](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html)上 GitHub的 [AWS Marketplace SageMaker AI 示例](https://github.com/aws/amazon-sagemaker-examples/tree/master/aws_marketplace)。  
为了简单起见，以下示例使用了 Web 服务 [Flask](https://pypi.org/project/Flask/)，但不被视为生产就绪。

### 第 1 步：创建容器映像
<a name="ml-step-1-creating-the-container-image"></a>

 为了使推理映像与 SageMaker AI 兼容，Docker 镜像必须公开 HTTP 端点。当您的容器运行时，SageMaker AI 会将买方输入传递给容器的 HTTP 端点，以进行推理。推理结果返回在 HTTP 响应的正文中。

 以下演练在使用 Linux Ubuntu 发行版的开发环境中使用 Docker CLI。
+ [创建 Web 服务器脚本](#ml-create-the-web-server-script)
+ [为容器运行创建脚本](#ml-create-the-script-for-the-container-run)
+ [创建 `Dockerfile`](#ml-create-the-dockerfile)
+ [打包或上传模型构件](#ml-package-or-upload-the-model-artifacts)

#### 创建 Web 服务器脚本
<a name="ml-create-the-web-server-script"></a>

 此示例使用名为 [Flask](https://pypi.org/project/Flask/) 的 Python 服务器，但您可以使用任何适用于您的框架的 Web 服务器。

**注意**  
为了简单起见，这里使用 [Flask](https://pypi.org/project/Flask/)。它不被视为生产就绪的 Web 服务器。

 创建一个 Flask Web 服务器脚本，在 SageMaker AI 使用的 TCP 端口 8080 上为两个 HTTP 端点提供服务。以下是两个预期的端点：
+  `/ping`— SageMaker AI 向此端点发出 HTTP GET 请求，以检查您的容器是否准备就绪。当您的容器准备就绪时，它会使用 HTTP 200 响应代码来响应此端点的 HTTP GET 请求。
+  `/invocations`— SageMaker AI 向此端点发出 HTTP POST 请求以进行推理。用于推理的输入数据在请求正文中发送。用户指定的内容类型在 HTTP 头中传递。响应的主体是推理输出。有关超时的详细信息，请参阅[创建机器学习产品的要求和最佳实操](ml-listing-requirements-and-best-practices.md)。

 **`./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 服务依赖项。

**注意**  
实时推断和批量推断都需要同样的代码

#### 为容器运行创建脚本
<a name="ml-create-the-script-for-the-container-run"></a>

 创建一个名为 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`
<a name="ml-create-the-dockerfile"></a>

 在您的构建上下文中创建 `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 中，因此它可以在容器运行时运行。

#### 打包或上传模型构件
<a name="ml-package-or-upload-the-model-artifacts"></a>

 提供从训练模型到推理映像的模型构件的两种方法如下：
+  与推理映像一起静态打包。
+  在运行时动态加载。由于它是动态加载的，因此您可以使用相同的映像来打包不同的机器学习模型。

 如果要将模型构件与推理映像打包，请将构件包含在 `Dockerfile` 中。

 如果您想动态加载模型构件，请将这些构件单独存储在 Amazon S3 的压缩文件 (.tar.gz) 中。创建模型包时，请指定压缩文件的位置， SageMaker AI `/opt/ml/model/` 会在运行容器时提取内容并将其复制到容器目录中。发布您的模型包时，这些构件会发布并存储在买家无法直接访问的 AWS Marketplace 所有 Amazon S3 存储桶中。

### 第 2 步：在本地构建和测试映像
<a name="ml-step-2-building-and-testing-the-image-locally"></a>

 在构建上下文中，现在存在以下文件：
+  `./Dockerfile` 
+  `./web_app_serve.py` 
+  `./serve` 
+  您的推理逻辑和（可选）依赖项 

 接下来，构建、运行和测试容器镜像。

#### 构建映像：
<a name="ml-build-the-image"></a>

 在构建上下文中运行 Docker 命令来构建和标记映像。此示例使用标记 `my-inference-image`。

```
sudo docker build --tag my-inference-image ./
```

 运行此 Docker 命令构建映像后，当 Docker 根据您的 `Dockerfile` 的每一行构建映像时，您该会看到输出。完成后，您应看到类似如下所示的内容：

```
Successfully built abcdef123456
Successfully tagged my-inference-image:latest
```

#### 本地运行
<a name="ml-run-locally"></a>

 构建完成后，您可以在本地测试映像。

```
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 端点
<a name="ml-test-the-ping-http-endpoint"></a>

 当 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 端点
<a name="ml-test-the-inference-http-endpoint"></a>

 当容器通过向你的 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](ml-uploading-your-images.md)。