本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
创建算法图像
Amazon SageMaker 算法要求买家在做出预测之前带上自己的数据进行训练。作为 AWS Marketplace 卖家,您可以使用 SageMaker 创建机器学习 (ML) 算法和模型,供买家部署 AWS。以下各节将介绍如何为其创建算法图像 AWS Marketplace。这包括创建用于训练算法的 Docker 训练镜像和包含推理逻辑的推理图像。发布算法产品时,需要同时提供训练图像和推理图像。
概述
算法包括以下组件:
-
存储在 Amazon
中的训练图片 ECR -
存储在亚马逊弹性容器注册表 (Amazon) 中的推理图像 ECR
注意
对于算法产品,训练容器会生成模型构件,这些构件在模型部署时加载到推理容器中。
下图显示了发布和使用算法产品的工作流程。
为创建 SageMaker 算法的工作流程 AWS Marketplace 包括以下步骤:
-
卖家创建训练图片和推理图片(部署后无法访问网络),然后将其上传到 Ama ECR zon Registry。
-
然后,卖家在 Amazon 中创建算法资源 SageMaker ,并在上发布其机器学习产品 AWS Marketplace。
-
买家订阅机器学习产品。
-
买方使用兼容的数据集和适当的超参数值创建训练作业。 SageMaker 运行训练图像并将训练数据和超参数加载到训练容器中。训练作业完成后,位于
/opt/ml/model/
中的模型构件会被压缩并复制到买家的 Amazon S3存储桶中。 -
买家使用存储在 Amazon S3 中的训练模型构件创建模型包,然后部署模型。
-
SageMaker 运行推理图像,提取压缩后的模型工件,并将文件加载到推理容器目录路径
/opt/ml/model/
中,用于推理的代码将在该路径中使用这些文件。 -
无论模型部署为端点还是批量转换作业,都通过容器的HTTP端点代表买方将用于推理的数据 SageMaker 传递到容器并返回预测结果。
注意
有关更多信息,请参阅训练模型。
为算法创建训练映像
本部分提供了将训练代码打包成训练映像的演练。创建算法产品需要训练映像。
训练映像 是包含您的训练算法的 Docker 映像。容器遵循特定的文件结构,允许将数据复制 SageMaker 到容器或从容器中复制数据。
发布算法产品时,需要同时提供训练映像和推理映像。创建训练映像后,必须创建推理映像。这两个映像可以合并为一个映像,也可以作为单独的映像保留。是合并映像还是将它们分开由您决定。通常,推理比训练简单,您可能需要单独的映像来提高推理性能。
注意
以下只是训练映像打包代码的一个示例。有关更多信息,请参阅使用自己的算法和模型, AWS Marketplace并开启AWS Marketplace
SageMaker 示例
步骤 1:创建容器映像
为了使训练图像与 Amazon 兼容 SageMaker,它必须符合特定的文件结构,以便 SageMaker 能够将训练数据和配置输入复制到容器中的特定路径。训练完成后,生成的模型工件将存储在从中 SageMaker 复制的容器中的特定目录路径中。
以下内容使用安装在开发环境中的 Docker,CLI安装在 Linux 的 Ubuntu 发行版上。
准备好程序以读取配置输入
如果您的训练程序需要买家提供的任何配置输入,则以下是运行时将这些内容复制到容器中的位置。如果需要,您的程序必须从这些特定的文件路径中读取。
-
/opt/ml/input/config
是包含控制程序运行方式的信息的目录。-
hyperparameters.json
是JSON超参数名称和值的格式字典。这些值是字符串,因此您可能需要对其进行转换。 -
resourceConfig.json
是一个JSON格式的文件,描述了用于分布式训练的网络布局。 如果您的训练图像不支持分布式训练,则可以忽略此文件。
-
注意
有关配置输入的更多信息,请参阅 Amazon 如何 SageMaker 提供培训信息。
准备好程序以读取数据输入
训练数据可以通过以下两种模式之一传递到容器。在容器中运行的训练程序会以这两种模式之一提取训练数据。
文件模式
-
/opt/ml/input/data/<channel_name>/
包含该渠道的输入数据。渠道是根据对CreateTrainingJob
操作的调用创建的,但通常重要的是渠道必须与算法的预期相匹配。每个渠道的文件都从 Amazon S3复制到此目录,同时保留 Amazon S3 密钥结构所指示的树结构。
管道模式
-
/opt/ml/input/data/<channel_name>_<epoch_number>
是给定纪元的管道。纪元从零开始,每次读取时都会增加一个。可以运行的纪元数没有限制,但是在读取下一个纪元之前,必须关闭每个管道。
准备好程序以编写训练输出
训练的输出将写入以下容器目录:
-
/opt/ml/model/
是您编写模型或训练算法生成的模型构件的目录。您的模型可以采用任意格式。它可以是单个文件或整个目录树。 SageMaker 将此目录中的所有文件打包成压缩文件 (.tar.gz)。此文件可在DescribeTrainingJob
API操作返回的 Amazon S3 位置找到。 -
/opt/ml/output/
是一个目录,算法可以在其中写入描述任务失败原因的failure
文件。此文件的内容将在DescribeTrainingJob
结果的FailureReason
字段中返回。对于成功的作业,无需编写此文件,将被忽略。
为容器运行创建脚本
创建一个在运行 Docker 容器镜像时 SageMaker 运行的 train
shell 脚本。训练完成并将模型构件写入各自的目录后,退出脚本。
./train
#!/bin/bash # Run your training program here # # # #
创建 Dockerfile
在您的构建上下文中创建 Dockerfile
。此示例使用 Ubuntu 18.04 作为基础映像,但您可以从适用于您的框架的任何基础映像开始。
./Dockerfile
FROM ubuntu:18.04 # Add training dependencies and programs # # # # # # Add a script that SageMaker will run # Set run permissions # Prepend program directory to $PATH COPY /train /opt/program/train RUN chmod 755 /opt/program/train ENV PATH=/opt/program:${PATH}
Dockerfile
将之前创建的 train
脚本添加到映像中。脚本的目录已添加到中,PATH这样它就可以在容器运行时运行。
在前面的示例中,没有实际的训练逻辑。对于实际的训练映像,将训练依赖项添加到 Dockerfile
中,然后添加读取训练输入的逻辑,以训练和生成模型构件。
您的训练映像必须包含其所有必需的依赖项,因为它无法访问互联网。
有关更多信息,请参阅使用自己的算法和模型, AWS Marketplace并开启AWS Marketplace
SageMaker 示例
第 2 步:在本地构建和测试映像
在构建上下文中,现在存在以下文件:
-
./Dockerfile
-
./train
-
您的训练依赖项和逻辑
接下来,您可以构建、运行和测试此容器映像。
构建映像:
在构建上下文中运行 Docker 命令来构建和标记映像。此示例使用标记 my-training-image
。
sudo docker build --tag my-training-image ./
运行此 Docker 命令构建映像后,当 Docker 根据您的 Dockerfile
的每一行构建映像时,您该会看到输出。完成后,您应看到类似如下所示的内容:
Successfully built abcdef123456
Successfully tagged my-training-image:latest
本地运行
完成后,在本地测试映像,如以下示例中所示。
sudo docker run \ --rm \ --volume '<path_to_input>:/opt/ml/input:ro' \ --volume '<path_to_model>:/opt/ml/model' \ --volume '<path_to_output>:/opt/ml/output' \ --name my-training-container \ my-training-image \ train
以下是命令的详细信息:
-
--rm
– 容器停止后自动将其移除。 -
--volume '<path_to_input>:/opt/ml/input:ro'
– 将测试输入目录设置为只读供容器使用。 -
--volume '<path_to_model>:/opt/ml/model'
– 训练测试完成后,绑定挂载模型构件在主机上的存储路径。 -
--volume '<path_to_output>:/opt/ml/output'
– 绑定挂载主机上failure
文件中写入失败原因的路径。 -
--name my-training-container
– 为正在运行的容器提供名称。 -
my-training-image
– 运行构建的映像。 -
train
— 运行容器时 SageMaker 运行相同的脚本。
运行此命令后,Docker 会根据您构建的训练映像创建一个容器并运行它。容器运行 train
脚本,从而启动您的训练程序。
训练程序完成且容器退出后,请检查输出模型构件是否正确。此外,请检查日志输出以确认它们没有生成您不想要的日志,同时确保提供了有关训练作业的足够信息。
这样就完成了算法产品的训练代码打包。由于算法产品还包括推理映像,因此请继续下一部分 为算法创建推理映像。
为算法创建推理映像
本部分提供了将推理代码打包成算法产品的推理映像的演练。
推理映像是包含您的推理逻辑的 Docker 映像。容器在运行时会公开HTTP端点, SageMaker 以允许将数据传入和传出您的容器。
发布算法产品时,需要同时提供训练映像和推理映像。如果您尚未执行此操作,请参阅前面的部分为算法创建训练映像。这两个映像可以合并为一个映像,也可以作为单独的映像保留。是合并映像还是将它们分开由您决定。通常,推理比训练简单,您可能需要单独的映像来提高推理性能。
注意
以下只是推理映像打包代码的一个示例。有关更多信息,请参阅使用自己的算法和模型, AWS Marketplace并开启AWS Marketplace
SageMaker 示例
为了简单起见,以下示例使用了 Web 服务 Flask
步骤 1:创建推理映像
要使推理映像与之兼容 SageMaker,Docker 镜像必须公开HTTP端点。当您的容器运行时,SageMaker 会将买方提供的推理输入传递到容器的HTTP终端节点。推理结果将在HTTP响应正文中返回。
以下内容使用安装在开发环境中的 Docker,CLI安装在 Linux 的 Ubuntu 发行版上。
创建 Web 服务器脚本
此示例使用名为 Flask
注意
为了简单起见,这里使用 Flask
创建 Flask Web 服务器脚本,该脚本在使用的HTTP端TCP口 8080 上为两个端点提供服务。 SageMaker 以下是两个预期的端点:
-
/ping
— 向此端点 SageMaker 发出HTTPGET请求以检查您的容器是否已准备就绪。当您的容器准备就绪时,它会使用 HTTP 200 响应代码来响应此端点的HTTPGET请求。 -
/invocations
— 向此端点 SageMaker 发出HTTPPOST请求以进行推理。用于推理的输入数据在请求正文中发送。用户指定的内容类型在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 here. # # # # # # Add your inference code here. # Return a response with a prediction response = {"prediction":"a","text":input_str} return json.dumps(response)
在前面的示例中,没有实际的推理逻辑。对于实际的推理映像,请将推理逻辑添加到 Web 应用中,以便它处理输入并返回预测。
您的推理映像必须包含其所有必需的依赖项,因为它无法访问互联网。
为容器运行创建脚本
创建一个名为的脚本serve
,该脚本在 SageMaker 运行 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 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这样它就可以在容器运行时运行。
准备程序以动态加载模型构件
对于算法产品,买家使用自己的数据集和您的训练映像来生成独特的模型构件。训练过程完成后,您的训练容器会将模型工件输出到容器目录
/opt/ml/model/
。 SageMaker 将该目录中的内容压缩成.tar.gz 文件并将其存储在买家的 Amazon S3 中。 AWS 账户
部署模型时, SageMaker 运行您的推理图像,从 Amazon S3 中买家账户中存储的.tar.gz 文件中提取模型工件,然后将其加载到目录中的推理容器中。/opt/ml/model/
在运行时,您的推理容器代码使用模型数据。
注意
要保护可能包含在模型构件文件中的知识产权,您可以选择在输出前对文件加密。有关更多信息,请参阅 Amazon 的安全和知识产权 SageMaker。
第 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 \ --volume '<path_to_model>:/opt/ml/model:ro' \ --detach \ --name my-inference-container \ my-inference-image \ serve
以下是命令的详细信息:
-
--rm
– 容器停止后自动将其移除。 -
--publish 8080:8080/tcp
— 公开端口 8080 以模拟向其 SageMaker 发送HTTP请求的端口。 -
--volume '<path_to_model>:/opt/ml/model:ro'
–将测试模型构件在主机上存储的路径绑定挂载为只读,以便容器中的推理代码可以使用它们。 -
--detach
– 在后台运行容器。 -
--name my-inference-container
– 为正在运行的容器提供名称。 -
my-inference-image
– 运行构建的映像。 -
serve
— 运行容器时 SageMaker 运行相同的脚本。
运行此命令后,Docker 会根据推理映像创建一个容器并在后台运行它。容器运行 serve
脚本,该脚本会启动您的 Web 服务器以进行测试。
测试 ping HTTP 端点
SageMaker 运行您的容器时,它会定期对端点执行 ping 操作。 当端点返回状态码为 200 的HTTP响应时,它会发出信号 SageMaker ,表示容器已准备好进行推理。
运行以下命令以测试端点并包含响应头。
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
当容器通过返回 200 状态码表示已准备就绪时,通过POST
请求将推理数据 SageMaker 传递到/invocations
HTTP终端节点。
运行以下命令以测试推理端点。
curl \ --request POST \ --data "hello world" \ http://127.0.0.1:8080/invocations
示例输出如以下示例中所示:
{"prediction": "a", "text": "hello world"}
这两个HTTP端点正常工作后,推理图像现在与 SageMaker兼容。
注意
您的算法产品的模型可以通过两种方式部署:实时部署和批量部署。对于这两个部署,在运行 Docker 容器时 SageMaker 使用相同的HTTP端点。
要停止容器,请运行以下命令。
sudo docker container stop my-inference-container
算法产品的训练和推理映像都准备好并经过测试后,请继续将您的图片上传到 Amazon 弹性容器注册表。