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

jos*_*hwa 7 python tensorflow tensorflow-serving

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

我还通读了本教程,以了解如何与Docker一起使用。但是我不理解如何通过接受输入参数来保存模型。例如:

    curl -d '{"instances": [1.0, 2.0, 5.0]}' \
        -X POST http://localhost:8501/v1/models/half_plus_two:predict
Run Code Online (Sandbox Code Playgroud)

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)) 
Run Code Online (Sandbox Code Playgroud)

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

    curl -d '{"start_string": "ROMEO: "}' \
        -X POST http://localhost:8501/v1/models/text_generation:predict
Run Code Online (Sandbox Code Playgroud)

GPh*_*ilo 4

注意:要完整、广泛地回答这个问题,需要深入研究服务架构、其 API 以及它们如何与模型签名交互。我将跳过所有这些,以使答案保持在可接受的长度,但如果有必要,我总是可以扩展过于晦涩的部分(如果是这种情况,请留下评论)。

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

由于几个未提及的原因堆积起来,使这个例子成为一个方便的简短示例,但在我看来有点误导。

1)参数从哪里来instancesRESTful API 的 Predict API的定义具有一种预定义的请求格式,该格式在其两种可能的形式之一中采用一个instances参数。

2)参数映射到什么instances我们不知道。对于只有一个输入的 SignatureDefs,instances 这种非常具体的调用格式直接映射到输入,而不需要指定输入的键(请参阅 API 规范中的“以行格式指定输入张量”部分)。

因此,会发生的情况是:您向仅定义一个输入的模型发出 POST 请求。TF Serving 获取该输入并将其提供给模型,运行它,直到它具有模型签名的“输出”部分中定义的张量的所有值,并返回一个 JSON 对象,其中包含“key:result输出”中每个键的项目列表。

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

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

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