Mise à niveau automatique du code vers TensorFlow 2



Le matériel fournit une traduction du manuel de mise à jour automatique du code de TensorFlow 1.x vers Tensorflow 2 à l'aide du script de mise à jour tf_upgrade_v2 .

TensorFlow 2.0 inclut de nombreuses modifications d'API, telles que la modification de l'ordre des arguments, le changement de nom des caractères et la modification des valeurs par défaut des paramètres. La correction manuelle de toutes ces modifications est fastidieuse et sujette aux erreurs. Pour simplifier les changements et rendre votre transition vers TF 2.0 aussi fluide que possible, l'équipe TensorFlow a créé l'utilitaire tf_upgrade_v2 pour vous aider à passer du code hérité à la nouvelle API.
Remarque: tf_upgrade_v2 installé automatiquement pour TensorFlow 1.13 et versions ultérieures (y compris toutes les versions de TF 2.0).
Une utilisation typique du script ressemble à ceci:

 tf_upgrade_v2 \ --intree my_project/ \ --outtree my_project_v2/ \ --reportfile report.txt 

Ce code accélère le processus de mise à niveau en convertissant les scripts Python TensorFlow 1.x existants en TensorFlow 2.0.

Le script de conversion automatise le processus autant que possible, mais il existe toujours des modifications syntaxiques et stylistiques qui ne peuvent pas être corrigées par le script.

Modules de compatibilité


Certains caractères API ne peuvent pas être mis à jour simplement en utilisant le remplacement de chaîne. Pour vous assurer que votre code fonctionne dans TensorFlow 2.0, le script de mise à jour inclut le module compat.v1 . Ce module remplace les caractères TF 1.x, tels que tf.foo , par le lien équivalent tf.compat.v1.foo . Bien que le module de compatibilité soit bon, nous vous recommandons de soustraire manuellement les remplacements et de les migrer vers les nouvelles API dans l'espace de noms tf. * tf. * au lieu de l'espace de noms tf.compat.v1 aussi rapidement que possible.

