手把手教程 | 使用无服务器模板部署机器学习模型



在设计和训练机器学习模型后,数据科学家会部署这些模型,以便应用程序可以使用。Amazon Lambda 是一项让您在运行代码时无需预置或管理服务器的计算服务。Amazon Lambda 的按请求付费、自动扩展和易用性使其成为数据科学团队的热门部署选择。
Amazon Lambda
https://aws.amazon.com/cn/lambda/
数据科学家可以使用更少的代码就能将模型转变为由 Amazon Lambda 支持的经济高效且可扩展的 API 终端节点。Amazon Lambda 支持容器镜像、Advanced Vector Extensions 2(AVX2)和具有高达 10GB 内存的函数。使用这些函数,数据科学团队可以部署更大、更强的模型并提高性能。
要部署基于 Amazon Lambda 的应用程序,无服务器开发人员可以使用 Amazon Serverless Application Model(Amazon SAM)。Amazon SAM 基于模板创建和管理无服务器应用程序。它支持本地测试,旨在实现最佳实践,并可与流行的开发工具集成。它允许数据科学家使用 YAML 定义无服务器应用程序、安全权限和高级配置功能。
Amazon Serverless Application Model(Amazon SAM)
https://github.com/aws/serverless-application-model
Amazon SAM 包含可让开发人员快速入门的预构建模板。本博客展示了如何使用机器学习模板部署基于 Scikit-Learn 的模型,该模型可以分类从 0 到 9 的手写数字图像。部署到 Amazon Lambda 后,您可以通过一个 REST API 访问模型。
示例会在亚马逊云科技账户中创建会产生成本的资源。为了最大限度地降低成本,请在完成示例内容后按照最后的清理部分说明删除资源。

📢 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的 2021 亚马逊云科技中国峰会!点击图片报名吧~上海站峰会已经圆满落幕,更多精彩内容,敬请期待北京、深圳分会吧!
概览
Amazon SAM 机器学习模板可用于 Scikit-Learn、PyTorch、TensorFlow 和 XGBoost 框架。每个模板都部署一个 Amazon Lambda 函数来管理 Amazon API Gateway 网管后面的模型,该网关作为前端并处理身份验证。下图显示了这个解决方案的架构:

机器学习推理的无服务器架构
Amazon API Gateway 网管
https://aws.amazon.com/cn/api-gateway/
创建容器化 Amazon Lambda 函数
本节将使用 Amazon SAM 在 Amazon Lambda 上构建、测试和部署包含预先训练的数字分类器模型的 Docker 镜像:
更新或安装 Amazon SAM,使用机器学习模板需要 Amazon SAM CLI v1.24.1 或更高版本。
在终端中,使用以下命令在 Amazon SAM 中创建新的无服务器应用程序:sam init
按照屏幕上的提示,选择 Amazon 快速入门模板作为模板来源。

Amazon SAM:选择模板来源
选择镜像作为打包类型。

Amazon SAM:选择封装类型
选择 amazon/python3.8-base 作为基础镜像。

Amazon SAM:选择运行时镜像
出现提示时,输入应用程序名称。Amazon SAM 使用它对其创建的资源进行分组和打标签。

Amazon SAM:选择运行时镜像
从模板列表中选择所需的机器学习框架,本示例使用 Scikit-Learn 模板。

Amazon SAM:选择应用程序模板
Amazon SAM 使用您的应用程序名称创建一个目录,切换到新目录并运行 Amazon SAM 生成命令:sam build

Amazon SAM:构建结果
由 Amazon SAM 生成的文件
选择模板后,Amazon SAM 将在应用程序目录中生成以下文件:
Dockerfile:该应用程序使用 Amazon Lambda 提供的 Python 3.8 基础镜像。它已经安装了相关的依赖项并为 Amazon Lambda 执行环境定义了 CMD 变量以初始化处理程序。
app.py:这段 Python 代码在调用 Amazon Lambda 处理程序后运行,并会从 Scikit-Learn 模型中生成预测结果。通过在 Amazon lambda_handler 之外加载模型,可在多个 Amazon Lambda 调用中重复使用该模型。
完成这些步骤后,目录结构如下所示:

文件结构
测试 Amazon SAM 模板
对于基于容器镜像的 Amazon Lambda 函数,Amazon sam build 会在本地 Docker 存储库中创建和更新容器镜像。它将模板复制到输出目录并更新新建镜像的位置。
您可以在 amazon-sam 目录下看到以下顶层目录树结构:

Amazon SAM 构建构件目录结构
构建 Docker 镜像后,使用 Amazon SAM 的本地测试功能测试终端节点。有两种方法可以在本地测试应用程序:
本地调用 — 事件使用 event.json 中的模拟数据来调用函数并生成预测。手写数字的图像被编码为 event.json 文件中 body 属性中的 base64 字符串。使用 event.json 模拟数据进行测试:

