TensorFlow Serving 中 SavedModel 的 SignatureDefs

目标

本文档提供了一些示例,用于说明在 SavedModel 中使用 SignatureDefs 的预期用途,这些 SignatureDefs 映射到 TensorFlow Serving 的 API。

概述

一个 SignatureDef 定义了 TensorFlow 图中支持的计算的签名。SignatureDefs 旨在提供通用支持,以识别函数的输入和输出,并且可以在构建 SavedModel 时指定。

背景

TF-ExporterSessionBundle 使用 Signatures,它们在概念上类似,但要求用户区分命名签名和默认签名,以便在加载时正确检索它们。对于以前使用过 TF-Exporter/SessionBundle 的用户,TF-Exporter 中的 Signatures 将被 SavedModel 中的 SignatureDefs 替换。

SignatureDef 结构

SignatureDef 需要指定

  • inputs 作为字符串到 TensorInfo 的映射。
  • outputs 作为字符串到 TensorInfo 的映射。
  • method_name(对应于加载工具/系统中支持的方法名称)。

请注意,TensorInfo 本身需要指定名称、数据类型和张量形状。虽然张量信息已存在于图中,但将 TensorInfo 明确定义为 SignatureDef 的一部分很有用,因为工具可以执行签名验证等操作,而无需读取图定义。

为了方便在工具和系统之间重复使用和共享,与 SignatureDefs 相关的常用常量(将在 TensorFlow Serving 中支持)被定义为常量。具体来说

此外,SavedModel 提供了一个 实用程序 来帮助构建签名定义。

示例结构

TensorFlow Serving 提供用于执行推理的高级 API。为了启用这些 API,模型必须包含一个或多个 SignatureDefs,这些 SignatureDefs 定义了用于输入和输出的确切 TensorFlow 节点。请参阅以下每个 API 支持的特定 SignatureDefs 的示例。

请注意,TensorFlow Serving 依赖于每个 TensorInfo 的键(在 SignatureDef 的输入和输出中),以及 SignatureDef 的 method_name。TensorInfo 的实际内容特定于您的图。

分类 SignatureDef

分类 SignatureDefs 支持对 TensorFlow Serving 的分类 API 进行结构化调用。它们规定必须存在一个 inputs 张量,并且必须存在两个可选输出张量:classesscores,其中至少必须存在一个。

signature_def: {
  key  : "my_classification_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "tf_example:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "classes"
      value: {
        name: "index_to_string:0"
        dtype: DT_STRING
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "TopKV2:0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/classify"
  }
}

预测 SignatureDef

预测 SignatureDefs 支持对 TensorFlow Serving 的预测 API 进行调用。这些签名允许您灵活地支持任意数量的输入和输出张量。对于以下示例,签名 my_prediction_signature 具有单个逻辑输入张量 images,这些张量映射到图中实际的张量 x:0

预测签名定义可以实现模型之间的可移植性。这意味着您可以替换不同的 SavedModels,这些模型可能具有不同的底层张量名称(例如,而不是 x:0,您可能有一个新的备用模型,其张量为 z:0),而您的客户端可以持续在线查询此模型的旧版本和新版本,而无需进行客户端更改。

预测签名定义还允许您向输出添加可选的附加张量,您可以显式地查询这些张量。假设除了下面的输出键 scores 之外,您还想获取一个池化层以进行调试或其他目的。在这种情况下,您只需添加一个具有键 pool 和相应值的附加张量。

signature_def: {
  key  : "my_prediction_signature"
  value: {
    inputs: {
      key  : "images"
      value: {
        name: "x:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "scores"
      value: {
        name: "y:0"
        dtype: ...
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/predict"
  }
}

回归签名定义

回归签名定义支持对 TensorFlow Serving 的回归 API 的结构化调用。这些定义规定必须恰好有一个 inputs 张量和一个 outputs 张量。

signature_def: {
  key  : "my_regression_signature"
  value: {
    inputs: {
      key  : "inputs"
      value: {
        name: "x_input_examples_tensor_0"
        dtype: ...
        tensor_shape: ...
      }
    }
    outputs: {
      key  : "outputs"
      value: {
        name: "y_outputs_0"
        dtype: DT_FLOAT
        tensor_shape: ...
      }
    }
    method_name: "tensorflow/serving/regress"
  }
}