Path: blob/master/site/es-419/guide/graph_optimization.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
Optimización del gráfico de TensorFlow con Grappler
Descripción general
TensorFlow usa gráficos y ejecuciones de forma "eager" para ejecutar cálculos. Un tf.Graph
contiene un conjunto de objetos tf.Operation
(operaciones) que representan unidades de cálculo y objetos tf.Tensor
que representan las unidades de datos que fluyen entre las operaciones.
Grappler es el sistema de optimización de gráficos predeterminado en el tiempo de ejecución de TensorFlow. Grappler aplica las optimizaciones en el modo de gráfico (dentro de tf.function
) para mejorar el rendimiento de sus cálculos de TensorFlow mediante la simplificación de gráficos y otras optimizaciones de alto nivel como la incrustación de cuerpos de función para habilitar las optimizaciones en el procedimiento. Al optimizar el tf.Graph
también se reduce el uso máximo de la memoria y mejora el uso de hardware al optimizar el mapeo de los nodos de los gráficos para calcular los recursos.
Use tf.config.optimizer.set_experimental_options()
para tener un control más específico de sus optimizaciones de tf.Graph
.
Optimizadores de gráficos disponibles
Grappler realiza las optimizaciones de gráfico mediante un controlador de nivel superior llamado MetaOptimizer
. Los siguientes optimizadores de gráficos están disponibles con TensorFlow:
Optimizador de plegado continuo: Infiere estadísticamente el valor de los tensores, siempre que sea posible, al plegar de forma continua los nodos en el gráfico y materializa el resultado con constantes.
Optimizador aritmético: Simplifica las operaciones aritméticas mediante la eliminación de subexpresiones y la simplificación de las declaraciones aritméticas.
Optimizador de diseño: Optimiza el diseño del tensor para ejecutar operaciones que dependen del formato de los datos de forma más eficiente, como las convoluciones.
Optimizador de reasignación: Reasigna subgráficos en implementaciones más eficientes al reemplazar los subgráficos que ocurren comúnmente con kernels monolíticos fusionados y optimizados.
Optimizador de memoria: Analiza el gráfico para inspeccionar el uso máximo de la memoria para cada operación e inserta las operaciones de copia de la memoria CPU-GPU para intercambiar la memoria GPU por la CPU para reducir el uso máximo de memoria.
Optimizador de dependencias: Elimina o reorganiza las dependencias de control para acortar la ruta de acceso crítica para un paso del modelo o habilita otras optimizaciones. También elimina los nodos que nos son efectivamente operaciones, como Identidad.
Optimizador de eliminación de entradas: Elimina los nodos que no afectan a la salida de los gráficos. Suele ejecutarse primero para reducir el tamaño del gráfico y acelerar el proceso en otras pasadas de Grappler.
Optimizador de función: Optimiza la biblioteca de funciones de un programa de TensorFlow e inserta los cuerpos de función para habilitar otras optimizaciones en el procedimiento.
Optimizador de forma: Optimiza los subgráficos que funcionan en la forma y en la información relacionada con la forma.
Optimizador de paralelismo automático: Arregla los gráficos en paralelo al dividirlos por toda la dimensión del lote. Este optimizador está DESACTIVADO de forma predeterminada.
Optimizador de bucles: Optimiza el flujo de control del gráfico al elevar los subgráficos de bucle invariable desde bucles y al remover las operaciones apiladas redundantes en los bucles. También optimiza los bucles con conteos de puntos de intervalos conocidos y elimina las ramas muertas conocidas estadísticamente en condicionales.
Optimizador de asignador de ámbito: Agrega asignadores de ámbito para reducir el movimiento de datos y para consolidar algunas operaciones.
Marcador para alojar en optimizador/em0}: Intercambia pequeñas operaciones en el CPU. Este optimizador está DESACTIVADO de forma predeterminada.
Optimizador de precisión mixta automática Convierte los tipos de datos en float16 según corresponda para mejorar el rendimiento. Actualmente, solo aplica para las memorias GPU.
Depurador: Saca los nodos relacionados con las operaciones de depuración como
tf.debugging.check_numerics
ytf.print
del gráfico. Este optimizador está DESACTIVADO de forma predeterminada.
Preparación
Cree un administrador de contexto para alternar entre los estados del optimizador.
Comparar el rendimiento de ejecución con o sin Grappler
TensorFlow 2 y posteriores ejecutan de forma eager de forma predeterminada. Use tf.function
para cambiar la ejecución predeterminada al modo de gráfico. Grappler se ejecuta automáticamente en segundo plano para aplicar las optimizaciones de gráfico mencionadas anteriormente y mejorar el rendimiento de la ejecución.
Optimizador de pliegue continuo
Como un ejemplo preliminar, considere una función que realiza operaciones en constantes y devuelve una salida.
Desactive el optimizador de pliegue de constante y ejecute la función:
Active el optimizador de pliegue de constante y vuelva a ejecutar la función para observar como acelera la ejecución de la función.
Optimizador de depuración
Considere una función simple que verifique el valor numérico de su argumento de entrada y que lo devuelva.
Primero, ejecute la función con el optimizador de depuración desactivado.
tf.debugging.check_numerics
provoca un error de argumento debido al argumento Inf
en el test_func
.
Habilite el optimizador de depuración y vuelva a ejecutar la función.
El optimizador de depuración saca el nodo tf.debug.check_numerics
del gráfico y ejecuta la función sin provocar errores.
Resumen
El tiempo de ejecución de TensorFlow usa Grappler para optimizar los gráficos automáticamente antes de la ejecución. Use tf.config.optimizer.set_experimental_options
para habilitar o deshabilitar los distintos optimizadores de gráficos.
Para obtener más información sobre Grappler, consulte Optimizaciones de gráfico de TensorFlow.