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.
Constantes et utilitaires associés
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"
}
}