En raison de la dépréciation des modules TensorFlow 2.x (par exemple, tf.flags et tf.contrib ), certaines modifications ne peuvent pas être contournées en passant à compat.v1 . La mise à jour de ce code peut nécessiter l'utilisation d'une bibliothèque supplémentaire (par exemple, absl.flags ou le passage à un package dans tenorflow/addons .

Processus de mise à jour recommandé


Cette partie du manuel montre l'utilisation du script de mise à jour. Bien que le script de mise à jour soit facile à utiliser, nous vous recommandons vivement d'utiliser le script dans le cadre du processus suivant:

  1. Tests unitaires : assurez-vous que le code mis à jour dispose d'un ensemble de tests unitaires avec une couverture raisonnable. Il s'agit de code Python, donc le langage ne vous protégera pas de nombreuses classes d'erreur. Assurez-vous également que toutes vos dépendances ont été mises à jour pour être compatibles avec TensorFlow 2.0.
  2. Installez TensorFlow 1.14 : mettez à niveau votre TensorFlow vers la dernière version de TensorFlow 1.x, au moins 1.14. Il inclut la dernière API TensorFlow 2.0 sur tf.compat.v2 .
  3. Testez le code avec 1.14 : assurez-vous que vos tests unitaires réussissent à ce stade. Vous les redémarrerez pendant le processus de mise à niveau, il est donc important de commencer par une couleur verte.
  4. Exécutez le script de mise à jour : tf_upgrade_v2 sur l'arborescence source entière, y compris les tests. Cela mettra à jour votre code dans un format dans lequel il n'utilisera que les caractères disponibles dans TensorFlow 2.0. Les caractères obsolètes seront disponibles sur tf.compat.v1 . Ils nécessiteront par la suite un traitement manuel. \ N ",
  5. Exécutez des tests convertis avec TensorFlow 1.14 : votre code doit toujours fonctionner correctement dans TensorFlow 1.14. Exécutez à nouveau les tests unitaires. Toute erreur dans vos tests à ce stade signifie qu'il y a une erreur dans le script de mise à jour.
  6. Recherchez des avertissements et des erreurs dans le rapport de mise à jour : le script écrit un fichier de rapport expliquant toutes les conversions que vous devez revérifier ou toutes les actions qui doivent être effectuées manuellement. Par exemple: toutes les instances de contrib restantes doivent être supprimées manuellement.
  7. Installer TensorFlow 2.0 : à ce stade, le passage à TensorFlow 2.0 devrait être sûr.
  8. Testez le code avec v1.disable_v2_behavior : redémarrez vos tests avec v1.disable_v2_behavior() dans la fonction de test principale, les résultats doivent être les mêmes que lors de l'exécution sous 1.14.
  9. Activer le comportement V2 : Maintenant que vos tests sont en cours d'exécution à l'aide de l'API v2, vous pouvez commencer à regarder l'inclusion du v2 behavior . Selon la façon dont votre code est écrit, cela peut nécessiter certaines modifications.

Utilisation du script de mise à jour


L'installation


 from __future__ import absolute_import, division, print_function, unicode_literals 

 try: import tensorflow.compat.v2 as tf except Exception: pass tf.enable_v2_behavior() print(tf.__version__) 

Clonez le référentiel tensorflow / models pour avoir du code d'expérimentation:

 !git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models 

Lire l'aide


Le script doit être installé avec TensorFlow. L'aide intégrée est appelée comme ceci:

 !tf_upgrade_v2 -h 

Exemple de code TF1


Voici un simple script TensorFlow 1.0 qui ne s'exécute pas sur TensorFlow 2.0

 !head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10 

  # Calculate loss using mean squared error average_loss = tf.losses.mean_squared_error(labels, predictions) # Pre-made estimators use the total_loss instead of the average, # so report total_loss for compatibility. batch_size = tf.shape(labels)[0] total_loss = tf.to_float(batch_size) * average_loss if mode == tf.estimator.ModeKeys.TRAIN: optimizer = params.get("optimizer", tf.train.AdamOptimizer) 

donnant l'erreur suivante:

 Traceback (most recent call last): File "custom_regression.py", line 162, in <module> tf.logging.set_verbosity(tf.logging.INFO) AttributeError: module 'tensorflow' has no attribute 'logging' 

Fichier unique


Le script de mise à jour peut être exécuté sur un fichier Python distinct:

 !tf_upgrade_v2 \ --infile models/samples/cookbook/regression/custom_regression.py \ --outfile /tmp/custom_regression_v2.py 

Le script affichera des erreurs s'il ne trouve pas de corrections pour le code.

 INFO line 38:8: Renamed 'tf.feature_column.input_layer' to 'tf.compat.v1.feature_column.input_layer' INFO line 43:10: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 46:17: Renamed 'tf.layers.dense' to 'tf.compat.v1.layers.dense' INFO line 57:17: tf.losses.mean_squared_error requires manual check. tf.losses have been replaced with object oriented versions in TF 2.0 and after. The loss function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 57:17: Renamed 'tf.losses.mean_squared_error' to 'tf.compat.v1.losses.mean_squared_error' INFO line 61:15: Added keywords to args of function 'tf.shape' INFO line 62:15: Changed tf.to_float call to tf.cast(..., dtype=tf.float32). INFO line 65:40: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 68:39: Renamed 'tf.train.get_global_step' to 'tf.compat.v1.train.get_global_step' INFO line 83:9: tf.metrics.root_mean_squared_error requires manual check. tf.metrics have been replaced with object oriented versions in TF 2.0 and after. The metric function calls have been converted to compat.v1 for backward compatibility. Please update these calls to the TF 2.0 versions. INFO line 83:9: Renamed 'tf.metrics.root_mean_squared_error' to 'tf.compat.v1.metrics.root_mean_squared_error' INFO line 142:23: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer' INFO line 162:2: Renamed 'tf.logging.set_verbosity' to 'tf.compat.v1.logging.set_verbosity' INFO line 162:27: Renamed 'tf.logging.INFO' to 'tf.compat.v1.logging.INFO' INFO line 163:2: Renamed 'tf.app.run' to 'tf.compat.v1.app.run' TensorFlow 2.0 Upgrade Script ----------------------------- Converted 1 files Detected 0 issues that require attention -------------------------------------------------------------------------------- Make sure to read the detailed log 'report.txt' 

Arborescence de répertoires


Les projets typiques, y compris cet exemple simple, utilisent plusieurs fichiers. Habituellement, vous souhaitez mettre à jour l'ensemble du package, afin que le script puisse également être exécuté sur l'arborescence de répertoires:

 #   .py      outtree !tf_upgrade_v2 \ --intree models/samples/cookbook/regression/ \ --outtree regression_v2/ \ --reportfile tree_report.txt 

Faites attention à une remarque sur la fonction
 dataset.make_one_shot_iterator 
.

Maintenant, le script fonctionne déjà avec TensorFlow 2.0.

Notez qu'en raison du module `tf.compat.v1`, le script converti s'exécutera également dans TensorFlow 1.14.

Rapport détaillé


Le script publie également une liste détaillée des modifications. Dans cet exemple, il a trouvé une transformation potentiellement dangereuse et a ajouté un avertissement en haut du fichier:

 !head -n 20 tree_report.txt 

 TensorFlow 2.0 Upgrade Script ----------------------------- Converted 7 files Detected 1 issues that require attention -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- File: models/samples/cookbook/regression/automobile_data.py -------------------------------------------------------------------------------- models/samples/cookbook/regression/automobile_data.py:125:15: WARNING: Changing dataset.make_one_shot_iterator() to tf.compat.v1.data.make_one_shot_iterator(dataset). Please check this transformation. ================================================================================ Detailed log follows: ================================================================================ ================================================================================ Input tree: 'models/samples/cookbook/regression/' ================================================================================ -------------------------------------------------------------------------------- Processing file 'models/samples/cookbook/regression/custom_regression.py' outputting to 'regression_v2/custom_regression.py' 

Faites à nouveau attention à une remarque sur la Dataset.make_one_shot_iterator function .

Mode sans échec


Le script de conversion dispose également d'un mode «SÉCURISÉ» moins invasif qui modifie simplement les importations pour utiliser le module tensorflow.compat.v1 .

 !tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null 

Par exemple, le code:

 import tensorflow as tf d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 


dans ce mode est converti comme suit:

 import tensorflow.compat.v1 as tf tf.disable_v2_behavior() d = tf.nn.dropout(tf.range(10), 0.2) z = tf.zeros_like(d, optimize=False) 

Comme vous pouvez le voir, votre code n'a pas été mis à jour, mais maintenant le code TensorFlow 1 s'exécute dans TensorFlow 2.

Avertissements


  • Ne mettez pas à jour des parties de votre code manuellement avant d'exécuter le script. En particulier, les fonctions avec des arguments réorganisés, tels que tf.argmax ou tf.batch_to_space , forceront le script à ajouter incorrectement des arguments de mots clés, ce qui confondra votre code existant.
  • Le script suppose que tensorflow importé en utilisant import tensorflow as tf
  • Le script ne réorganise pas les arguments. Au lieu de cela, le script ajoute les mots clés des arguments aux fonctions dans lesquelles les arguments sont inversés.

Après vérification, la traduction apparaîtra également sur Tensorflow.org. Si vous souhaitez participer à la traduction de la documentation du site Tensorflow.org en russe, veuillez nous contacter à titre personnel ou commentaires. Toutes corrections ou commentaires sont appréciés.

Source: https://habr.com/ru/post/fr483184/


All Articles