Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Execução de Grafo | Fundamentos do TensorFlow
Introdução ao TensorFlow

bookExecução de Grafo

Decorador de Função

Um decorador de função é uma ferramenta que 'envolve' uma função para modificar seu comportamento. No TensorFlow, o decorador mais utilizado é o @tf.function, que converte uma função Python em um grafo do TensorFlow.

Finalidade do @tf.function

A principal finalidade de utilizar decoradores como o @tf.function é otimizar os cálculos. Quando uma função é decorada com @tf.function, o TensorFlow converte a função em um grafo altamente eficiente que pode ser executado muito mais rapidamente, especialmente para operações complexas. Essa conversão permite que o TensorFlow aplique otimizações e explore o paralelismo, o que é fundamental para o desempenho em tarefas de aprendizado de máquina.

Exemplo

Um exemplo é fornecido para melhor compreensão.

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

Neste código, compute_area() é convertido em um grafo do TensorFlow, tornando sua execução mais rápida e eficiente.

Como funciona a execução em grafo?

O TensorFlow opera em dois modos: Execução Eager e Execução em Grafo. Por padrão, o TensorFlow executa no modo Execução Eager, o que significa que as operações são executadas conforme são definidas, proporcionando uma interface flexível e intuitiva. No entanto, a Execução Eager pode ser menos eficiente para cálculos complexos e modelos em larga escala.

É nesse contexto que @tf.function e a Execução em Grafo entram em cena. Ao utilizar o decorador @tf.function em uma função, o TensorFlow converte essa função em um grafo estático de operações computacionais.

Técnicas de Otimização

  1. Otimização de Grafo: O TensorFlow otimiza o grafo removendo nós não utilizados, mesclando subgrafos duplicados e realizando outras otimizações em nível de grafo. Isso resulta em execução mais rápida e menor uso de memória.
  2. Execução Mais Rápida: grafos são executados mais rapidamente do que operações em modo eager porque reduzem a sobrecarga do Python. O Python não está envolvido na execução do grafo, o que elimina a sobrecarga das chamadas ao interpretador Python.
  3. Paralelismo e Distribuição: grafos permitem que o TensorFlow identifique facilmente oportunidades de paralelismo e distribua os cálculos entre vários dispositivos, como CPUs e GPUs;
  4. Cache e Reutilização: quando uma função decorada com @tf.function é chamada com a mesma assinatura de entrada, o TensorFlow reutiliza o grafo previamente criado, evitando a necessidade de recriar o grafo, o que economiza tempo.

Exemplo com 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

Neste exemplo, compute_gradient é uma função que calcula o gradiente de y = x^3 em um determinado ponto x. O decorador @tf.function garante que a função seja executada como um grafo do TensorFlow.

Exemplo com Lógica Condicional

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

Neste exemplo, a função calcula gradientes diferentes com base em uma condição. O @tf.function do TensorFlow não apenas converte o grafo de computação estático, mas também lida de forma eficiente com elementos dinâmicos como condicionais e loops.

Tarefa

Swipe to start coding

Nesta tarefa, você irá comparar os tempos de execução de duas funções TensorFlow que realizam multiplicação de matrizes: uma com o decorador @tf.function e outra sem ele.

Etapas

  1. Definir a função matrix_multiply_optimized, garantindo que inclua o decorador @tf.function.
  2. Completar ambas as funções calculando a média das matrizes resultantes.
  3. Gerar duas matrizes aleatórias uniformemente distribuídas utilizando as funções de geração de matrizes aleatórias do TensorFlow.

Solução

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 2
single

single

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

close

Awesome!

Completion rate improved to 5.56

bookExecução de Grafo

Deslize para mostrar o menu

Decorador de Função

Um decorador de função é uma ferramenta que 'envolve' uma função para modificar seu comportamento. No TensorFlow, o decorador mais utilizado é o @tf.function, que converte uma função Python em um grafo do TensorFlow.

Finalidade do @tf.function

A principal finalidade de utilizar decoradores como o @tf.function é otimizar os cálculos. Quando uma função é decorada com @tf.function, o TensorFlow converte a função em um grafo altamente eficiente que pode ser executado muito mais rapidamente, especialmente para operações complexas. Essa conversão permite que o TensorFlow aplique otimizações e explore o paralelismo, o que é fundamental para o desempenho em tarefas de aprendizado de máquina.

Exemplo

Um exemplo é fornecido para melhor compreensão.

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

Neste código, compute_area() é convertido em um grafo do TensorFlow, tornando sua execução mais rápida e eficiente.

Como funciona a execução em grafo?

O TensorFlow opera em dois modos: Execução Eager e Execução em Grafo. Por padrão, o TensorFlow executa no modo Execução Eager, o que significa que as operações são executadas conforme são definidas, proporcionando uma interface flexível e intuitiva. No entanto, a Execução Eager pode ser menos eficiente para cálculos complexos e modelos em larga escala.

É nesse contexto que @tf.function e a Execução em Grafo entram em cena. Ao utilizar o decorador @tf.function em uma função, o TensorFlow converte essa função em um grafo estático de operações computacionais.

Técnicas de Otimização

  1. Otimização de Grafo: O TensorFlow otimiza o grafo removendo nós não utilizados, mesclando subgrafos duplicados e realizando outras otimizações em nível de grafo. Isso resulta em execução mais rápida e menor uso de memória.
  2. Execução Mais Rápida: grafos são executados mais rapidamente do que operações em modo eager porque reduzem a sobrecarga do Python. O Python não está envolvido na execução do grafo, o que elimina a sobrecarga das chamadas ao interpretador Python.
  3. Paralelismo e Distribuição: grafos permitem que o TensorFlow identifique facilmente oportunidades de paralelismo e distribua os cálculos entre vários dispositivos, como CPUs e GPUs;
  4. Cache e Reutilização: quando uma função decorada com @tf.function é chamada com a mesma assinatura de entrada, o TensorFlow reutiliza o grafo previamente criado, evitando a necessidade de recriar o grafo, o que economiza tempo.

Exemplo com 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

Neste exemplo, compute_gradient é uma função que calcula o gradiente de y = x^3 em um determinado ponto x. O decorador @tf.function garante que a função seja executada como um grafo do TensorFlow.

Exemplo com Lógica Condicional

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

Neste exemplo, a função calcula gradientes diferentes com base em uma condição. O @tf.function do TensorFlow não apenas converte o grafo de computação estático, mas também lida de forma eficiente com elementos dinâmicos como condicionais e loops.

Tarefa

Swipe to start coding

Nesta tarefa, você irá comparar os tempos de execução de duas funções TensorFlow que realizam multiplicação de matrizes: uma com o decorador @tf.function e outra sem ele.

Etapas

  1. Definir a função matrix_multiply_optimized, garantindo que inclua o decorador @tf.function.
  2. Completar ambas as funções calculando a média das matrizes resultantes.
  3. Gerar duas matrizes aleatórias uniformemente distribuídas utilizando as funções de geração de matrizes aleatórias do TensorFlow.

Solução

Switch to desktopMude para o desktop para praticar no mundo realContinue de onde você está usando uma das opções abaixo
Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 2
single

single

some-alt