Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Esecuzione del Grafo | Basi di TensorFlow
Introduzione a TensorFlow

bookEsecuzione del Grafo

Decoratore di Funzione

Un decoratore di funzione è uno strumento che "avvolge" una funzione per modificarne il comportamento. In TensorFlow, il decoratore più comunemente utilizzato è @tf.function, che converte una funzione Python in un grafo TensorFlow.

Scopo di @tf.function

Lo scopo principale dell'utilizzo di decoratori come @tf.function è ottimizzare i calcoli. Quando una funzione è decorata con @tf.function, TensorFlow converte la funzione in un grafo altamente efficiente che può essere eseguito molto più rapidamente, in particolare per operazioni complesse. Questa conversione consente a TensorFlow di applicare ottimizzazioni e sfruttare il parallelismo, aspetto fondamentale per le prestazioni nei compiti di machine learning.

Esempio

Un esempio è fornito per una migliore comprensione.

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 questo codice, compute_area() viene convertita in un grafo TensorFlow, rendendo l'esecuzione più veloce ed efficiente.

Come funziona l'esecuzione tramite grafo?

TensorFlow opera in due modalità: Esecuzione Eager ed Esecuzione tramite Grafo. Per impostazione predefinita, TensorFlow esegue in modalità Eager, il che significa che le operazioni vengono eseguite man mano che vengono definite, offrendo un'interfaccia flessibile e intuitiva. Tuttavia, l'esecuzione Eager può essere meno efficiente per calcoli complessi e modelli su larga scala.

Qui entrano in gioco @tf.function e l'esecuzione tramite grafo. Quando si utilizza il decoratore @tf.function su una funzione, TensorFlow converte quella funzione in un grafo statico di operazioni.

Tecniche di Ottimizzazione

  1. Ottimizzazione del Grafo: TensorFlow ottimizza il grafo eliminando i nodi inutilizzati, unendo sottografi duplicati ed eseguendo altre ottimizzazioni a livello di grafo. Questo comporta un'esecuzione più rapida e un minore utilizzo della memoria.
  2. Esecuzione più Veloce: i grafi vengono eseguiti più rapidamente rispetto alle operazioni eager poiché riducono l'overhead di Python. Python non è coinvolto nell'esecuzione del grafo, eliminando così l'overhead delle chiamate all'interprete Python.
  3. Parallelismo e Distribuzione: i grafi consentono a TensorFlow di identificare facilmente opportunità di parallelismo e di distribuire i calcoli su più dispositivi, come CPU e GPU;
  4. Caching e Riutilizzo: quando una funzione decorata con @tf.function viene chiamata con la stessa firma di input, TensorFlow riutilizza il grafo precedentemente creato, evitando la necessità di ricrearlo e risparmiando tempo.

Esempio con 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 questo esempio, compute_gradient è una funzione che calcola il gradiente di y = x^3 in un dato punto x. Il decoratore @tf.function garantisce che la funzione venga eseguita come un grafo TensorFlow.

Esempio con logica condizionale

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 questo esempio, la funzione calcola diversi gradienti in base a una condizione. Il decoratore @tf.function di TensorFlow non solo converte il grafo di calcolo statico, ma gestisce efficacemente anche elementi dinamici come condizioni e cicli.

Compito

Swipe to start coding

In questo compito, confronterai i tempi di esecuzione di due funzioni TensorFlow che eseguono la moltiplicazione di matrici: una con il decoratore @tf.function e una senza.

Passaggi

  1. Definisci la funzione matrix_multiply_optimized assicurandoti che includa il decoratore @tf.function.
  2. Completa entrambe le funzioni calcolando la media delle matrici risultanti.
  3. Genera due matrici casuali uniformemente distribuite utilizzando le funzioni di generazione di matrici casuali di TensorFlow.

Soluzione

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 2
single

single

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

close

Awesome!

Completion rate improved to 5.56

