AWSλ部署

这是一个快速部署fastai模型到生产使用的指南亚马逊API网关AWSλ。本指南将使用无服务器应用模型(SAM)作为构建应用程序的框架,它将与Lambda和API网关AWS服务交互。

AWSλ让您运行代码而无需供应或管理服务器。您只需要为您所使用的计算时间付费—当您的代码不运行时,没有任何费用。

亚马逊API网关是完全托管服务,使开发人员可以轻松创建,发布,维护,监控和安全的API在任何规模。

定价

AWSλ在美国,你只需要为你使用的东西付费。您将根据函数的请求数量和持续时间(代码执行所花费的时间)来收费。欲了解更多AWS Lambda定价信息,请访问该页面在这里

亚马逊API网关,你只有当你的API是在使用中支付。对于HTTP / REST的API,您只需支付收到的API调用和数据传输量出来。对定价的更多详情,可在这里

需求

您需要在本地机器上安装以下应用程序。

准备步骤

创建S3桶

首先,我们需要一个S3 bucket在我们部署任何东西之前,我们可以上传我们的模型产品以及我们的Lambda函数/层打包成ZIP文件-如果你没有S3存储模型和代码工件,那么现在是创建一个的好时机:

AWS S3 MB S3:// REPLACE_WITH_YOUR_BUCKET_NAME

导出您的训练模型,并上传到S3

你需要从一个预先训练好的模型开始,最有可能是在木星笔记本服务器上。SAM应用程序需要一个PyTorch模型TorchScript格式与输出的类别名称的类文本文件一起保存到S3。

下面显示了一个如何导出fastai视觉模型的示例Python代码片段。

#出口模式TorchScript格式trace_input=火炬那些13299299)。CUDA()jit_model=火炬jit跟踪学习模型浮动(),trace_inputmodel_file=“resnet50_jit.pth”output_path=海峡path_img/f'models /{model_file}火炬jit保存jit_modeloutput_path#出口类文本文件save_textspath_img/“模型/ classes.txt”数据tar_file=path_img/“模型/ model.tar.gz”classes_file='classes.txt'#创建与导出的模型和类文本文件中的tar文件tar文件打开tar_filew:广州的FFpath_img/f'models /{model_file}arcname=model_fileFpath_img/f'models /{classes_file}arcname=classes_file

现在,我们已经准备好模型文物上传到S3。

进口boto3S3=boto3资源'S3'#替换'mybucket'为你的S3桶的名字S3客户upload_filetar_file'REPLACE_WITH_YOUR_BUCKET_NAME''fastai的模型/ 2014/07/23 / model.tar.gz'

一个完整的培训模型的例子,导出到JIT格式,并基于上传到S3第一课可以被找寻到在这里

获取SAM示例项目

我们将使用SAM来部署我们的应用程序。首先我们需要下载使用下面的命令示例项目。

wget的https://github.com/fastai/course-v3/raw/master/docs/production/aws-lambda.zip解压aws-lambda.zip

应用程序概述

示例应用程序对计算机视觉模型进行推理调用。当lambda函数被加载时,它将从S3下载PyTorch模型并将模型加载到内存中。

它需要一个JSON对象作为包含在互联网上的图像某处的URL输入。应用程序下载图像,像素转换成PyTorch张量对象,并通过PyTorch模型传递给它。然后,它返回从模型中最高的输出得分类的名称,也返回的置信度。

这个应用程序的结构如下:

├──事件。json <--事件负载对于当地的├──pytorch <--文件夹对于资源│├─rammstein - du hast(2)——cat sound效果器整理www.catsound.py--LAMBDA函数代码└──模板。yaml <--山姆模板

有关SAM模板的信息,请查看文档在这里

有关使用Python编程语言编程Lambda函数的信息,请参阅文档在这里

请求主体格式

Lambda函数期望输入一个JSON字符串体,其中包含要分类的图像的URL。

例子:

{“url”“REPLACE_THIS_WITH_AN_IMAGE_URL”}

响应格式

lambda函数将返回包含一个状态码(例如200为成功)和在主体中的预测的类和置信度得分JSON对象。

例子:

{“statusCode”200“身体”{“类”“english_cocker_spaniel”“置信度”0.99}}

您可以修改根据您的应用程序文件采取不同的输入/输出格式。

LAMBDA层

您可以配置Lambda函数以以。的形式拉入额外的代码和内容λ层。阿层是包含库,定制运行时,或其它依赖关系的ZIP文件。有了图层,你可以用你的函数库,而无需将其包含在您的部署包。