Amazon SAM 本地调用结果
通过 start-api 命令启动一个模拟 REST API 终端节点的本地终端节点。它会下载一个在本地运行 API Gateway 和 Amazon Lambda 函数的执行容器。使用 API Gateway 模拟器调用:sam local start-api

Amazon SAM 本地 start-api 监控
要测试本地端点,请使用 Postman 等 REST API 客户端向/classify_digit 终端节点发送 POST 请求。
Postman

用 Postman 进行测试
在本地测试时,请使用小于 100 KB 的图像。如果文件较大,请求会失败并显示状态代码 502,错误信息为“argument list too long”(参数列表过长)。但是在部署到 Amazon Lambda 之后,您可以使用更大的图像。
部署应用程序到 Amazon Lambda
在本地测试模型后,使用 Amazon SAM 引导式部署流程打包和部署应用程序:
要基于容器镜像部署 Amazon Lambda 函数,必须将容器镜像推送到 Amazon Elastic Container Registry(ECR)。运行以下命令以检索身份验证令牌并使用 ECR 注册表对 Docker 客户端进行身份验证。将 region 和 accountID 占位符替换为您的区域和亚马逊云科技账户 ID:
Amazon Elastic Container Registry(ECR)
https://aws.amazon.com/cn/ecr/

登录成功
使用 Amazon CLI 创建一个名为 classifier-demo 的 ECR 存储库:

创建 ECR 存储库结果
从输出中复制 repositoryUri,我们在下一步中将会用到。使用 deploy 命令启动 Amazon SAM 引导式部署:sam deploy --guided
按照屏幕上的提示进行操作。要接受互动体验中提供的默认选项,请按 Enter 键。当系统提示输入 ECR 存储库时,请使用在上一步中创建的 Amazon ECR 存储库。

CloudFormation 更改集验证截图

CloudFormation 输出
Amazon SAM 将应用程序打包并部署为带有版本控制的实体。部署后,生产 API 终端节点就可以使用了。该模板会生成多个输出,在“Outputs”部分的“HelloWorldAPI”键中可以找到终端节点的 URL。
找到 URL 后,使用 REST 客户端测试实时终端节点:

用 Postman 进行测试
优化性能
部署 Amazon Lambda 函数后,您可以针对延迟和成本进行优化。为此,请调整函数的内存分配设置,这也会线性更改分配的 vCPU(要了解更多信息,请阅读亚马逊云科技新闻博客)。
亚马逊云科技新闻博客
数字分类器模型使用 5GB 内存(约 3 个 vCPU)进行了优化。超过 5GB 的任何收益都相对较小。每个模型对 vCPU 和内存的变化的响应不同,因此最佳做法是通过实验来确定这一点。这部分有开源工具可用于自动调整性能。
开源工具
https://github.com/alexcasalboni/aws-lambda-power-tuning
可以通过编译源代码以利用 AVX2 指令进行进一步优化。AVX2 允许 Amazon Lambda 在每个时钟周期运行更多操作,从而减少了模型生成预测所需的时间。
利用 AVX2 指令
https://aws.amazon.com/cn/blogs/compute/creating-faster-aws-lambda-functions-with-avx2/
清理
上述示例创建了 Amazon Lambda 函数、API Gateway 终端节点和 ECR 存储库。这些资源会产生费用,因此建议清理资源以避免产生额外的成本。要删除 ECR 存储库,请运行:
要删除剩余资源,请导航到亚马逊云科技管理控制台中的 Amazon CloudFormation,然后选择用于示例的区域。选择 Amazon SAM 创建的堆栈(默认为“sam-app”),然后选择 Delete(删除)。
Amazon CloudFormation
https://aws.amazon.com/cn/cloudformation/
结论
对于数据科学家来说,要部署基于 CPU 的机器学习模型进行推理,Amazon Lambda 是一种经济高效、可扩展且可靠的方式。凭借对更大的函数大小、AVX2 指令集和容器镜像的支持,Amazon Lambda 现在可以部署更复杂的模型,同时保持低延迟。
欢迎使用 Amazon SAM 中新的机器学习模板,在数分钟内部署您的第一个无服务器机器学习应用程序吧。我们期待看到您在 Amazon Lambda 上构建的激动人心的机器学习应用程序。
有关更多无服务器学习资源,请访问 Serverless Land。
Serverless Land
本篇作者
Sean Wilkinson
亚马逊云科技机器学习专家解决方案架构师
Newton Jain
亚马逊云科技 Amazon Lambda 高级产品经理

评论