Exporter un SavedModel pour la prédiction

Pour déployer vos modèles entraînés sur AI Platform Prediction et les utiliser pour diffuser les prédictions, vous devez d'abord les exporter au format SavedModel de TensorFlow.

Cette page décrit quelques points importants à prendre en compte lors de la création de votre SavedModel. Pour en savoir plus sur l'exportation vers un SavedModel, consultez la page Guide TensorFlow sur les SavedModel et le guide TensorFlow sur l'enregistrement de Keras modèles de ML. Pour plus de détails sur le déploiement de votre SavedModel sur AI Platform Prediction afin de diffuser des prédictions, consultez le guide de déploiement des modèles. Pour obtenir des informations générales sur le processus de prédiction, consultez la page de présentation de la prédiction.

Routines de prédiction personnalisées

Au lieu de déployer un SavedModel, vous pouvez également créer et déployer une routine de prédiction personnalisée. Une routine de prédiction personnalisée peut combiner un SavedModel (ou un modèle entraîné enregistré d'une autre manière) avec d'autres artefacts d'entraînement et avec le code Python que vous fournissez pour personnaliser le traitement des requêtes de prédiction par AI Platform Prediction. Par exemple, vous pouvez exploiter cette flexibilité pour prétraiter les entrées de prédiction avant que votre modèle n'établisse une prédiction.

Pour en savoir plus, consultez le guide sur les routines de prédiction personnalisées.

Comprendre les graphes d'apprentissage et les graphes de diffusion

Une fois votre modèle entraîné et exporté en tant que SavedModel, vous devez suivre certaines étapes importantes avant de pouvoir obtenir des prédictions.

Il existe des différences clés entre un graphe d'apprentissage et un graphe de diffusion. Les graphes d'apprentissage contiennent des fonctionnalités qui ne sont pas adaptées à la diffusion, telles que :

  • Des lecteurs de fichiers
  • Des files d'attente d'entrée
  • Des couches d'abandon
  • Des fonctions de perte
  • Des optimiseurs

Étant donné que le processus de diffusion des prédictions a des besoins différents de ceux du processus d'apprentissage, il est recommandé d'exporter un graphe distinct spécifique à la diffusion des prédictions.

Comprendre le format SavedModel

SavedModel est le format recommandé de TensorFlow pour enregistrer des modèles. Ce format est requis pour pouvoir déployer des modèles TensorFlow entraînés sur AI Platform Prediction. L'exportation de votre modèle entraîné en tant que SavedModel enregistre votre graphe d'apprentissage avec ses assets, variables et métadonnées dans un format qu'AI Platform Prediction peut utiliser et restaurer pour les prédictions.

Après l'exportation d'un SavedModel, vous disposez d'un répertoire SavedModel contenant les éléments suivants :

  • Vos graphes d'apprentissage enregistrés dans un fichier de tampons de protocole SavedModel
  • Des fichiers externes appelés assets
  • Des variables enregistrées en tant que fichiers de point de contrôle

Lorsque vous déployez votre SavedModel sur AI Platform Prediction, vous devez inclure l'intégralité du répertoire du SavedModel, et pas uniquement le fichier des tampons de protocole SavedModel, qui contient votre graphe et ses métadonnées. Ce fichier affiche généralement l'extension .pb ou .pbtxt.

Le SavedModel vous permet d'enregistrer plusieurs versions d'un graphe qui partagent les mêmes assets et variables (ou points de contrôle). Par exemple, vous pouvez développer deux versions du même graphe : une pour l'exécution sur les processeurs, et une autre pour l'exécution sur les GPU.

En savoir plus sur la structure d'un répertoire SavedModel

Exporter un SavedModel à partir de différentes API TensorFlow

Il existe plusieurs façons d'exporter des SavedModel à partir de votre code d'entraînement TensorFlow. La liste suivante décrit plusieurs méthodes applicables à différentes API TensorFlow :

Compatibilité avec AI Explanations

Si vous souhaitez utiliser AI Explanations avec votre modèle, découvrez les exigences supplémentaires pour votre SavedModel.

Vérifier et ajuster la taille du modèle

Votre SavedModel doit avoir une taille maximale de 500 Mo pour pouvoir être déployé sur une version de modèle utilisant un ancien type de machine (MLS1). Si vous utilisez un type de machine Compute Engine (N1), la taille du fichier peut atteindre 10 Go. Apprenez-en plus sur les types de machines pour la prédiction en ligne.

Cette limite de taille inclut tous les éléments et variables de votre répertoire SavedModel, et pas uniquement le fichier de tampons de protocole SavedModel (c'est-à-dire saved_model.pb ou saved_model.pbtxt).

Pour vérifier la taille de votre modèle pendant le développement, exportez un SavedModel et vérifiez la taille de fichier dans le répertoire.

Si la taille de votre SavedModel dépasse la limite de 500 Mo :

En suivant cette procédure, la taille du SavedModel peut descendre sous la limite de 500 Mo, réduisant ainsi la latence des prédictions. Cela présente plusieurs avantages en offrant de meilleures performances, et en évitant d'avoir à demander et à attendre une augmentation du quota.

Si vous avez encore besoin de quotas supplémentaires, découvrez comment demander une augmentation de quota.

Créer un graphe de prédiction optimal

L'apprentissage produit plusieurs points de contrôle qui ne sont pas utilisés pour diffuser des prédictions. Veillez à télécharger un répertoire ne contenant aucun de ces points de contrôle, mais uniquement le modèle à déployer.

Par exemple, si vous exportez des résumés pendant le processus d'apprentissage pour la visualisation dans TensorBoard, vous devez vous assurer qu'ils ne sont pas inclus dans votre SavedModel. Ces résumés TensorBoard ne sont pas nécessaires pour un graphe de prédiction.

Réduire la précision pour diminuer la taille des fichiers

Réduire la précision des variables et des données d'entrée est un compromis permettant de réduire considérablement la taille de votre modèle, même si cela influence la précision des prédictions. Le stockage des données présentant une précision élevée est moins efficace que celui des données présentant une faible précision. Bien que les données présentant une faible précision soient une source de bruit, un réseau de neurones peut "ignorer" ce bruit et produire des prédictions relativement précises.

Si l'utilisation de ces méthodes entraîne une perte de précision trop importante lors de la prédiction pour votre cas d'utilisation, essayez de demander une augmentation du quota.

  • Réduisez la taille du fichier en réduisant la taille des pondérations, qui par défaut correspondent à des nombres à virgule flottante difficiles à stocker efficacement. Ces pondérations stockées de manière inefficace contribuent en grande partie à la taille de fichier globale du modèle.

  • Quantifier vos données continues afin de réduire la taille de votre modèle jusqu'à 75% sans sacrifier la précision.

  • Utilisez des variables moins précises. Par exemple, modifiez le type de données (dtype) en le passant de int64 à int32.

  • Réduisez la taille des autres éléments d'entrée du dossier assets du répertoire SavedModel. Par exemple, utilisez un vocabulaire moins volumineux pour les données de type texte.

  • Découvrez les techniques d'optimisation des modèles TensorFlow pour inférence plus en détail et de travailler sur des exemples d’application de ces techniques. Les techniques associées ne s'appliquent que si vous utilisez TensorFlow 1.

Outils d'inspection des formats SavedModel et des graphes

TensorFlow fournit une interface de ligne de commande que vous pouvez utiliser pour évaluer l'intégrité de certains aspects de votre SavedModel, tels que la mise en forme des entrées et SignatureDefs. En savoir plus sur la CLI SavedModel.

L'outil Graph Transform de TensorFlow vous permet d'optimiser le modèle en vue du déploiement. Bien que l'utilisation de cet outil soit expliquée dans un contexte de déploiement sur des appareils mobiles, il peut également être utilisé pour optimiser des modèles en vue d'un déploiement sur des appareils non mobiles.

Créer des fonctions d'entrée de diffusion

Si vous exportez votre SavedModel à l'aide de tf.keras.Model.save, vous n'avez pas besoin de spécifier une fonction d'entrée de diffusion.

Sinon, définissez une fonction d'entrée de diffusion lors de l'exportation du modèle SavedModel. Pour ce faire, créez-la à l'un des moments suivants du processus global d'entraînement :

  • Pendant la fin du processus d'entraînement
  • En tant que processus distinct à l'issue de l'apprentissage

Les exemples suivants montrent comment effectuer cette opération pour une instance Estimator entraînée. Obtenez plus d'informations sur les fonctions d'entrée de diffusion pour les instances Estimator.

Créer un graphe de diffusion pendant l'entraînement

Cette création se produit généralement à la fin du processus d'apprentissage, mais reste liée à l'apprentissage.

  1. Définissez une fonction d'entrée de diffusion Dans votre fonction, assurez-vous que la dimension de plus haut niveau de vos caractéristiques est None. Cela correspond à votre taille de lot et est illustré ci-dessous lorsque vous définissez la valeur des éléments de vos fonctionnalités à l'aide de tf.placeholder. L'exemple de code suivant est issu de notre exemple Census :

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Exportez un SavedModel depuis votre instance Estimator à l'aide de la fonction tf.estimator.Estimator.export_saved_model, en lui indiquant le chemin d'accès au modèle en tant que paramètre export_dir_base et le nom de la fonction d'entrée de diffusion en tant que paramètre serving_input_fn. Dans l'exemple du recensement, le type d'instance Estimator utilisé est tf.estimator.DNNLinearCombinedClassifier.

Créer un graphe de diffusion distinct de l'apprentissage

Si vous avez déjà entraîné votre modèle, vous pouvez obtenir des prédictions sans lancer un nouvel apprentissage. Ce processus est très semblable à la création d'un graphe de diffusion pendant l'apprentissage. La principale différence est que vous créez le graphe de diffusion dans un script Python distinct que vous exécutez une fois l'entraînement terminé. L'idée de base est de construire l'Estimator avec le même model_dir que celui utilisé lors de l'entraînement, puis appel tf.estimator.Estimator.export_saved_model comme décrit dans la section précédente.

  1. Définissez une fonction d'entrée de diffusion dans le script Python à l'aide du code suivant, de la même manière que lors de l'entraînement :

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. Lorsque vous créez votre instance Estimator, vérifiez que le paramètre model_dir est identique à celui utilisé lors de l'entraînement. Les points de contrôle du modèle précédemment enregistré seront ainsi disponibles pour l'instance Estimator.

  3. Enfin, utilisez votre Estimator pour appeler tf.estimator.Estimator.export_saved_model en transmettant le chemin d'accès à votre modèle en tant que paramètre export_dir_base, et Nom de votre fonction d'entrée de diffusion en tant que paramètre serving_input_fn.

Tags et signatures TensorFlow

Si vous exportez un SavedModel à partir de tf.keras ou d'une instance TensorFlow Estimator, le graphe exporté est par défaut prêt pour la diffusion.

Dans les autres cas, lors de la création d'un graphe de prédiction TensorFlow, vous devez spécifier les valeurs correctes pour les tags et les signatures de votre graphe. TensorFlow fournit des constantes pour ces valeurs de tags et de signatures, utilisées dans le but :

  • de sélectionner un graphe dans votre SavedModel pour diffuser les prédictions ;
  • d'indiquer que vous créez une signature de prédiction pour votre graphe de prédiction.

Les signatures définissent les entrées et les sorties de votre graphe. Lorsque vous créez pour votre graphe de prédiction, vous devez spécifier une signature valide constante comme paramètre method_name dans build_signature_def Pour la prédiction, il est généralement préférable de choisir PREDICT_METHOD_NAME.

Vous devez utiliser un tag pour spécifier le graphe de votre SavedModel utilisé pour diffuser les prédictions. Dans add_meta_graph_and_variables, ajoutez tag_constants.SERVING à votre liste tags.

Consultez un exemple de création d'un graphe de prédiction à l'aide de constantes appropriées pour les tags et les signatures.

Étape suivante