Automatisches Code-Upgrade auf TensorFlow 2



Das Material enthält eine Übersetzung des Handbuchs zum automatischen Aktualisieren von Code von TensorFlow 1.x auf Tensorflow 2 mithilfe des Aktualisierungsskripts tf_upgrade_v2 .

TensorFlow 2.0 enthält viele API-Änderungen, z. B. das Ändern der Reihenfolge von Argumenten, das Umbenennen von Zeichen und das Ändern von Standardwerten für Parameter. Die manuelle Korrektur all dieser Änderungen ist mühsam und fehleranfällig. Um die Änderungen zu vereinfachen und den Übergang zu TF 2.0 so reibungslos wie möglich zu gestalten, hat das TensorFlow-Team das Dienstprogramm tf_upgrade_v2 , um den Übergang vom tf_upgrade_v2 Code zur neuen API zu tf_upgrade_v2 .
Hinweis: tf_upgrade_v2 automatisch für TensorFlow 1.13 und tf_upgrade_v2 installiert (einschließlich aller TF 2.0-Builds).
Eine typische Verwendung des Skripts sieht folgendermaßen aus:

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

Dieser Code beschleunigt den Upgrade-Prozess, indem vorhandene TensorFlow 1.x-Python-Skripte in TensorFlow 2.0 konvertiert werden.

Das Konvertierungsskript automatisiert den Prozess so weit wie möglich, es gibt jedoch syntaktische und stilistische Änderungen, die vom Skript nicht behoben werden können.

Kompatibilitätsmodule


Einige API-Zeichen können nicht einfach durch Ersetzen von Zeichenfolgen aktualisiert werden. Um sicherzustellen, dass Ihr Code in TensorFlow 2.0 funktioniert, enthält das Aktualisierungsskript das Modul compat.v1 . Dieses Modul ersetzt TF 1.x-Zeichen wie z. B. tf.foo durch den entsprechenden Link tf.compat.v1.foo . Obwohl das Kompatibilitätsmodul gut ist, empfehlen wir, die Ersetzungen manuell zu subtrahieren und sie auf die neuen APIs im tf. * Namespace zu migrieren tf. * tf. * Anstelle des Namensraums tf.compat.v1 so schnell wie möglich.

Aufgrund der Abschreibung von TensorFlow 2.x-Modulen (z. B. tf.flags und tf.contrib ) können einige Änderungen nicht durch Umschalten auf compat.v1 umgangen werden. Das Aktualisieren eines solchen Codes erfordert möglicherweise die Verwendung einer zusätzlichen Bibliothek (z. B. absl.flags oder das Wechseln zu einem Paket in tenorflow/addons .

Empfohlener Update-Vorgang


Dieser Teil des Handbuchs zeigt die Verwendung des Aktualisierungsskripts. Obwohl das Aktualisierungsskript einfach zu verwenden ist, wird dringend empfohlen, dass Sie das Skript als Teil des folgenden Prozesses verwenden:

  1. Unit-Tests : Stellen Sie sicher, dass der aktualisierte Code eine Reihe von Unit-Tests mit angemessener Abdeckung enthält. Dies ist Python-Code, daher schützt Sie die Sprache nicht vor vielen Fehlerklassen. Stellen Sie außerdem sicher, dass alle Abhängigkeiten so aktualisiert wurden, dass sie mit TensorFlow 2.0 kompatibel sind.
  2. Installation von TensorFlow 1.14 : Aktualisieren Sie Ihren TensorFlow auf die neueste Version von TensorFlow 1.x, mindestens 1.14. Es enthält die endgültige TensorFlow 2.0-API unter tf.compat.v2 .
  3. Testcode mit 1.14 : Stellen Sie sicher, dass Ihre Einheitentests zu diesem Zeitpunkt erfolgreich sind. Sie werden sie während des Aktualisierungsprozesses neu starten, daher ist es wichtig, mit einer grünen Farbe zu beginnen.
  4. Führen Sie das Aktualisierungsskript aus : Führen Sie tf_upgrade_v2 für den gesamten tf_upgrade_v2 einschließlich der Tests aus. Dadurch wird Ihr Code auf ein Format aktualisiert, in dem nur die in TensorFlow 2.0 verfügbaren Zeichen verwendet werden. Veraltete Zeichen sind in tf.compat.v1 verfügbar. Sie müssen anschließend manuell verarbeitet werden. \ N ",
  5. Führen Sie konvertierte Tests mit TensorFlow 1.14 aus : Ihr Code sollte in TensorFlow 1.14 weiterhin korrekt ausgeführt werden. Führen Sie die Einheitentests erneut durch. Jeder Fehler in Ihren Tests zu diesem Zeitpunkt bedeutet, dass das Aktualisierungsskript fehlerhaft ist.
  6. Überprüfen Sie den Aktualisierungsbericht auf Warnungen und Fehler : Das Skript schreibt eine Berichtsdatei, in der alle zu überprüfenden Konvertierungen oder alle manuell auszuführenden Aktionen erläutert werden. Beispiel: Alle verbleibenden Contrib-Instanzen müssen manuell entfernt werden.
  7. TensorFlow 2.0 installieren : Zu diesem Zeitpunkt sollte der Wechsel zu TensorFlow 2.0 sicher sein.
  8. Testen Sie den Code mit v1.disable_v2_behavior : v1.disable_v2_behavior Ihre Tests mit v1.disable_v2_behavior() in der Haupttestfunktion neu. Die Ergebnisse sollten dieselben sein wie unter 1.14.
  9. V2-Verhalten aktivieren : Jetzt, da Ihre Tests über die v2-API ausgeführt werden, können Sie die Einbeziehung des v2 behavior . Abhängig davon, wie Ihr Code geschrieben ist, sind möglicherweise einige Änderungen erforderlich.

Verwenden des Update-Skripts


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__) 

