Tensorflow服务:GetModelMetaData和tf.example输入节点的自动配置

时间:2017-07-13 11:36:59

标签: tensorflow tensorflow-serving

我正在用C ++编写一个TensorFlow Serving客户端,它位于数据库服务器内,并使TensorFlow模型可用作数据库程序。整个机器根据它通过GetModelMetaData请求/响应机制从TensorFlow服务模型服务器检索的响应,自动配置数据库表和输入和输出张量之间的数据类型和必要的转换。

到目前为止,我已经使用“原始”输入张量与各种模型进行对话(Inception_v3,各种回归模型)。 “raw”是指输入张量的值是模型请求的纯数据类型,而不是包含为tf.example记录的值。

为了说明,查看TensorFlow服务示例部分中的“half_plus_two”模型。它期望一个“x”浮点输入并返回一个“y”浮点输出。它在“serving_default”签名中具有“原始”输入模式,在“classify_x_to_y”签名中具有“包裹”输入模式:(摘自GetModelMetaData响应):

Model Metadata: 
model_spec {
  name: "multisig"
  version {
    value: 1
  }
}
metadata {
  key: "signature_def"
  value {
    [type.googleapis.com/tensorflow.serving.SignatureDefMap] {
      signature_def {
        key: "classify_x_to_y"
        value {
          inputs {
            key: "inputs"
            value {
              name: "tf_example:0"
              dtype: DT_STRING
              tensor_shape {
                unknown_rank: true
              }
            }
          }
          outputs {
            key: "scores"
            value {
              name: "y:0"
              dtype: DT_FLOAT
              tensor_shape {
                dim {
                  size: -1
                }
                dim {
                  size: 1
                }
              }
            }
          }
          method_name: "tensorflow/serving/classify"
        }
      }
      signature_def {
        key: "serving_default"
        value {
          inputs {
            key: "x"
            value {
              name: "x:0"
              dtype: DT_FLOAT
              tensor_shape {
                dim {
                  size: -1
                }
                dim {
                  size: 1
                }
              }
            }
          }
          outputs {
            key: "y"
            value {
              name: "y:0"
              dtype: DT_FLOAT
              tensor_shape {
                dim {
                  size: -1
                }
                dim {
                  size: 1
                }
              }
            }
          }
          method_name: "tensorflow/serving/predict"
        }
      }
    }
  }
}

虽然我可以自动推导出为明确指定的“原始”张量(即浮点数向量)创建的张量,但是我没有办法找出将序列化的tf.example记录放入“classify_x_to_y”的内容。 “签名想要(阅读我知道的文本描述,当然它想要一个带有浮点值的tf.example在键'x'下,问题是,如何从上面的GetModelMetaDataResponse中自动推导出它?

1 个答案:

答案 0 :(得分:0)

Tensorflow服务支持不同的推理API,例如,Classify,Regress和Predict(https://github.com/tensorflow/serving/blob/master/tensorflow_serving/apis/prediction_service.proto)。   - " serving_default"签名用于Predict API(方法名称" tensorflow / serving / predict")。 Predict API是面向张量的,因此您可以推断出要创建的张量。 - " classify_x_to_y"签名用于Classify API(方法名称为" tensorflow / serving / classify")。 Classify API使用tf.Example,您需要知道tf.Example中应包含哪些功能。如果您可以访问模型导出(即SavedModel),则可以推断出该信息,但您无法仅通过签名来告知它。 - 回归类似于分类。

您是否可以控制模型以始终导出预测签名并仅使用Predict API进行推断? Predict是一个比Classify和Regress更低级的API,它应该支持Classify和Regress支持的所有功能(以及更多)。