Ein offizielles Tutorial zu @tf.function
sagt:
Verwenden Sie tf.function, um Diagramme aus Ihren Programmen zu erstellen, um Spitzenleistungen zu erzielen und Ihr Modell überall einsetzbar zu machen. Dank AutoGraph funktioniert eine überraschende Menge an Python-Code nur mit tf.function, aber es gibt immer noch Fallstricke, vor denen man sich hüten muss.
Die wichtigsten Erkenntnisse und Empfehlungen sind:
- Verlassen Sie sich nicht auf Python-Nebenwirkungen wie Objektmutation oder Listenanhänge.
- tf.function funktioniert am besten mit TensorFlow-Ops und nicht mit NumPy-Ops oder Python-Primitiven.
- Verwenden Sie im Zweifelsfall das for x in y-Idiom.
Es wird nur erwähnt, wie@tf.function
kommentierte Funktionen implementiert werden, nicht jedoch, wann sie verwendet werden sollen.
Gibt es eine Heuristik, wie man entscheidet, ob ich zumindest versuchen soll, eine Funktion mit Anmerkungen zu versehen tf.function
? Es scheint, dass es keine Gründe gibt, es nicht zu tun, es sei denn, ich bin zu faul, um Nebenwirkungen zu entfernen oder einige Dinge wie range()
-> zu ändern tf.range()
. Aber wenn ich dazu bereit bin ...
Gibt es einen Grund, nicht @tf.function
für alle Funktionen zu verwenden?
quelle
tensorflow0.1
,tensorflow0.2
,tensorflow0.3
,tensorflow0.4
,tensorflow0.5
und so weiter, sowie ein Tag für jede diesertf
Module und Klassen dann. Fügen Sie außerdem ein Tag für jedes Standardmodul von Python sowie für seine Funktionen und Klassen hinzu.tf.function
Anleitung "Dekorieren Sie Funktionen auf Modulebene und Methoden von Klassen auf Modulebene und vermeiden Sie das Dekorieren lokaler Funktionen oder Methoden". Ich scheine mich an explizitere Formulierungen zu erinnern, wie "nicht jede Funktion dekorieren,tf.function
in übergeordneten Funktionen verwenden, wie eine Trainingsschleife", aber ich kann mich falsch erinnern (oder vielleicht wurde sie entfernt). OTOH, diese Diskussion hat interessante Beiträge von Entwicklern, am Ende scheint es in Ordnung zu sein, sie in etwa jeder Funktion für Tensoren / Vars zu verwenden.@tf.function
kommentierte Funktionen kompilieren auch die Funktionen, die sie selbst für Diagramme aufrufen. Sie müssten also nur den Einstiegspunkt in das Modul mit Anmerkungen versehen, der mit Ihrer Beschreibung übereinstimmt. Es würde aber auch nicht schaden, Funktionen weiter unten im Aufrufstapel manuell zu kommentieren.tf.function
Benutzer mehrmals aufgerufen wird, kann dies die "Codeduplizierung" in der Grafik nicht verhindern, weshalb eine weit verbreitete Verwendung empfehlenswert erscheint.Antworten:
TLDR: Es hängt von Ihrer Funktion ab und davon, ob Sie in Produktion oder Entwicklung sind. Nicht verwenden,
tf.function
wenn Sie Ihre Funktion einfach debuggen möchten oder wenn sie unter die Einschränkungen der AutoGraph- oder tf.v1-Codekompatibilität fällt. Ich würde wärmstens empfehlen, die Inside TensorFlow-Vorträge über AutoGraph und Funktionen zu sehen, nicht über Sitzungen .Im Folgenden werde ich die Gründe aufschlüsseln, die alle aus Informationen stammen, die Google online zur Verfügung gestellt hat.
Im Allgemeinen
tf.function
bewirkt der Dekorator, dass eine Funktion als aufrufbare Funktion kompiliert wird, die ein TensorFlow-Diagramm ausführt. Dies beinhaltet:Zu den dahinter stehenden Gestaltungsideen stehen detaillierte Informationen zur Verfügung.
Vorteile der Dekoration einer Funktion mit
tf.function
Allgemeine Vorteile
Für Funktionen mit Python-Code / Verwenden von AutoGraph über
tf.function
DekorationWenn Sie AutoGraph verwenden möchten, wird die Verwendung
tf.function
dringend empfohlen, wenn Sie AutoGraph direkt aufrufen. Gründe hierfür sind: Automatische Steuerungsabhängigkeiten, die für einige APIs, mehr Caching und Ausnahmehilfen (Quelle) erforderlich sind .Nachteile der Dekoration einer Funktion mit
tf.function
Allgemeine Nachteile
Für Funktionen mit Python-Code / Verwenden von AutoGraph über
tf.function
DekorationDetaillierte Informationen zu AutoGraph-Einschränkungen sind verfügbar.
Für Funktionen mit tf.v1-Code
tf.function
, dies kann sich jedoch ändern, da der tf.v1-Code ausläuft (Quelle).Für Funktionen mit tf.v2-Code
Beispiele für Einschränkungen
Variablen mehrmals erstellen
Es ist nicht zulässig, Variablen mehrmals zu erstellen, wie
v
im folgenden Beispiel:Im folgenden Code wird dies gemindert, indem sichergestellt
self.v
wird , dass dieser nur einmal erstellt wird:Versteckte Nebenwirkungen, die nicht von AutoGraph erfasst wurden
Änderungen wie
self.a
in diesem Beispiel können nicht ausgeblendet werden, was zu einem Fehler führt, da (noch) keine funktionsübergreifende Analyse durchgeführt wird (Quelle) :Änderungen in der Sicht sind kein Problem:
Beispiel für eine Einschränkung aufgrund des TF-Kontrollflusses
Diese if-Anweisung führt zu einem Fehler, da der Wert für else für den TF-Steuerungsfluss definiert werden muss:
quelle
@tf.function
für die Produktion, sondern nur für die Entwicklung verwenden sollte, ist keine praktikable Lösung. Erstens schafft beim maschinellen Lernen (zumindest in der Forschung) das Training während der Entwicklungsphase auch das Endprodukt (das trainierte Modell). Zweitens sind Dekorateure eine bedeutende Veränderung. Ich kann sie nicht einfach "nach der Entwicklung" einfügen und sicherstellen, dass sich der Code gleich verhält. Das bedeutet, dass ich sie schon dort entwickeln und testen muss.tf.function
gegebenenfalls hinzu.tf.function ist nützlich beim Erstellen und Verwenden von Berechnungsgraphen. Sie sollten im Training und in der Bereitstellung verwendet werden, werden jedoch für die meisten Ihrer Funktionen nicht benötigt.
Nehmen wir an, wir bauen eine spezielle Schicht, die von einem größeren Modell getrennt sein wird. Wir möchten nicht, dass der tf.function-Dekorator über der Funktion steht, die diese Ebene erstellt, da er lediglich definiert, wie die Ebene aussehen wird.
Nehmen wir andererseits an, wir werden entweder eine Vorhersage treffen oder unser Training mit einer Funktion fortsetzen. Wir möchten, dass der Dekorator tf.funktion ist, da wir tatsächlich das Berechnungsdiagramm verwenden, um einen Wert zu erhalten.
Ein gutes Beispiel wäre die Konstruktion eines Encoder-Decoder-Modells. Setzen Sie den Dekorateur NICHT um die Funktion, um den Encoder oder Decoder oder eine beliebige Ebene zu erstellen. Dies ist nur eine Definition dessen, was er tun wird. Stellen Sie den Dekorateur auf die Methode "Zug" oder "Vorhersage", da diese tatsächlich den Berechnungsgraphen für die Berechnung verwenden.
quelle
tf.range()
. AFAIK diese können nicht automatisch konvertiert werden. Daher müsste ich meine benutzerdefinierten Ebenen von Anfang an unter Berücksichtigung des automatischen Diagramms schreiben. Daher kann ich die aufrufende (Vorhersage-) Funktion nicht einfach dekorieren.