AWS lambda. 部署

这是将FastAi模型部署到生产中的快速指南 亚马逊API网关 & AWS lambda. 。本指南将使用 无要的应用程序模型(SAM) 作为构建应用程序的框架,它将与Lambda和API Gateway AWS服务更换。

AWS lambda. 允许您在不提供或管理服务器的情况下运行代码。您只需支付您消耗的计算时间 - 当代码未运行时,禁止收费。

亚马逊API网关 是一个完全托管的服务,可轻松在任何比例中创建,发布,维护,监视和安全的API。

价钱

AWS lambda. ,您只需支付您使用的内容。根据您的功能的请求数和持续时间,您的代码执行所需的时间收取。有关AWS Lambda定价结帐的更多信息 这里 .

亚马逊API网关,您只需在您使用的API时付款。对于HTTP / REST API,您只需支付您收到的API调用以及传输的数据量。有关定价的更多细节可用 这里 .

要求

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

准备步骤

创建S3桶

First, we need a S3 bucket where we can upload our model artefacts as well as our Lambda functions/layers packaged as ZIP files before we deploy anything - If you don’t have a S3 bucket to store model and code artifacts then this is a good time to create one:

aws s3 mb s3://REPLACE_WITH_YOUR_BUCKET_NAME

导出培训的模型并上传到S3

你需要从普拉特·笔记本服务器上开始使用预用模型。 SAM应用程序期望一个Pytorch模型 Torchscript. 格式要保存到S3以及具有输出类名的类文本文件。

一个示例Python代码片段如何导出Fastai Vision模型如下所示。

# export model to TorchScript format
trace_input = torch.ones(1,3,299,299).cuda()
jit_model = torch.jit.trace(learn.model.float(), trace_input)
model_file='resnet50_jit.pth'
output_path = str(path_img/f'models/{model_file}')
torch.jit.save(jit_model, output_path)
# export classes text file
save_texts(path_img/'models/classes.txt', data.classes)
tar_file=path_img/'models/model.tar.gz'
classes_file='classes.txt'
# create a tarfile with the exported model and classes text file
with tarfile.open(tar_file, 'w:gz') as f:
    f.add(path_img/f'models/{model_file}', arcname=model_file)
    f.add(path_img/f'models/{classes_file}', arcname=classes_file)

现在我们准备将模型人工制品上传到S3。

import boto3
s3 = boto3.resource('s3')
# replace 'mybucket' with the name of your S3 bucket
s3.meta.client.upload_file(tar_file, 'REPLACE_WITH_YOUR_BUCKET_NAME', 'fastai-models/lesson1/model.tar.gz')

培训模型的一个完整示例,将其导出到JIT格式并基于上传到S3 第1课 能够被找到的 这里 .

抓住SAM示例项目

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

wget //github.com/fastai/course-v3/raw/master/docs/production/aws-lambda.zip

unzip aws-lambda.zip

申请概述

示例应用程序在计算机视觉模型上进行推理调用。加载Lambda函数时,它将从S3下载Pytorch模型并将模型加载到内存中。

它将JSON对象作为输入包含Internet上某处的图像的URL。应用程序下载图像,将像素转换为Pytorch Tensor对象,并通过Pytorch模型。然后,它从模型中返回具有最高输出分数的类名,并返回置信水平。

本申请的结构如下:

.
├── event.json          <-- Event payload for local testing
├── pytorch             <-- Folder for source code
│   ├── __init__.py
│   ├── app.py          <-- Lambda function code
└──template.yaml        <-- SAM Template

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

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

请求正文格式

Lambda函数预计将输入包含图像URL的JSON String Body来分类。

例子:

{
    "url": "REPLACE_THIS_WITH_AN_IMAGE_URL"
}

响应格式

Lambda函数将返回包含状态代码的JSON对象(例如成功的200. 200),并且在身体上是预测的课程和信心评分。

例子:

{
    "statusCode": 200,
    "body": {
        "class": "english_cocker_spaniel",
        "confidence": 0.99
    }
}

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

lambda层

您可以将Lambda函数配置为以额外的代码和内容以 lambda层。图层是一个zip存档,包含库,自定义运行时或其他依赖项。使用图层,您可以在功能中使用库中的库,而无需将它们包含在部署包中。

