Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Exécution de Graphe | Notions de Base de TensorFlow
Introduction à TensorFlow

bookExécution de Graphe

Décorateur de fonction

Un décorateur de fonction est un outil qui « enveloppe » une fonction afin de modifier son comportement. Dans TensorFlow, le décorateur le plus couramment utilisé est @tf.function, qui convertit une fonction Python en un graphe TensorFlow.

Objectif de @tf.function

L'objectif principal de l'utilisation de décorateurs comme @tf.function est d'optimiser les calculs. Lorsqu'une fonction est décorée avec @tf.function, TensorFlow convertit la fonction en un graphe hautement efficace pouvant être exécuté beaucoup plus rapidement, notamment pour les opérations complexes. Cette conversion permet à TensorFlow d'appliquer des optimisations et d'exploiter le parallélisme, ce qui est essentiel pour les performances dans les tâches d'apprentissage automatique.

Exemple

Un exemple est fourni pour une meilleure compréhension.

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

Dans ce code, compute_area() est convertie en un graphe TensorFlow, ce qui permet une exécution plus rapide et plus efficace.

Fonctionnement de l’exécution par graphe

TensorFlow fonctionne selon deux modes : Exécution immédiate et Exécution par graphe. Par défaut, TensorFlow s’exécute en mode Exécution immédiate, ce qui signifie que les opérations sont exécutées au fur et à mesure de leur définition, offrant ainsi une interface flexible et intuitive. Cependant, l’exécution immédiate peut être moins efficace pour les calculs complexes et les modèles à grande échelle.

C’est ici qu’interviennent @tf.function et l’exécution par graphe. Lorsque le décorateur @tf.function est appliqué à une fonction, TensorFlow convertit cette fonction en graphe statique de calculs.

Techniques d'optimisation

  1. Optimisation du graphe : TensorFlow optimise le graphe en supprimant les nœuds inutilisés, en fusionnant les sous-graphes dupliqués et en effectuant d'autres optimisations au niveau du graphe. Cela permet une exécution plus rapide et une utilisation réduite de la mémoire.
  2. Exécution plus rapide : les graphes sont exécutés plus rapidement que les opérations en mode eager car ils réduisent la surcharge liée à Python. Python n'intervient pas dans l'exécution du graphe, ce qui élimine la surcharge des appels à l'interpréteur Python.
  3. Parallélisme et distribution : les graphes permettent à TensorFlow d'identifier facilement les opportunités de parallélisme et de distribuer les calculs sur plusieurs dispositifs, tels que les CPU et les GPU.
  4. Mise en cache et réutilisation : lorsqu'une fonction décorée avec @tf.function est appelée avec la même signature d'entrée, TensorFlow réutilise le graphe précédemment créé, évitant ainsi de devoir le recréer, ce qui permet de gagner du temps.

Exemple avec 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

Dans cet exemple, compute_gradient est une fonction qui calcule le gradient de y = x^3 en un point donné x. Le décorateur @tf.function garantit que la fonction est exécutée en tant que graphe TensorFlow.

Exemple avec logique conditionnelle

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

Dans cet exemple, la fonction calcule différents gradients en fonction d'une condition. Le décorateur @tf.function de TensorFlow ne se contente pas de convertir le graphe de calcul statique, il gère également efficacement les éléments dynamiques tels que les conditionnelles et les boucles.

Tâche

Swipe to start coding

Dans cette tâche, vous allez comparer les temps d'exécution de deux fonctions TensorFlow effectuant une multiplication de matrices : l'une avec le décorateur @tf.function et l'autre sans celui-ci.

Étapes

  1. Définir la fonction matrix_multiply_optimized en veillant à inclure le décorateur @tf.function.
  2. Compléter les deux fonctions en calculant la moyenne des matrices résultantes.
  3. Générer deux matrices aléatoires à distribution uniforme à l'aide des fonctions de génération de matrices aléatoires de TensorFlow.

Solution

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 2
single

single

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

Can you explain the difference between Eager Execution and Graph Execution in more detail?

How does TensorFlow handle conditionals and loops inside a @tf.function?