bookEsecuzione del Grafo

Scorri per mostrare il menu

Decoratore di Funzione

Un decoratore di funzione è uno strumento che "avvolge" una funzione per modificarne il comportamento. In TensorFlow, il decoratore più comunemente utilizzato è @tf.function, che converte una funzione Python in un grafo TensorFlow.

Scopo di @tf.function

Lo scopo principale dell'utilizzo di decoratori come @tf.function è ottimizzare i calcoli. Quando una funzione è decorata con @tf.function, TensorFlow converte la funzione in un grafo altamente efficiente che può essere eseguito molto più rapidamente, in particolare per operazioni complesse. Questa conversione consente a TensorFlow di applicare ottimizzazioni e sfruttare il parallelismo, aspetto fondamentale per le prestazioni nei compiti di machine learning.

Esempio

Un esempio è fornito per una migliore comprensione.

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 questo codice, compute_area() viene convertita in un grafo TensorFlow, rendendo l'esecuzione più veloce ed efficiente.

Come funziona l'esecuzione tramite grafo?

TensorFlow opera in due modalità: Esecuzione Eager ed Esecuzione tramite Grafo. Per impostazione predefinita, TensorFlow esegue in modalità Eager, il che significa che le operazioni vengono eseguite man mano che vengono definite, offrendo un'interfaccia flessibile e intuitiva. Tuttavia, l'esecuzione Eager può essere meno efficiente per calcoli complessi e modelli su larga scala.

Qui entrano in gioco @tf.function e l'esecuzione tramite grafo. Quando si utilizza il decoratore @tf.function su una funzione, TensorFlow converte quella funzione in un grafo statico di operazioni.

Tecniche di Ottimizzazione

  1. Ottimizzazione del Grafo: TensorFlow ottimizza il grafo eliminando i nodi inutilizzati, unendo sottografi duplicati ed eseguendo altre ottimizzazioni a livello di grafo. Questo comporta un'esecuzione più rapida e un minore utilizzo della memoria.
  2. Esecuzione più Veloce: i grafi vengono eseguiti più rapidamente rispetto alle operazioni eager poiché riducono l'overhead di Python. Python non è coinvolto nell'esecuzione del grafo, eliminando così l'overhead delle chiamate all'interprete Python.
  3. Parallelismo e Distribuzione: i grafi consentono a TensorFlow di identificare facilmente opportunità di parallelismo e di distribuire i calcoli su più dispositivi, come CPU e GPU;
  4. Caching e Riutilizzo: quando una funzione decorata con @tf.function viene chiamata con la stessa firma di input, TensorFlow riutilizza il grafo precedentemente creato, evitando la necessità di ricrearlo e risparmiando tempo.

Esempio con 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 questo esempio, compute_gradient è una funzione che calcola il gradiente di y = x^3 in un dato punto x. Il decoratore @tf.function garantisce che la funzione venga eseguita come un grafo TensorFlow.

Esempio con logica condizionale

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 questo esempio, la funzione calcola diversi gradienti in base a una condizione. Il decoratore @tf.function di TensorFlow non solo converte il grafo di calcolo statico, ma gestisce efficacemente anche elementi dinamici come condizioni e cicli.

Compito

Swipe to start coding

In questo compito, confronterai i tempi di esecuzione di due funzioni TensorFlow che eseguono la moltiplicazione di matrici: una con il decoratore @tf.function e una senza.

Passaggi

  1. Definisci la funzione matrix_multiply_optimized assicurandoti che includa il decoratore @tf.function.
  2. Completa entrambe le funzioni calcolando la media delle matrici risultanti.
  3. Genera due matrici casuali uniformemente distribuite utilizzando le funzioni di generazione di matrici casuali di TensorFlow.

Soluzione

Switch to desktopCambia al desktop per esercitarti nel mondo realeContinua da dove ti trovi utilizzando una delle opzioni seguenti
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 2
single

single

some-alt