Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Graph-Ausführung | Grundlagen von TensorFlow
Einführung in TensorFlow
course content

Kursinhalt

Einführung in TensorFlow

Einführung in TensorFlow

1. Tensoren
2. Grundlagen von TensorFlow

book
Graph-Ausführung

Funktions-Dekorator

Ein Funktions-Dekorator ist ein Werkzeug, das eine Funktion 'umhüllt', um ihr Verhalten zu ä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 ist, wandelt TensorFlow die Funktion in einen hocheffizienten Graphen um, der viel schneller ausgeführt werden kann, insbesondere bei komplexen Operationen. Diese Umwandlung ermöglicht es TensorFlow, Optimierungen anzuwenden und Parallelität auszunutzen, was für die Leistung bei maschinellen Lernaufgaben entscheidend ist.

Beispiel

Lassen Sie uns ein Beispiel durchgehen, um es besser zu verstehen.

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 es schneller und effizienter ausgeführt wird.

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, was bedeutet, dass Operationen ausgeführt werden, sobald sie definiert sind, und eine flexible und intuitive Schnittstelle bieten. Allerdings kann Eager Execution weniger effizient für komplexe Berechnungen und groß angelegte Modelle sein.

Hier kommen @tf.function und die Graph-Ausführung ins Spiel. Wenn Sie den @tf.function Dekorator auf eine Funktion anwenden, 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 andere Optimierungen auf Graph-Ebene durchgeführt werden. Dies führt zu schnellerer Ausführung und reduziertem Speicherverbrauch;

  2. Schnellere Ausführung: Graphen werden schneller ausgeführt als Eager-Operationen, da sie den Python-Overhead reduzieren. Python ist nicht an der Ausführung des Graphen beteiligt, was den Overhead von Python-Interpreter-Aufrufen eliminiert;

  3. Parallelität und Verteilung: Graphen ermöglichen es TensorFlow, leicht Möglichkeiten zur Parallelität zu identifizieren 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 die Notwendigkeit entfällt, den Graphen neu zu erstellen, was Zeit spart.

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 den Gradient von y = x^3 an einem gegebenen Punkt x berechnet. Der @tf.function Dekorator stellt sicher, dass die Funktion als ein 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 handhabt auch dynamische Elemente wie Bedingungen und Schleifen effektiv.

Aufgabe

Swipe to start coding

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

Schritte

  1. Definieren Sie die Funktion matrix_multiply_optimized und stellen Sie sicher, dass sie den @tf.function Dekorator 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
toggle bottom row

book
Graph-Ausführung

Funktions-Dekorator

Ein Funktions-Dekorator ist ein Werkzeug, das eine Funktion 'umhüllt', um ihr Verhalten zu ä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 ist, wandelt TensorFlow die Funktion in einen hocheffizienten Graphen um, der viel schneller ausgeführt werden kann, insbesondere bei komplexen Operationen. Diese Umwandlung ermöglicht es TensorFlow, Optimierungen anzuwenden und Parallelität auszunutzen, was für die Leistung bei maschinellen Lernaufgaben entscheidend ist.

Beispiel

Lassen Sie uns ein Beispiel durchgehen, um es besser zu verstehen.

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 es schneller und effizienter ausgeführt wird.

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, was bedeutet, dass Operationen ausgeführt werden, sobald sie definiert sind, und eine flexible und intuitive Schnittstelle bieten. Allerdings kann Eager Execution weniger effizient für komplexe Berechnungen und groß angelegte Modelle sein.

Hier kommen @tf.function und die Graph-Ausführung ins Spiel. Wenn Sie den @tf.function Dekorator auf eine Funktion anwenden, 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 andere Optimierungen auf Graph-Ebene durchgeführt werden. Dies führt zu schnellerer Ausführung und reduziertem Speicherverbrauch;

  2. Schnellere Ausführung: Graphen werden schneller ausgeführt als Eager-Operationen, da sie den Python-Overhead reduzieren. Python ist nicht an der Ausführung des Graphen beteiligt, was den Overhead von Python-Interpreter-Aufrufen eliminiert;

  3. Parallelität und Verteilung: Graphen ermöglichen es TensorFlow, leicht Möglichkeiten zur Parallelität zu identifizieren 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 die Notwendigkeit entfällt, den Graphen neu zu erstellen, was Zeit spart.

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 den Gradient von y = x^3 an einem gegebenen Punkt x berechnet. Der @tf.function Dekorator stellt sicher, dass die Funktion als ein 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 handhabt auch dynamische Elemente wie Bedingungen und Schleifen effektiv.

Aufgabe

Swipe to start coding

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

Schritte

  1. Definieren Sie die Funktion matrix_multiply_optimized und stellen Sie sicher, dass sie den @tf.function Dekorator 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
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
We're sorry to hear that something went wrong. What happened?
some-alt