Can you provide more examples of using @tf.function with different types of functions?

close

Awesome!

Completion rate improved to 5.56

bookExécution de Graphe

Glissez pour afficher le menu

Décorateur de fonction

Un décorateur de fonction est un outil qui « enveloppe » une fonction afin de modifier son comportement. Dans TensorFlow, le décorateur le plus couramment utilisé est @tf.function, qui convertit une fonction Python en un graphe TensorFlow.

Objectif de @tf.function

L'objectif principal de l'utilisation de décorateurs comme @tf.function est d'optimiser les calculs. Lorsqu'une fonction est décorée avec @tf.function, TensorFlow convertit la fonction en un graphe hautement efficace pouvant être exécuté beaucoup plus rapidement, notamment pour les opérations complexes. Cette conversion permet à TensorFlow d'appliquer des optimisations et d'exploiter le parallélisme, ce qui est essentiel pour les performances dans les tâches d'apprentissage automatique.

Exemple

Un exemple est fourni pour une meilleure compréhension.

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

Dans ce code, compute_area() est convertie en un graphe TensorFlow, ce qui permet une exécution plus rapide et plus efficace.

Fonctionnement de l’exécution par graphe

TensorFlow fonctionne selon deux modes : Exécution immédiate et Exécution par graphe. Par défaut, TensorFlow s’exécute en mode Exécution immédiate, ce qui signifie que les opérations sont exécutées au fur et à mesure de leur définition, offrant ainsi une interface flexible et intuitive. Cependant, l’exécution immédiate peut être moins efficace pour les calculs complexes et les modèles à grande échelle.

C’est ici qu’interviennent @tf.function et l’exécution par graphe. Lorsque le décorateur @tf.function est appliqué à une fonction, TensorFlow convertit cette fonction en graphe statique de calculs.

Techniques d'optimisation

  1. Optimisation du graphe : TensorFlow optimise le graphe en supprimant les nœuds inutilisés, en fusionnant les sous-graphes dupliqués et en effectuant d'autres optimisations au niveau du graphe. Cela permet une exécution plus rapide et une utilisation réduite de la mémoire.
  2. Exécution plus rapide : les graphes sont exécutés plus rapidement que les opérations en mode eager car ils réduisent la surcharge liée à Python. Python n'intervient pas dans l'exécution du graphe, ce qui élimine la surcharge des appels à l'interpréteur Python.
  3. Parallélisme et distribution : les graphes permettent à TensorFlow d'identifier facilement les opportunités de parallélisme et de distribuer les calculs sur plusieurs dispositifs, tels que les CPU et les GPU.
  4. Mise en cache et réutilisation : lorsqu'une fonction décorée avec @tf.function est appelée avec la même signature d'entrée, TensorFlow réutilise le graphe précédemment créé, évitant ainsi de devoir le recréer, ce qui permet de gagner du temps.

Exemple avec 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

Dans cet exemple, compute_gradient est une fonction qui calcule le gradient de y = x^3 en un point donné x. Le décorateur @tf.function garantit que la fonction est exécutée en tant que graphe TensorFlow.

Exemple avec logique conditionnelle

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

Dans cet exemple, la fonction calcule différents gradients en fonction d'une condition. Le décorateur @tf.function de TensorFlow ne se contente pas de convertir le graphe de calcul statique, il gère également efficacement les éléments dynamiques tels que les conditionnelles et les boucles.

Tâche

Swipe to start coding

Dans cette tâche, vous allez comparer les temps d'exécution de deux fonctions TensorFlow effectuant une multiplication de matrices : l'une avec le décorateur @tf.function et l'autre sans celui-ci.

Étapes

  1. Définir la fonction matrix_multiply_optimized en veillant à inclure le décorateur @tf.function.
  2. Compléter les deux fonctions en calculant la moyenne des matrices résultantes.
  3. Générer deux matrices aléatoires à distribution uniforme à l'aide des fonctions de génération de matrices aléatoires de TensorFlow.

Solution

Switch to desktopPassez à un bureau pour une pratique réelleContinuez d'où vous êtes en utilisant l'une des options ci-dessous
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 2
single

single

some-alt