我有一个预先训练的模型,可以将文本从英语翻译成马拉地语。您可以在这里找到它...
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应用吗?
答案 0 :(得分:3)
好消息!因此,您在创建端点时已经部署了模型。确保不要在笔记本的末尾运行sage.delete_endpoint(EndpointName=endpoint_name)
!
现在,您可以通过command line或类似boto3的SDK来调用该端点。
要将其附加到公共API端点,我建议以类似于this tutorial的方式利用API网关,Lambda和Sagemaker。
API网关将处理托管和安全性/令牌(如果需要)。 http请求到达API网关后,它需要被指定的lambda捕获。 lambda的工作是验证传入的数据,调用Sagemaker端点并以正确的格式返回响应。
要正确部署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
在此步骤中,您需要构建无服务器文件来部署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
1)在此步骤中,您需要install Serverless Framework
3)设置您的AWS configure
4)确保目录设置正确: (lambdaGET.py和servless.yml应该在同一文件夹中)
```
-ServiceDirectory
--- lambdaGET.py
--- serverless.yml
```
5)导航到ServiceDirectory文件夹,然后在命令行中运行:
sls deploy
您现在可以使用浏览器或诸如Postman之类的程序来调用您的API
所有服务API端点的基本URL可以在API网关>服务(在您的情况下为“ Word-Level-Eng-Mar-NMT”)>控制台中的控制台中找到
几乎在那里...现在您有了基本URL,需要添加我们在端点上放置的扩展名:/translate
现在,您可以将整个URL放置在Postman中,并发送与在笔记本中进行创建和测试时使用的有效负载相同的负载。您的情况将是文件
test.jpg
如果您的模型正在处理文本或相对较小的包装尺寸的信息,这将是故事的结尾。现在,由于您尝试传递整个图像,因此可能超出了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