【问题标题】:Save a model for TensorFlow Serving with api endpoint mapped to certain method using SignatureDefs?使用 SignatureDefs 将 API 端点映射到特定方法的 TensorFlow Serving 模型保存?
【发布时间】:2019-07-27 05:17:06
【问题描述】:

我最近通过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

【问题讨论】:

  • 我认为您编写了一个简单的烧瓶应用程序来提供结果或使用 lambda 函数实现(如 AWS)来提供此服务。

标签: python tensorflow tensorflow-serving


【解决方案1】:

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

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

由于几个未提及的原因,这使得这成为一个方便的简短示例,如果只是 IMO 有点误导的话。

1) instances 参数从何而来? RESTful API 的Predict API 定义有一个预定义的请求格式,在其两种可能的形式之一中,采用一种instances参数。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 2018-02-26
    • 2018-08-03
    • 2018-02-13
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2017-09-24
    相关资源
    最近更新 更多