Klonen Sie das Tensorflow / Modell- Repository, damit Sie etwas Code zum Experimentieren haben:

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

Lesen Sie die Hilfe


Das Skript muss mit TensorFlow installiert werden. Die eingebaute Hilfe lautet wie folgt:

 !tf_upgrade_v2 -h 

TF1-Codebeispiel


Hier ist ein einfaches TensorFlow 1.0-Skript, das nicht unter TensorFlow 2.0 ausgeführt werden kann

 !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) 

folgenden Fehler melden:

 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' 

Einzelne Datei


Das Update-Skript kann in einer separaten Python-Datei ausgeführt werden:

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

Das Skript zeigt Fehler an, wenn es keine Korrekturen für den Code finden kann.

 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' 

Verzeichnisbaum


Typische Projekte, einschließlich dieses einfachen Beispiels, verwenden mehr als eine Datei. Normalerweise möchten Sie das gesamte Paket aktualisieren, damit das Skript auch in der Verzeichnisstruktur ausgeführt werden kann:

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

Beachten Sie eine Bemerkung zur Funktion
 dataset.make_one_shot_iterator 
.

Jetzt arbeitet das Skript bereits mit TensorFlow 2.0.

Beachten Sie, dass das konvertierte Skript aufgrund des Moduls `tf.compat.v1` auch in TensorFlow 1.14 ausgeführt wird.

Ausführlicher Bericht


Das Skript veröffentlicht auch eine detaillierte Liste der Änderungen. In diesem Beispiel fand er eine möglicherweise unsichere Umwandlung und fügte am Anfang der Datei eine Warnung hinzu:

 !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' 

Dataset.make_one_shot_iterator function einmal eine Bemerkung zur Dataset.make_one_shot_iterator function .

Abgesicherter Modus


Das Konvertierungsskript verfügt auch über einen weniger invasiven „SECURE“ -Modus, der den Import einfach so ändert, dass das Modul tensorflow.compat.v1 wird.

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

Zum Beispiel Code:

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


in diesem Modus wird in Folgendes konvertiert:

 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) 

Wie Sie sehen, wurde Ihr Code nicht aktualisiert, aber jetzt wird der TensorFlow 1-Code in TensorFlow 2 ausgeführt.

Warnungen


  • Aktualisieren Sie Teile Ihres Codes nicht manuell, bevor Sie das Skript ausführen. Insbesondere Funktionen mit neu geordneten Argumenten, wie z. B. tf.argmax oder tf.batch_to_space , erzwingen, dass das Skript fälschlicherweise Schlüsselwortargumente hinzufügt, was Ihren vorhandenen Code verwirrt.
  • Das Skript geht davon aus, dass tensorflow importiert wird, indem import tensorflow as tf importiert wird
  • Das Skript ordnet die Argumente nicht neu an. Stattdessen fügt das Skript die Schlüsselwörter der Argumente zu den Funktionen hinzu, in denen die Argumente umgekehrt werden.

Nach der Überprüfung wird die Übersetzung auch auf Tensorflow.org angezeigt. Wenn Sie an der Übersetzung der Dokumentation der Tensorflow.org-Website ins Russische teilnehmen möchten, wenden Sie sich bitte an eine Person oder einen Kommentar. Korrekturen oder Kommentare sind willkommen.

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


All Articles