SignatureDefs в SavedModel для обслуживания TensorFlow

Цель

В этом документе представлены примеры предполагаемого использования SignatureDefs в SavedModel, которые сопоставляются с API-интерфейсами TensorFlow Serving.

Обзор

SignatureDef определяет подпись вычисления, поддерживаемого в графе TensorFlow. Целью SignatureDefs является предоставление общей поддержки для идентификации входных и выходных данных функции, и их можно указать при построении SavedModel .

Фон

TF-Exporter и SessionBundle использовали подписи , которые схожи по концепции, но требовали от пользователей различать именованные подписи и подписи по умолчанию, чтобы их можно было правильно получить при загрузке. Для тех, кто ранее использовал TF-Exporter/SessionBundle, Signatures в TF-Exporter будут заменены SignatureDefs в SavedModel.

Структура SignatureDef

SignatureDef требует указания:

  • inputs как карта строки в TensorInfo.
  • outputs как карту строки в TensorInfo.
  • method_name (которое соответствует имени поддерживаемого метода в инструменте/системе загрузки).

Обратите внимание, что сам TensorInfo требует указания имени, dtype и формы тензора. Хотя информация о тензоре уже присутствует в графе, полезно явно определить TensorInfo как часть SignatureDef, поскольку тогда инструменты смогут выполнять проверку подписи и т. д. без необходимости читать определение графа.

Для простоты повторного использования и совместного использования между инструментами и системами часто используемые константы, связанные с SignatureDefs, которые будут поддерживаться в TensorFlow Serving, определяются как константы. Конкретно:

Кроме того, SavedModel предоставляет утилиту , помогающую создать определение подписи.

Примеры структур

TensorFlow Serving предоставляет API высокого уровня для выполнения вывода. Чтобы включить эти API, модели должны включать один или несколько SignatureDefs, которые определяют точные узлы TensorFlow, которые будут использоваться для ввода и вывода. Ниже приведены примеры конкретных SignatureDefs, которые TensorFlow Serving поддерживает для каждого API.

Обратите внимание, что обслуживание TensorFlow зависит от ключей каждого TensorInfo (во входных и выходных данных SignatureDef), а также от имени метода SignatureDef. Фактическое содержимое TensorInfo зависит от вашего графика.

Классификация SignatureDef

Классификация SignatureDefs поддерживает структурированные вызовы API классификации TensorFlow Serving. Они предписывают наличие inputs тензора и двух дополнительных выходных тензоров: classes и scores , хотя бы один из которых должен присутствовать.

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"
  }
}

Предсказать подписьDef

Predict SignatureDefs поддерживает вызовы API Predict от TensorFlow Serving. Эти сигнатуры позволяют гибко поддерживать произвольное количество входных и выходных тензоров. В приведенном ниже примере подпись my_prediction_signature имеет один логический вход Tensor images , которые сопоставляются с фактическим Tensor на вашем графике x:0 .

Predict SignatureDefs обеспечивает переносимость между моделями. Это означает, что вы можете менять разные SavedModels, возможно, с разными базовыми именами Tensor (например, вместо x:0 , возможно, у вас есть новая альтернативная модель с Tensor z:0 ), в то время как ваши клиенты могут оставаться в сети, постоянно запрашивая старые и новые версии этой модели без изменений на стороне клиента.

Predict SignatureDefs также позволяет вам добавлять к выходным данным дополнительные тензоры, которые вы можете явно запросить. Предположим, что в дополнение к выходному ключу 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"
  }
}

Сигнатура регрессииDef

Регрессионные SignatureDefs поддерживают структурированные вызовы API регрессии TensorFlow Serving. Они предписывают, что должен быть ровно один 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"
  }
}