为TensorFlow Serving保存模型,并使用SignatureDefs将api端点映射到某些方法?

时间:2019-03-05 16:55:17

标签: python tensorflow tensorflow-serving

我最近经历过this tutorial。我从教程中获得了训练有素的模型,我想与docker一起使用它,因此我可以向其发送任意字符串,并从模型中获取预测。

我还经历了this tutorial,以了解如何与docker一起使用。但是我不理解如何通过接受输入参数来保存模型。例如:

    curl -d '{"instances": [1.0, 2.0, 5.0]}' \
        -X POST http://localhost:8501/v1/models/half_plus_two:predict

half_plus_two模型如何知道如何处理instances参数?

在文本生成教程中,有一种称为generate_text的方法可以处理生成预测。

    def generate_text(model, start_string):
        # Evaluation step (generating text using the learned model)

        # Number of characters to generate
        num_generate = 1000

        # Converting our start string to numbers (vectorizing) 
        input_eval = [char2idx[s] for s in start_string]
        input_eval = tf.expand_dims(input_eval, 0)

        # Empty string to store our results
        text_generated = []

        # Low temperatures results in more predictable text.
        # Higher temperatures results in more surprising text.
        # Experiment to find the best setting.
        temperature = 1.0

        # Here batch size == 1
        model.reset_states()
        for i in range(num_generate):
            predictions = model(input_eval)
            # remove the batch dimension
            predictions = tf.squeeze(predictions, 0)

            # using a multinomial distribution to predict the word returned by the model
            predictions = predictions / temperature
            predicted_id = tf.multinomial(predictions, num_samples=1)[-1,0].numpy()

            # We pass the predicted word as the next input to the model
            # along with the previous hidden state
            input_eval = tf.expand_dims([predicted_id], 0)

            text_generated.append(idx2char[predicted_id])

        return (start_string + ''.join(text_generated)) 

如何从文本生成教程中提供训练好的模型,并将模型api的输入参数映射到诸如generate_text之类的独特方法?例如:

    curl -d '{"start_string": "ROMEO: "}' \
        -X POST http://localhost:8501/v1/models/text_generation:predict

1 个答案:

答案 0 :(得分:3)

注意:要完全而广泛地回答此问题,需要深入研究Serving架构,其API以及它们如何与模型签名交互。我将跳过所有这些内容以将答案保持在可接受的长度,但是如有必要,我总是可以扩展到过于模糊的部分(如果这样,请发表评论)。

  

half_plus_two模型如何知道如何处理实例参数?

由于一些未提及的原因,使它成为一个方便的简短示例,即使仅是IMO也会引起误解。

1) instances参数从何而来? RESTful API的Predict API定义具有预定义的请求格式,该格式有两种可能之一表格,使用一个instances参数。

2) instances参数映射到什么?我们不知道。对于仅具有一个输入的SignatureDef,instances 采用非常特定的调用格式直接映射到该输入,而无需指定输入的键(see section "Specifying input tensors in row format" in the API specs)。

因此,发生的事情是:您向仅定义一个输入的模型发出POST请求。 TF Serving接受该输入并将其输入到模型,运行它直到具有在模型签名的“输出”部分中定义的张量的所有值,然后为您返回一个带有key:result项目的JSON对象,每个键在“输出”列表中。

  

如何从文本生成教程中提供训练好的模型,并将模型api的输入参数映射到诸如generate_text之类的独特方法?

不能(至少不直接将函数映射到Serving方法)。服务基础结构公开了一些预定义的方法(regresspredictclassify),这些方法知道如何解释签名以通过运行模型的特定子图来生成您请求的输出。这些子图必须包含在SavedModel中,因此例如,使用tf.py_func将不起作用。

您最好的机会是尝试将文本生成描述为TF子图(即,仅使用TF操作),并编写一个单独的SignatureDef,以开始字符串和num_generate作为输入。