在此项目中,我们将使用一个可公开访问的lambda图层,其中包含运行我们应用程序所需的必需的Pytorch库。这些层部署到以下区域: 美国西 - 2,US-East-1,Us-East-2,Eu-West-1,AP-Southeast-1,AP-Shorteast-2,AP-Northeast-1,Eu-Central-1。默认区域是 美东-1 。有2个版本的Pytorch Lambda层,具有不同版本的Pytorch,如下表所示。

层Arn. Pytorch版本
ARN:AWS:Lambda:AWS_REGION:934676248949:图层:PYTORCHV1-PY36:1 Pytorch 1.0.1.
ARN:AWS:Lambda:AWS_REGION:934676248949:图层:PYTORCHV1-PY36:2 Pytorch 1.1.0.

如果您未在默认区域中运行模型(即,即 美东-1 ) You will need to update the file template.yaml with the correct region code by replacing the text AWS_REGION with the correct region (e.g. us-west-2).

...
  LambdaLayerArn:
    Type: String
    Default: "ARN:AWS:Lambda:AWS_REGION:934676248949:图层:PYTORCHV1-PY36:2"
        ...

本地发展

创建测试lambda环境变量

First create a file called env.json with the payload similar to the following substituting the values for the S3 Bucket and Key where your PyTorch model has been uploaded to S3 in the earlier step.

{
    "PyTorchFunction": {
      "MODEL_BUCKET": "REPLACE_WITH_YOUR_BUCKET_NAME",  
      "MODEL_KEY": "fastai-models/lesson1/model.tar.gz"      
    }
}

使用本地示例有效载荷在本地调用功能

Edit the file named event.json and enter a value for the JSON value url to the image you want to classify.

调用以下SAM命令以在本地测试功能。

sam local invoke PyTorchFunction -n env.json -e event.json

If you are modifying your expected request body for your application then also modify the file event.json to match the correct input format.

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

sam local start-api -n env.json

如果以前的命令已成功运行,您现在应该能够向本地端点发送POST请求。

计算机视觉应用程序的示例如下:

curl -d "{\"url\":\"REPLACE_THIS_WITH_AN_IMAGE_URL\"}" \
    -H "Content-Type: application/json" \
    -X POST http://localhost:3000/invocations

萨姆Cli. is used to emulate both Lambda and API Gateway locally and uses our template.yaml to understand how to bootstrap this environment (runtime, where the source code is, etc.) - The following excerpt is what the CLI will read in order to initialize an API and its routes:

...
Events:
    PyTorch:
        Type: Api # More info about API Event Source: //github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
        Properties:
            Path: /invocations
            Method: post

包装和部署

AWS lambda. Python runtime requires a flat folder with all dependencies including the application. SAM will use CodeUri property to know where to look up for both application and dependencies:

...
    PyTorchFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: pytorch/
            ...

接下来,运行以下命令将我们的lambda函数打包为s3:

sam package \
    --output-template-file packaged.yaml \
    --s3-bucket REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME

Next, the following command will create a Cloudformation Stack and deploy your SAM resources. You will need to override the default parameters for the bucket name and object key. This is done by passing the --parameter-overrides option to the deploy command as shown below.

sam deploy \
    --template-file packaged.yaml \
    --stack-name pytorch-sam-app \
    --capabilities CAPABILITY_IAM \
    --parameter-overrides BucketName=REPLACE_WITH_YOUR_BUCKET_NAME ObjectKey=fastai-models/lesson1/model.tar.gz

无服务器应用模型(SAM)HOWTO指南 有关如何开始的更多详细信息。

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

aws cloudformation describe-stacks \
    --stack-name pytorch-sam-app \
    --query 'Stacks[].Outputs[?OutputKey==`PyTorchApi`]' \
    --output table

获取,尾和过滤Lambda函数日志

为了简化故障排除,SAM CLI具有名为SAM日志的命令。 SAM日志允许您从命令行使用Lambda函数生成的日志。除了在终端上打印日志,此命令还有几个漂亮的功能,可以帮助您快速找到错误。

NOTE:此命令适用于所有AWS Lambda功能;不仅仅是您使用SAM部署的那些。

sam logs -n PyTorchFunction --stack-name pytorch-sam-app --tail

您可以找到有关过滤Lambda函数日志的更多信息和示例 萨姆CLI文档.

清理

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

aws cloudformation delete-stack --stack-name pytorch-sam-app