如何使用Sagemaker部署预训练模型?

时间:2019-03-03 04:50:50

标签: android amazon-sagemaker

我有一个预先训练的模型,可以将文本从英语翻译成马拉地语。您可以在这里找到它...

git clone https://github.com/shantanuo/Word-Level-Eng-Mar-NMT.git

克隆并运行笔记本。我正在寻找一种部署它的方法,以便用户可以将其用作API

可在此处找到有关部署模型的准则... https://gitlab.com/shantanuo/dlnotebooks/blob/master/sagemaker/01-Image-classification-transfer-learning-cifar10.ipynb

我想知道部署模型的步骤。 可以为此创建一个Android应用吗?

2 个答案:

答案 0 :(得分:3)

好消息!因此,您在创建端点时已经部署了模型。确保不要在笔记本的末尾运行sage.delete_endpoint(EndpointName=endpoint_name)

现在,您可以通过command line或类似boto3的SDK来调用该端点。

要将其附加到公共API端点,我建议以类似于this tutorial的方式利用API网关,Lambda和Sagemaker。

API网关将处理托管和安全性/令牌(如果需要)。 http请求到达API网关后,它需要被指定的lambda捕获。 lambda的工作是验证传入的数据,调用Sagemaker端点并以正确的格式返回响应。

第1步:构建Lambda

要正确部署lambda,您将需要创建无服务器框架服务。

1)首先安装Serverless Framework

2)导航到您要存储API Gateway和Lambda文件的目录

3)在命令行中运行:

serverless create --template aws-python

4)创建一个名为lambdaGET.py的新文件,以将其部署在您的lambda中

lambdaGET.py

import os
import io
import boto3
import json
import csv

'''
endpoint_name here should be a string, the same as which was created
in your notebook on line:
           endpoint_name = job_name_prefix + '-ep-' + timestamp


'''
ENDPOINT_NAME = endpoint_name 

client = boto3.client('sagemaker-runtime')
# Or client = boto3.client('runtime.sagemaker') should also be acceptable

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))


    event = json.loads(json.dumps(event))
    # I recommend you verify the data here although it is not critical

    '''
    I'm assuming your going to attach this to a GET in which case the
    payload will be passed inside the "queryStringParameters"
    '''

    payload = event["queryStringParameters"]
    print(payload)


    response = client.invoke_endpoint(
                                      EndpointName=ENDPOINT_NAME,
                                      Body=payload,
                                      ContentType='application/x-image',
                                      Accept='Accept'
                                     )

    result = json.loads(response['Body'].read())
    print(result)

    '''
    After the lambda has obtained the results in needs to correctly 
    format them to be passed across the API Gateway
    '''

   response = {
                "isBase64Encoded": False,
                "statusCode": 200,
                "headers": {},
                "body": json.dumps(result)
        }



    return response

第2步:构建Serverless.yml

在此步骤中,您需要构建无服务器文件来部署lambda,API网关并将它们连接在一起。

service: Word-Level-Eng-Mar-NMT

provider:
  name: aws
  runtime: python2.7
  timeout: 30
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}
  profile: ${opt:profile, 'default'}
  apiName : Word-Level-Eng-Mar-NMT-${self:provider.stage}
  environment:
    region: ${self:provider.region}
    stage: ${self:provider.stage}
  stackTags:
    Owner : shantanuo
    Project : Word-Level-Eng-Mar-NMT
    Service : Word-Level-Eng-Mar-NMT
    Team : shantanuo
  stackPolicy: # This policy allows updates to all resources
    - Effect: Allow
      Principal: "*"
      Action: "Update:*"
      Resource: "*"

  iamRoleStatements:

    -  Effect: "Allow"
       Action:
         - "sagemaker:InvokeEndpoint"
       Resource:
         - "*"
# Note: Having * for the resource is highly frowned upon, you should change
# this to your acutal account number and EndpointArn when you get the chance


functions:
  lambdaGET:
    handler: lambdaGET.main
    events:
      - http:
          method: GET
          path: /translate
          resp: json

第3步:部署

1)在此步骤中,您需要install Serverless Framework

2)安装AWS commmand line

3)设置您的AWS configure

4)确保目录设置正确:    (lambdaGET.py和servless.yml应该在同一文件夹中)

```
-ServiceDirectory
 --- lambdaGET.py
 --- serverless.yml
```

5)导航到ServiceDirectory文件夹,然后在命令行中运行:

sls deploy

第4步:测试

您现在可以使用浏览器或诸如Postman之类的程序来调用您的API

所有服务API端点的基本URL可以在API网关>服务(在您的情况下为“ Word-Level-Eng-Mar-NMT”)>控制台中的控制台中找到

enter image description here

几乎在那里...现在您有了基本URL,需要添加我们在端点上放置的扩展名:/translate

现在,您可以将整个URL放置在Postman中,并发送与在笔记本中进行创建和测试时使用的有效负载相同的负载。您的情况将是文件 test.jpg

TAAA DA​​AA !!

如果您的模型正在处理文本或相对较小的包装尺寸的信息,这将是故事的结尾。现在,由于您尝试传递整个图像,因此可能超出了API网关的大小限制。在这种情况下,我们将需要创建一个替代计划,其中涉及将图像上传到公共位置(例如S3存储桶)并通过API传递URI。然后,lambda必须从存储桶中检索图像并调用模型。仍然可行,只是稍微复杂一点。

我希望这会有所帮助。

答案 1 :(得分:1)

将模型部署到SageMaker的基本思想是: 1)容器化您的模型。 2)将模型发布到ECR存储库,并授予SageMaker必要的权限。 3)调用CreateModel,CreateEndpointConfig和CreateEndpoint将模型部署到SageMaker。

在您训练模型的笔记本中,您没有使用任何SageMaker sdk自动将模型容器化,因此从头开始会更加复杂。 您可能会考虑使用以下任何带有keras的示例笔记本来将模型容器化: https://github.com/awslabs/amazon-sagemaker-examples