Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Graphausführung | Grundlagen von Tensorflow
Einführung in TensorFlow

bookGraphausführung

Funktionsdekorator

Ein Funktionsdekorator ist ein Werkzeug, das eine Funktion „umhüllt“, um deren Verhalten zu verändern. In TensorFlow ist der am häufigsten verwendete Dekorator @tf.function, der eine Python-Funktion in einen TensorFlow-Graphen umwandelt.

Zweck von @tf.function

Der Hauptzweck der Verwendung von Dekoratoren wie @tf.function besteht darin, Berechnungen zu optimieren. Wenn eine Funktion mit @tf.function dekoriert wird, wandelt TensorFlow die Funktion in einen hocheffizienten Graphen um, der deutlich schneller ausgeführt werden kann, insbesondere bei komplexen Operationen. Diese Umwandlung ermöglicht es TensorFlow, Optimierungen anzuwenden und Parallelität zu nutzen, was für die Leistung bei Aufgaben des maschinellen Lernens entscheidend ist.

Beispiel

Ein Beispiel wird zur besseren Verständlichkeit bereitgestellt.

1234567891011
import tensorflow as tf # Define a simple function and decorate it with `@tf.function` @tf.function def compute_area(radius): return 3.1415 * radius ** 2 # Call the function area = compute_area(tf.constant(3.0)) print(f"The area is: {area.numpy()}")
copy

In diesem Code wird compute_area() in einen TensorFlow-Graphen umgewandelt, wodurch die Ausführung schneller und effizienter erfolgt.

Wie funktioniert die Graph-Ausführung?

TensorFlow arbeitet in zwei Modi: Eager Execution und Graph Execution. Standardmäßig läuft TensorFlow im Eager Execution-Modus, das heißt, Operationen werden unmittelbar bei ihrer Definition ausgeführt, was eine flexible und intuitive Schnittstelle bietet. Eager Execution kann jedoch weniger effizient für komplexe Berechnungen und großskalige Modelle sein.

Hier kommen @tf.function und die Graph-Ausführung ins Spiel. Wenn eine Funktion mit dem @tf.function-Dekorator versehen wird, wandelt TensorFlow diese Funktion in einen statischen Berechnungsgraphen von Operationen um.

Optimierungstechniken

  1. Graph-Optimierung: TensorFlow optimiert den Graphen, indem ungenutzte Knoten entfernt, doppelte Teilgraphen zusammengeführt und weitere Optimierungen auf Graph-Ebene durchgeführt werden. Dies führt zu einer schnelleren Ausführung und reduziertem Speicherverbrauch.
  2. Schnellere Ausführung: Graphen werden schneller ausgeführt als Eager-Operationen, da der Python-Overhead reduziert wird. Python ist an der Ausführung des Graphen nicht beteiligt, wodurch der Overhead von Python-Interpreter-Aufrufen entfällt.
  3. Parallelisierung und Verteilung: Graphen ermöglichen es TensorFlow, Möglichkeiten zur Parallelisierung leicht zu erkennen und Berechnungen auf mehrere Geräte wie CPUs und GPUs zu verteilen.
  4. Caching und Wiederverwendung: Wenn eine mit @tf.function dekorierte Funktion mit derselben Eingabesignatur aufgerufen wird, verwendet TensorFlow den zuvor erstellten Graphen erneut, wodurch das erneute Erstellen des Graphen vermieden und Zeit gespart wird.

Beispiel mit Gradient Tape

1234567891011
import tensorflow as tf @tf.function def compute_gradient(x): with tf.GradientTape() as tape: y = x * x * x return tape.gradient(y, x) x = tf.Variable(3.0) grad = compute_gradient(x) print(f"The gradient at x = {x.numpy()} is {grad.numpy()}")
copy

In diesem Beispiel ist compute_gradient eine Funktion, die das Gradienten von y = x^3 an einem gegebenen Punkt x berechnet. Der Dekorator @tf.function stellt sicher, dass die Funktion als TensorFlow-Graph ausgeführt wird.

Beispiel mit bedingter Logik

1234567891011121314
import tensorflow as tf @tf.function def compute_gradient_conditional(x): with tf.GradientTape() as tape: if tf.reduce_sum(x) > 0: y = x * x else: y = x * x * x return tape.gradient(y, x) x = tf.Variable([-2.0, 2.0]) grad = compute_gradient_conditional(x) print(f"The gradient at x = {x.numpy()} is {grad.numpy()}")
copy

In diesem Beispiel berechnet die Funktion unterschiedliche Gradienten basierend auf einer Bedingung. TensorFlows @tf.function konvertiert nicht nur den statischen Berechnungsgraphen, sondern verarbeitet auch dynamische Elemente wie Bedingungen und Schleifen effektiv.

Aufgabe

Swipe to start coding

In dieser Aufgabe vergleichen Sie die Ausführungszeiten von zwei TensorFlow-Funktionen, die eine Matrixmultiplikation durchführen: eine mit dem @tf.function-Decorator und eine ohne.

Schritte

  1. Definieren Sie die Funktion matrix_multiply_optimized und stellen Sie sicher, dass sie den @tf.function-Decorator enthält.
  2. Vervollständigen Sie beide Funktionen, indem Sie den Mittelwert der resultierenden Matrizen berechnen.
  3. Erzeugen Sie zwei gleichmäßig verteilte Zufallsmatrizen mit den Zufallsmatrix-Generierungsfunktionen von TensorFlow.

Lösung

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 2
single

single

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

close

Awesome!

Completion rate improved to 5.56

bookGraphausführung

Swipe um das Menü anzuzeigen