在这个项目中,我们将使用一个公共可访问的Lambda层,其中包含运行我们的应用程序所需的PyTorch库。这些层被部署到以下区域:美西2,美东1,美国东-2,EU-西-1,AP-东南-1,AP-东南-2,AP-东北-1,欧盟 - 中部 - 1。默认区域为us-east-1。有2个版本与表中的以下所示的不同版本PyTorch的PyTorch拉姆达层。

层ARN PyTorch版本
ARN:AWS:拉姆达:AWS_REGION:934676248949:层:pytorchv1-py36:1 PyTorch 1.0.1
ARN:AWS:拉姆达:AWS_REGION:934676248949:层:pytorchv1-py36:2 PyTorch 1.1.0

如果您没有在默认区域运行你的模型(即us-east-1你需要更新这个文件template.yaml通过替换文本的正确区域码AWS_REGION使用正确的区域(例如us-west-2)。

...LambdaLayerArn类型默认的ARN:AWS:拉姆达:AWS_REGION:934676248949:层:pytorchv1-py36:2"...

地方发展

创建测试Lambda环境变量

首先创建一个名为的文件env.json在前面的步骤中,将PyTorch模型上传到S3的S3 Bucket和Key的值替换为与下面类似的负载。

{“PyTorchFunction”{“MODEL_BUCKET”“REPLACE_WITH_YOUR_BUCKET_NAME”“MODEL_KEY”“fastai-models / lesson1 / model.tar.gz”}}

本地使用本地采样有效载荷调用函数

编辑命名的文件event.json并为JSON值输入值url到图像要分类。

调用下面的sam命令在本地测试功能。

山姆当地的调用PyTorchFunction- nenv.json- eevent.json

如果您正在为您的应用程序修改预期的请求体,那么也要修改文件event.json匹配正确的输入格式。

通过本地API网关在本地调用函数

山姆当地的start-api- nenv.json

如果前一个命令成功运行,您现在应该能够向本地端点发送post请求。

计算机视觉应用的一个例子如下:

卷曲- d“{\”url\”\”REPLACE_THIS_WITH_AN_IMAGE_URL\”}”\- h“内容类型:应用程序/ JSON”\- x文章http://localhost: 3000 /调用

SAM CLI用于在本地同时仿真Lambda和API网关,并使用我们的template.yaml为了理解如何引导这个环境(运行时,源代码在哪里,等等)-以下摘录是CLI为了初始化一个API和它的路由将读取的内容:

...事件PyTorch类型Api#关于API事件源更多信息:https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api属性路径/调用方法岗位

打包和部署

AWS Lambda Python运行时需要一个包含所有依赖项(包括应用程序)的平面文件夹。山姆将使用CodeUri属性知道去哪里找了两个应用和依赖关系:

...PyTorchFunction类型AWS ::无服务器::功能属性CodeUripytorch /...

接下来,运行以下命令来包装我们的LAMBDA功能S3:

SAM包\--output模板文件packaged.yaml\--s3斗REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME

接下来,以下命令将创建一个Cloudformation栈和部署SAM资源。你需要覆盖默认参数铲斗名称和对象的关键。这是通过将完成--parameter,覆盖选择到部署如下图所示命令。

SAM部署\——模板文件packaged.yaml\——stack-namepytorch-SAM-应用\——功能CAPABILITY_IAM\--parameter,覆盖BucketName=REPLACE_WITH_YOUR_BUCKET_NAMEObjectKey=fastai-models / lesson1 / model.tar.gz

看到无服务器应用模型(SAM)指南对于如何开始的更多细节。

部署完成后,您可以运行以下命令来检索API网关端点URL:

aws cloudformation describe-stacks\——stack-namepytorch-SAM-应用\--query'叠[]输出[?OutputKey ==`PyTorchApi`]'。\——输出表格

Fetch, tail和filter Lambda函数日志

为了简化故障排除,SAM CLI有一个名为SAM logs的命令。sam logs允许您从命令行获取Lambda函数生成的日志。除了在终端上打印日志之外,这个命令还有几个漂亮的特性可以帮助您快速找到错误。

请注意:该命令适用于所有AWS lambda函数;不只是那些部署使用SAM。

SAM日志- nPyTorchFunction——stack-namepytorch-SAM-应用- 尾巴

中可以找到关于过滤Lambda函数日志的更多信息和示例SAM文件CLI

清理

为了删除我们最近部署的无服务器应用程序,您可以使用以下AWS CLI命令:

AWS cloudformation删除堆栈——stack-namepytorch-SAM-应用