SignatureDefs dans SavedModel pour le service TensorFlow

Objectif

Ce document fournit des exemples d'utilisation prévue de SignatureDefs dans SavedModel qui correspondent aux API de TensorFlow Serving.

Aperçu

Un SignatureDef définit la signature d'un calcul pris en charge dans un graphique TensorFlow. Les SignatureDefs visent à fournir un support générique pour identifier les entrées et les sorties d'une fonction et peuvent être spécifiés lors de la construction d'un SavedModel .

Arrière-plan

TF-Exporter et SessionBundle utilisaient des signatures dont le concept était similaire, mais obligeaient les utilisateurs à faire la distinction entre les signatures nommées et par défaut afin qu'elles puissent être récupérées correctement lors d'un chargement. Pour ceux qui utilisaient auparavant TF-Exporter/SessionBundle, Signatures dans TF-Exporter seront remplacées par SignatureDefs dans SavedModel.

Structure SignatureDef

Un SignatureDef nécessite la spécification de :

  • inputs sous forme de carte de chaîne vers TensorInfo.
  • outputs sous forme de carte de chaîne vers TensorInfo.
  • method_name (qui correspond à un nom de méthode pris en charge dans l'outil/système de chargement).

Notez que TensorInfo lui-même nécessite la spécification du nom, du type et de la forme du tenseur. Bien que les informations sur le tenseur soient déjà présentes dans le graphique, il est utile de définir explicitement TensorInfo dans le cadre de SignatureDef, car les outils peuvent ensuite effectuer une validation de signature, etc. sans avoir à lire la définition du graphique.

Pour faciliter la réutilisation et le partage entre outils et systèmes, les constantes couramment utilisées liées aux SignatureDefs qui seront prises en charge dans TensorFlow Serving sont définies comme constantes. Spécifiquement:

De plus, SavedModel fournit un utilitaire pour aider à créer une définition de signature.

Exemples de structures

TensorFlow Serving fournit des API de haut niveau pour effectuer des inférences. Pour activer ces API, les modèles doivent inclure un ou plusieurs SignatureDefs qui définissent les nœuds TensorFlow exacts à utiliser pour l'entrée et la sortie. Voir ci-dessous des exemples de SignatureDefs spécifiques pris en charge par TensorFlow Serving pour chaque API.

Notez que TensorFlow Serving dépend des clés de chaque TensorInfo (dans les entrées et sorties de SignatureDef), ainsi que du nom_méthode de SignatureDef. Le contenu réel de TensorInfo est spécifique à votre graphique.

Signature de classificationDéf

Les SignatureDefs de classification prennent en charge les appels structurés à l'API de classification de TensorFlow Serving. Ceux-ci prescrivent qu'il doit y avoir un Tensor inputs et qu'il existe deux Tenseurs de sortie facultatifs : classes et scores , dont au moins un doit être présent.

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

Prédire SignatureDef

Predict SignatureDefs prend en charge les appels à l'API Predict de TensorFlow Serving. Ces signatures vous permettent de prendre en charge de manière flexible de nombreux Tensors d'entrée et de sortie. Pour l'exemple ci-dessous, la signature my_prediction_signature a une seule entrée logique, images Tensor qui sont mappées au Tensor réel dans votre graphique x:0 .

Predict SignatureDefs permet la portabilité entre les modèles. Cela signifie que vous pouvez échanger différents SavedModels, éventuellement avec différents noms de Tensor sous-jacents (par exemple, au lieu de x:0 vous avez peut-être un nouveau modèle alternatif avec un Tensor z:0 ), tandis que vos clients peuvent rester en ligne en interrogeant continuellement l'ancien et le nouveau. versions de ce modèle sans modifications côté client.

Predict SignatureDefs vous permet également d'ajouter des Tensors supplémentaires facultatifs aux sorties, que vous pouvez explicitement interroger. Disons qu'en plus de la clé de sortie ci-dessous de scores , vous souhaitez également récupérer une couche de pooling à des fins de débogage ou à d'autres fins. Dans ce cas, vous ajouteriez simplement un Tensor supplémentaire avec une clé telle que pool et une valeur appropriée.

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

Signature de régressionDef

Les SignatureDefs de régression prennent en charge les appels structurés à l'API de régression de TensorFlow Serving. Ceux-ci prescrivent qu'il doit y avoir exactement un Tensor inputs et un Tensor 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"
  }
}