乐趣区

关于ml:手把手教程-使用无服务器模板部署机器学习模型

在设计和训练机器学习模型后,数据科学家会部署这些模型,以便应用程序能够应用。Amazon Lambda 是一项让您在运行代码时无需预置或治理服务器的计算服务。Amazon Lambda 的按申请付费、主动扩大和易用性使其成为数据迷信团队的热门部署抉择。

  • Amazon Lambda
    https://aws.amazon.com/cn/lam…

数据科学家能够应用更少的代码就能将模型转变为由 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/server…

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…

创立容器化 Amazon Lambda 函数

本节将应用 Amazon SAM 在 Amazon Lambda 上构建、测试和部署蕴含事后训练的数字分类器模型的 Docker 镜像:

  1. 更新或装置 Amazon SAM,应用机器学习模板须要 Amazon SAM CLI v1.24.1 或更高版本。
  2. 在终端中,应用以下命令在 Amazon SAM 中创立新的无服务器应用程序:sam init
  3. 依照屏幕上的提醒,抉择 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 变量以初始化处理程序。
FROM public.ecr.aws/lambda/python:3.8

COPY app.py requirements.txt ./

COPY digit_classifier.joblib /opt/ml/model/1

RUN python3.8 -m pip install -r requirements.txt -t .

CMD ["app.lambda_handler"]
  • app.py: 这段 Python 代码在调用 Amazon Lambda 处理程序后运行,并会从 Scikit-Learn 模型中生成预测后果。通过在 Amazon lambda_handler 之外加载模型,可在多个 Amazon Lambda 调用中重复使用该模型。
import joblib
import base64
import numpy as np
import json

from io import BytesIO
from PIL import Image
from scipy.ndimage import interpolation

model_file = '/opt/ml/model'
model = joblib.load(model_file)
# Functions to pre-process images (we used same preprocessing when training)

def moments(image):
    c0, c1 = np.mgrid[:image.shape[0], :image.shape[1]]
    img_sum = np.sum(image)

    m0 = np.sum(c0 * image) / img_sum
    m1 = np.sum(c1 * image) / img_sum
    m00 = np.sum((c0-m0)**2 * image) / img_sum
    m11 = np.sum((c1-m1)**2 * image) / img_sum
    m01 = np.sum((c0-m0) * (c1-m1) * image) / img_sum

    mu_vector = np.array([m0,m1])
    covariance_matrix = np.array([[m00, m01],[m01, m11]])

    return mu_vector, covariance_matrix

def deskew(image):
    c, v = moments(image)
    alpha = v[0,1] / v[0,0]
    affine = np.array([[1,0], [alpha,1]])
    ocenter = np.array(image.shape) / 2.0
    offset = c - np.dot(affine, ocenter)
    return interpolation.affine_transform(image, affine, offset=offset)

def get_np_image(image_bytes):
    image = Image.open(BytesIO(base64.b64decode(image_bytes))).convert(mode='L')
    image = image.resize((28, 28))
    return np.array(image)

# Lambda handler code

def lambda_handler(event, context):
    image_bytes = event['body'].encode('utf-8')
    x = deskew(get_np_image(image_bytes))
    prediction = int(model.predict(x.reshape(1, -1))[0])
    return {
        'statusCode': 200,
        'body': json.dumps(
            {"predicted_label": prediction,}
        )
    }
  • 实现这些步骤后,目录构造如下所示:


文件构造

测试 Amazon SAM 模板

对于基于容器镜像的 Amazon Lambda 函数,Amazon sam build 会在本地 Docker 存储库中创立和更新容器镜像。它将模板复制到输入目录并更新新建镜像的地位。

您能够在 amazon-sam 目录下看到以下顶层目录树结构:


Amazon SAM 构建构件目录构造