Funktionsdekorator

Ein Funktionsdekorator ist ein Werkzeug, das eine Funktion „umhüllt“, um deren Verhalten zu verändern. In TensorFlow ist der am häufigsten verwendete Dekorator @tf.function, der eine Python-Funktion in einen TensorFlow-Graphen umwandelt.

Zweck von @tf.function

Der Hauptzweck der Verwendung von Dekoratoren wie @tf.function besteht darin, Berechnungen zu optimieren. Wenn eine Funktion mit @tf.function dekoriert wird, wandelt TensorFlow die Funktion in einen hocheffizienten Graphen um, der deutlich schneller ausgeführt werden kann, insbesondere bei komplexen Operationen. Diese Umwandlung ermöglicht es TensorFlow, Optimierungen anzuwenden und Parallelität zu nutzen, was für die Leistung bei Aufgaben des maschinellen Lernens entscheidend ist.

Beispiel

Ein Beispiel wird zur besseren Verständlichkeit bereitgestellt.

1234567891011
import tensorflow as tf # Define a simple function and decorate it with `@tf.function` @tf.function def compute_area(radius): return 3.1415 * radius ** 2 # Call the function area = compute_area(tf.constant(3.0)) print(f"The area is: {area.numpy()}")
copy

In diesem Code wird compute_area() in einen TensorFlow-Graphen umgewandelt, wodurch die Ausführung schneller und effizienter erfolgt.

Wie funktioniert die Graph-Ausführung?

TensorFlow arbeitet in zwei Modi: Eager Execution und Graph Execution. Standardmäßig läuft TensorFlow im Eager Execution-Modus, das heißt, Operationen werden unmittelbar bei ihrer Definition ausgeführt, was eine flexible und intuitive Schnittstelle bietet. Eager Execution kann jedoch weniger effizient für komplexe Berechnungen und großskalige Modelle sein.

Hier kommen @tf.function und die Graph-Ausführung ins Spiel. Wenn eine Funktion mit dem @tf.function-Dekorator versehen wird, wandelt TensorFlow diese Funktion in einen statischen Berechnungsgraphen von Operationen um.

Optimierungstechniken

  1. Graph-Optimierung: TensorFlow optimiert den Graphen, indem ungenutzte Knoten entfernt, doppelte Teilgraphen zusammengeführt und weitere Optimierungen auf Graph-Ebene durchgeführt werden. Dies führt zu einer schnelleren Ausführung und reduziertem Speicherverbrauch.
  2. Schnellere Ausführung: Graphen werden schneller ausgeführt als Eager-Operationen, da der Python-Overhead reduziert wird. Python ist an der Ausführung des Graphen nicht beteiligt, wodurch der Overhead von Python-Interpreter-Aufrufen entfällt.
  3. Parallelisierung und Verteilung: Graphen ermöglichen es TensorFlow, Möglichkeiten zur Parallelisierung leicht zu erkennen und Berechnungen auf mehrere Geräte wie CPUs und GPUs zu verteilen.
  4. Caching und Wiederverwendung: Wenn eine mit @tf.function dekorierte Funktion mit derselben Eingabesignatur aufgerufen wird, verwendet TensorFlow den zuvor erstellten Graphen erneut, wodurch das erneute Erstellen des Graphen vermieden und Zeit gespart wird.

Beispiel mit Gradient Tape

1234567891011
import tensorflow as tf @tf.function def compute_gradient(x): with tf.GradientTape() as tape: y = x * x * x return tape.gradient(y, x) x = tf.Variable(3.0) grad = compute_gradient(x) print(f"The gradient at x = {x.numpy()} is {grad.numpy()}")
copy

In diesem Beispiel ist compute_gradient eine Funktion, die das Gradienten von y = x^3 an einem gegebenen Punkt x berechnet. Der Dekorator @tf.function stellt sicher, dass die Funktion als TensorFlow-Graph ausgeführt wird.

Beispiel mit bedingter Logik

1234567891011121314
import tensorflow as tf @tf.function def compute_gradient_conditional(x): with tf.GradientTape() as tape: if tf.reduce_sum(x) > 0: y = x * x else: y = x * x * x return tape.gradient(y, x) x = tf.Variable([-2.0, 2.0]) grad = compute_gradient_conditional(x) print(f"The gradient at x = {x.numpy()} is {grad.numpy()}")
copy

In diesem Beispiel berechnet die Funktion unterschiedliche Gradienten basierend auf einer Bedingung. TensorFlows @tf.function konvertiert nicht nur den statischen Berechnungsgraphen, sondern verarbeitet auch dynamische Elemente wie Bedingungen und Schleifen effektiv.

Aufgabe

Swipe to start coding

In dieser Aufgabe vergleichen Sie die Ausführungszeiten von zwei TensorFlow-Funktionen, die eine Matrixmultiplikation durchführen: eine mit dem @tf.function-Decorator und eine ohne.

Schritte

  1. Definieren Sie die Funktion matrix_multiply_optimized und stellen Sie sicher, dass sie den @tf.function-Decorator enthält.
  2. Vervollständigen Sie beide Funktionen, indem Sie den Mittelwert der resultierenden Matrizen berechnen.
  3. Erzeugen Sie zwei gleichmäßig verteilte Zufallsmatrizen mit den Zufallsmatrix-Generierungsfunktionen von TensorFlow.

Lösung

Switch to desktopWechseln Sie zum Desktop, um in der realen Welt zu übenFahren Sie dort fort, wo Sie sind, indem Sie eine der folgenden Optionen verwenden
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 2
single

single

some-alt