相关文章推荐
坚强的茶叶  ·  北京科技大学文法学院·  2 月前    · 
骑白马的豆芽  ·  深圳北理莫斯科大学·  10 月前    · 

如何为AWS Sagemaker托管的自定义Tensorflow模型使用多种输入

1 人关注

我有一个训练有素的Tensorflow模型,它使用两个输入来进行预测。我已经成功地在AWS Sagemaker上设置并部署了该模型。

from sagemaker.tensorflow.model import TensorFlowModel
sagemaker_model = TensorFlowModel(model_data='s3://' + sagemaker_session.default_bucket() 
                              + '/R2-model/R2-model.tar.gz',
                             role = role,
                             framework_version = '1.12',
                             py_version='py2',
                             entry_point='train.py')
predictor = sagemaker_model.deploy(initial_instance_count=1,
                              instance_type='ml.m4.xlarge')
predictor.predict([data_scaled_1.to_csv(),
                   data_scaled_2.to_csv()]

我总是收到一个错误。我可以使用AWS Lambda函数,但我没有看到任何关于为部署的模型指定多个输入的文档。有谁知道如何做到这一点?

python
amazon-web-services
tensorflow
amazon-sagemaker
JHall651
JHall651
发布于 2019-06-07
3 个回答
Slim Frikha
Slim Frikha
发布于 2019-06-29
已采纳
0 人赞同

你需要在部署模型时首先实际建立一个正确的签名。 此外,你还需要用tensorflow服务进行部署。

在推理时,你还需要在请求时给出一个合适的输入格式:基本上,sagemaker docker服务器会接受请求的输入,并将其传递给tensorflow服务。所以,输入的内容需要符合 TF serving inputs .

下面是一个简单的例子,在Tensorflow服务中使用Sagemaker部署Keras多输入多输出模型,以及之后如何进行推理。

import tarfile
from tensorflow.python.saved_model import builder
from tensorflow.python.saved_model.signature_def_utils import predict_signature_def
from tensorflow.python.saved_model import tag_constants
from keras import backend as K
import sagemaker
#nano ~/.aws/config
#get_ipython().system('nano ~/.aws/config')
from sagemaker import get_execution_role
from sagemaker.tensorflow.serving import Model
def serialize_to_tf_and_dump(model, export_path):
    serialize a Keras model to TF model
    :param model: compiled Keras model
    :param export_path: str, The export path contains the name and the version of the model
    :return:
    # Build the Protocol Buffer SavedModel at 'export_path'
    save_model_builder = builder.SavedModelBuilder(export_path)
    # Create prediction signature to be used by TensorFlow Serving Predict API
    signature = predict_signature_def(
        inputs={
            "input_type_1": model.input[0],
            "input_type_2": model.input[1],
        outputs={
            "decision_output_1": model.output[0],
            "decision_output_2": model.output[1],
            "decision_output_3": model.output[2]
    with K.get_session() as sess:
        # Save the meta graph and variables
        save_model_builder.add_meta_graph_and_variables(
            sess=sess, tags=[tag_constants.SERVING], signature_def_map={"serving_default": signature})
        save_model_builder.save()
# instanciate model
model = .... 
# convert to tf model
serialize_to_tf_and_dump(model, 'model_folder/1')
# tar tf model
with tarfile.open('model.tar.gz', mode='w:gz') as archive:
    archive.add('model_folder', recursive=True)
# upload it to s3
sagemaker_session = sagemaker.Session()
inputs = sagemaker_session.upload_data(path='model.tar.gz')
# convert to sagemaker model
role = get_execution_role()
sagemaker_model = Model(model_data = inputs,
    name='DummyModel',
    role = role,
    framework_version = '1.12')
predictor = sagemaker_model.deploy(initial_instance_count=1,
    instance_type='ml.t2.medium', endpoint_name='MultiInputMultiOutputModel')

在推理中,这里是如何请求预测的。

import json
import boto3
x_inputs = ... # list with 2 np arrays of size (batch_size, ...)
data={
    'inputs':{
        "input_type_1": x[0].tolist(),
        "input_type_2": x[1].tolist()
endpoint_name = 'MultiInputMultiOutputModel'
client = boto3.client('runtime.sagemaker')
response = client.invoke_endpoint(EndpointName=endpoint_name, Body=json.dumps(data), ContentType='application/json')
predictions = json.loads(response['Body'].read())
    
AmyN
这是我问题的正确解决方案。我使用BERT预训练模型实现了问题回答模型,但找不到方法将2个输入的列表(对于一个例子有2个输入:一个问题和一个答案;标签是0/1)传递给端点。按照上面的指示,在保存模型时创建签名,并在调用端点时传递json数据格式,就完成了工作。
Olivier Cruchant
Olivier Cruchant
发布于 2019-06-29
0 人赞同

你可能需要定制端点中加载的推理函数。在 SageMaker TF SDK doc 在这里你可以发现,有两个选项用于SageMaker TensorFlow的部署。

  • Python Endpoint , that is the default, check if modifying the input_fn can accomodate your inference scheme
  • TF Serving endpoint
  •