构建 Docker 镜像后,应用 Amazon SAM 的本地测试功能测试终端节点。有两种办法能够在本地测试应用程序:

  • 本地调用 — 事件应用 event.json 中的模仿数据来调用函数并生成预测。手写数字的图像被编码为 event.json 文件中 body 属性中的 base64 字符串。应用 event.json 模仿数据进行测试:
sam local invoke InferenceFunction --event events/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
    https://www.postman.com


用 Postman 进行测试

在本地测试时,请应用小于 100 KB 的图像。如果文件较大,申请会失败并显示状态代码 502,错误信息为“argument list too long”(参数列表过长)。然而在部署到 Amazon Lambda 之后,您能够应用更大的图像。

部署应用程序到 Amazon Lambda

在本地测试模型后,应用 Amazon SAM 疏导式部署流程打包和部署应用程序:

  1. 要基于容器镜像部署 Amazon Lambda 函数,必须将容器镜像推送到Amazon Elastic Container Registry(ECR)。运行以下命令以检索身份验证令牌并应用 ECR 注册表对 Docker 客户端进行身份验证。将 region 和 accountID 占位符替换为您的区域和亚马逊云科技账户 ID:
aws --region <region> ecr get-login-password | docker login --username AWS --password-stdin <accountID>.dkr.ecr.<region>.amazonaws.com
  • Amazon Elastic Container Registry(ECR)
    https://aws.amazon.com/cn/ecr/


登录胜利

  • 应用 Amazon CLI 创立一个名为 classifier-demo 的 ECR 存储库:
aws ecr create-repository \

--repository-name classifier-demo \

--image-tag-mutability MUTABLE \

--image-scanning-configuration scanOnPush=true


创立 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(要理解更多信息,请浏览 亚马逊云科技新闻博客)。

  • 亚马逊云科技新闻博客
    https://aws.amazon.com/cn/blo…

数字分类器模型应用 5GB 内存 (约 3 个 vCPU) 进行了优化。超过 5GB 的任何收益都绝对较小。每个模型对 vCPU 和内存的变动的响应不同,因而最佳做法是通过试验来确定这一点。这部分有 开源工具 可用于主动调整性能。

  • 开源工具
    https://github.com/alexcasalb…

能够通过编译源代码以 利用 AVX2 指令 进行进一步优化。AVX2 容许 Amazon Lambda 在每个时钟周期运行更多操作,从而缩小了模型生成预测所需的工夫。

  • 利用 AVX2 指令
    https://aws.amazon.com/cn/blo…

清理

上述示例创立了 Amazon Lambda 函数、API Gateway 终端节点和 ECR 存储库。这些资源会产生费用,因而倡议清理资源以防止产生额定的老本。要删除 ECR 存储库,请运行:

aws ecr delete-repository --registry-id <account-id> --repository-name classifier-demo --force

要删除残余资源,请导航到亚马逊云科技治理控制台中的Amazon CloudFormation,而后抉择用于示例的区域。抉择 Amazon SAM 创立的堆栈(默认为“sam-app”),而后抉择 Delete(删除)。

  • Amazon CloudFormation
    https://aws.amazon.com/cn/clo…

论断

对于数据科学家来说,要部署基于 CPU 的机器学习模型进行推理,Amazon Lambda 是一种经济高效、可扩大且牢靠的形式。凭借对更大的函数大小、AVX2 指令集和容器镜像的反对,Amazon Lambda 当初能够部署更简单的模型,同时放弃低提早。

欢送应用 Amazon SAM 中新的机器学习模板,在数分钟内部署您的第一个无服务器机器学习应用程序吧。咱们期待看到您在 Amazon Lambda 上构建的激动人心的机器学习应用程序。

无关更多无服务器学习资源,请拜访Serverless Land

  • Serverless Land
    https://serverlessland.com

本篇作者

Sean Wilkinson
亚马逊云科技机器学习专家解决方案架构师

Newton Jain
亚马逊云科技 Amazon Lambda 高级产品经理

退出移动版