Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Optimice el rendimiento de TensorFlow con Profiler

Use las herramientas disponibles con Profiler para rastrear el rendimiento de sus modelos TensorFlow. Vea cómo funciona su modelo en el host (CPU), el dispositivo (GPU) o en una combinación de ambos, el host y los dispositivos.

La creación de perfiles le ayuda a comprender el consumo de recursos de hardware (tiempo y memoria) de las diversas operaciones (operaciones) de TensorFlow en su modelo y resolver los cuellos de botella de rendimiento y, en última instancia, hacer que el modelo se ejecute más rápido.

Esta guía lo guiará a través de cómo instalar el Profiler, las diversas herramientas disponibles, los diferentes modos de cómo el Profiler recopila datos de rendimiento y algunas mejores prácticas recomendadas para optimizar el rendimiento del modelo.

Si desea perfilar el rendimiento de su modelo en Cloud TPU, consulte la guía de Cloud TPU .

Instale los requisitos previos de Profiler y GPU

Instale Profiler descargando y ejecutando el script install_and_run.py desde el repositorio de GitHub .

Para crear un perfil en la GPU, debe:

  1. Instale CUDA® Toolkit 10.1 o más reciente. CUDA® Toolkit 10.1 solo admite perfiles de GPU únicos. Para perfilar múltiples GPU, consulte Perfilar múltiples GPU . Asegúrese de que la versión del controlador CUDA® que instale sea al menos 440.33 para Linux o 441.22 para Windows.
  2. Asegúrese de que CUPTI exista en la ruta:
 /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
grep libcupti
 

Si no tiene CUPTI en la ruta, anteponga su directorio de instalación a la $LD_LIBRARY_PATH entorno $LD_LIBRARY_PATH ejecutando:

 export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
 

Ejecute el comando ldconfig anterior nuevamente para verificar que se encuentra la biblioteca CUPTI.

Perfile múltiples GPU

TensorFlow aún no admite oficialmente el perfil de múltiples GPU. Puede instalar CUDA® Toolkit 10.2 o posterior para perfilar múltiples GPU. Como TensorFlow admite las versiones de CUDA® Toolkit solo hasta 10.1, cree enlaces simbólicos a libcudart.so.10.1 y libcupti.so.10.1 .

 sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1
 

Para perfilar configuraciones de GPU de varios trabajadores, perfile trabajadores individuales de forma independiente.

Resolver problemas de privilegios

Cuando ejecuta la creación de perfiles con CUDA® Toolkit 10.1 en un entorno Docker o en Linux, puede encontrar problemas relacionados con privilegios CUPTI insuficientes ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Consulte los documentos de desarrollador de NVIDIA para obtener más información sobre cómo puede resolver estos problemas en Linux.

Para resolver problemas de privilegios CUPTI en un entorno Docker, ejecute

 docker run option '--privileged=true'
 

Herramientas perfiladoras

Acceda al Profiler desde la pestaña Perfil en TensorBoard que aparece solo después de haber capturado algunos datos del modelo.

Profiler tiene una selección de herramientas para ayudar con el análisis de rendimiento:

  • Página de resumen
  • Analizador de tubería de entrada
  • Estadísticas de TensorFlow
  • Visor de seguimiento
  • Estadísticas de kernel de GPU
  • Herramienta de perfil de memoria

Página de resumen

La página de resumen proporciona una vista de nivel superior de cómo se desempeñó su modelo durante una ejecución de perfil. La página le muestra una página de información general agregada para su host y todos los dispositivos, y algunas recomendaciones para mejorar el rendimiento de su entrenamiento modelo. También puede seleccionar hosts individuales en el menú desplegable Host.

La página de resumen muestra los datos de la siguiente manera:

imagen

  • Resumen de rendimiento: muestra un resumen de alto nivel del rendimiento de su modelo. El resumen de rendimiento tiene dos partes:

    1. Desglose por tiempo de paso: desglosa el tiempo de paso promedio en varias categorías de dónde se pasa el tiempo:

      • Compilación: tiempo dedicado a compilar núcleos
      • Entrada: tiempo dedicado a leer datos de entrada
      • Salida: tiempo dedicado a leer datos de salida
      • Lanzamiento de kernel: tiempo empleado por el host para iniciar kernels
      • Tiempo de cómputo del host
      • Tiempo de comunicación de dispositivo a dispositivo
      • Tiempo de cálculo en el dispositivo
      • Todos los demás, incluidos los gastos generales de Python
    2. Precisiones de cálculo del dispositivo: informa el porcentaje del tiempo de cálculo del dispositivo que utiliza cálculos de 16 y 32 bits

  • Gráfico de tiempo de paso: muestra un gráfico del tiempo de paso del dispositivo (en milisegundos) sobre todos los pasos muestreados. Cada paso se divide en varias categorías (con diferentes colores) de dónde se pasa el tiempo. El área roja corresponde a la parte del tiempo de paso que los dispositivos estuvieron inactivos esperando los datos de entrada del host. El área verde muestra cuánto tiempo estuvo funcionando realmente el dispositivo

  • Las 10 operaciones principales de TensorFlow en el dispositivo: muestra las operaciones en el dispositivo que duraron más.

    Cada fila muestra el tiempo propio de una operación (como el porcentaje de tiempo que tardan todas las operaciones), el tiempo acumulado, la categoría y el nombre.

  • Entorno de ejecución: muestra un resumen de alto nivel del entorno de ejecución del modelo, que incluye:

    • Número de hosts utilizados
    • Tipo de dispositivo (GPU / TPU)
    • Número de núcleos de dispositivo
  • Recomendación para los próximos pasos: informa cuando un modelo está vinculado a la entrada y recomienda herramientas que puede usar para localizar y resolver cuellos de botella en el rendimiento del modelo

Analizador de tubería de entrada

Cuando un programa TensorFlow lee datos de un archivo, comienza en la parte superior del gráfico TensorFlow de forma canalizada. El proceso de lectura se divide en múltiples etapas de procesamiento de datos conectadas en serie, donde la salida de una etapa es la entrada a la siguiente. Este sistema de lectura de datos se llama la tubería de entrada .

Una canalización típica para leer registros de archivos tiene las siguientes etapas:

  1. Lectura de archivos
  2. Preprocesamiento de archivos (opcional)
  3. Transferencia de archivos desde el host al dispositivo

Una tubería de entrada ineficiente puede ralentizar severamente su aplicación. Una aplicación se considera vinculada a la entrada cuando pasa una parte significativa de tiempo en la tubería de entrada. Utilice las ideas obtenidas del analizador de la tubería de entrada para comprender dónde la tubería de entrada es ineficiente.

El analizador de canalización de entrada le dice de inmediato si su programa está vinculado a la entrada y lo guía a través del análisis del dispositivo y del lado del host para depurar los cuellos de botella de rendimiento en cualquier etapa de la canalización de entrada.

Consulte la guía sobre el rendimiento de la tubería de entrada para conocer las mejores prácticas recomendadas para optimizar sus tuberías de entrada de datos.

Panel de control de la tubería de entrada

Para abrir el analizador de canalización de entrada, seleccione Perfil , luego seleccione input_pipeline_analyzer en el menú desplegable Herramientas .

imagen

El tablero de instrumentos contiene tres secciones:

  1. Resumen: resume el canal de entrada general con información sobre si su aplicación está vinculada a la entrada y, de ser así, cuánto
  2. Análisis del lado del dispositivo: muestra resultados detallados del análisis del lado del dispositivo, incluido el tiempo de paso del dispositivo y el rango de tiempo del dispositivo empleado esperando la entrada de datos en los núcleos en cada paso
  3. Análisis del lado del host: muestra un análisis detallado en el lado del host, incluido un desglose del tiempo de procesamiento de entrada en el host

Resumen de canalización de entrada

El Resumen informa si su programa está vinculado a la entrada presentando el porcentaje de tiempo del dispositivo dedicado a esperar la entrada del host. Si está utilizando una tubería de entrada estándar que ha sido instrumentada, la herramienta informa dónde se pasa la mayor parte del tiempo de procesamiento de entrada.

Análisis del lado del dispositivo

El análisis del lado del dispositivo proporciona información sobre el tiempo que pasó en el dispositivo frente al host y cuánto tiempo pasó el dispositivo esperando los datos de entrada del host.

  1. Tiempo de paso trazado contra el número de paso: muestra un gráfico del tiempo de paso del dispositivo (en milisegundos) sobre todos los pasos muestreados. Cada paso se divide en varias categorías (con diferentes colores) de dónde se pasa el tiempo. El área roja corresponde a la parte del tiempo de paso que los dispositivos estuvieron inactivos esperando los datos de entrada del host. El área verde muestra cuánto tiempo estuvo funcionando realmente el dispositivo
  2. Estadísticas de tiempo de paso: informa el promedio, la desviación estándar y el rango ([mínimo, máximo]) del tiempo de paso del dispositivo

Análisis del lado del host

El análisis del lado del host informa un desglose del tiempo de procesamiento de entrada (el tiempo dedicado a las operaciones API tf.data ) en el host en varias categorías:

  • Lectura de datos de archivos a pedido: tiempo dedicado a leer datos de archivos sin almacenamiento en caché, captación previa e intercalado
  • Lectura de datos de archivos por adelantado: tiempo dedicado a leer archivos, incluidos el almacenamiento en caché, la captación previa y el intercalado
  • Preprocesamiento de datos: tiempo dedicado a operaciones de preprocesamiento, como descompresión de imágenes
  • Datos en cola para transferir al dispositivo: tiempo dedicado a colocar los datos en una cola de entrada antes de transferir los datos al dispositivo

Expanda las Estadísticas de entrada de operaciones para ver las estadísticas de las operaciones de entrada individuales y sus categorías desglosadas por tiempo de ejecución.

imagen

Aparece una tabla de datos de origen con cada entrada que contiene la siguiente información:

  1. Input Op: muestra el nombre de la operación TensorFlow de la entrada.
  2. Recuento: muestra el número total de instancias de ejecución de operaciones durante el período de creación de perfiles
  3. Tiempo total (en ms): muestra la suma acumulativa de tiempo dedicado a cada una de esas instancias
  4. Tiempo total%: muestra el tiempo total empleado en una operación como una fracción del tiempo total empleado en el procesamiento de entrada
  5. Total Self Time (en ms): muestra la suma acumulativa del tiempo propio dedicado a cada una de esas instancias. El tiempo propio aquí mide el tiempo que pasa dentro del cuerpo de la función, excluyendo el tiempo que pasa en la función que llama.
  6. Tiempo total del self% . Muestra el tiempo propio total como una fracción del tiempo total dedicado al procesamiento de entrada
  7. Categoría Muestra la categoría de procesamiento de la operación de entrada.

Estadísticas de TensorFlow

La herramienta de estadísticas de TensorFlow muestra el rendimiento de cada operación de TensorFlow que se ejecuta en el host o dispositivo durante una sesión de creación de perfiles.

imagen

La herramienta muestra información de rendimiento en dos paneles:

  • El panel superior muestra hasta cuatro gráficos circulares:

    1. La distribución del tiempo de autoejecución de cada operación en el host
    2. La distribución del tiempo de autoejecución de cada tipo de operación en el host
    3. La distribución del tiempo de autoejecución de cada operación en el dispositivo
    4. La distribución del tiempo de autoejecución de cada tipo de operación en el dispositivo
  • El panel inferior muestra una tabla que informa sobre las operaciones de TensorFlow con una fila para cada operación y una columna para cada tipo de datos (ordene las columnas haciendo clic en el encabezado de la columna). Haga clic en el botón Exportar como CSV en el lado derecho del panel superior para exportar los datos de esta tabla como un archivo CSV.

    Tenga en cuenta que:

    • Si alguna operación tiene operaciones secundarias:

      • El tiempo total "acumulado" de una operación incluye el tiempo pasado dentro de las operaciones secundarias

      • El tiempo total "propio" de una operación no incluye el tiempo pasado dentro de las operaciones secundarias.

    • Si se ejecuta una operación en el host:

      • El porcentaje del tiempo libre total en el dispositivo incurrido por la operación será 0
      • El porcentaje acumulado del tiempo libre total en el dispositivo hasta e incluyendo esta operación será 0
    • Si se ejecuta una operación en el dispositivo:

      • El porcentaje del tiempo libre total en el host incurrido por esta operación será 0
      • El porcentaje acumulado del tiempo libre total en el host hasta e incluyendo esta operación será 0

Puede elegir incluir o excluir el tiempo de inactividad en los gráficos circulares y la tabla.

Visor de seguimiento

El visor de seguimiento muestra una línea de tiempo que muestra:

  • Duraciones para las operaciones que ejecutó su modelo TensorFlow
  • Qué parte del sistema (host o dispositivo) ejecutó una operación. Normalmente, el host ejecuta operaciones de entrada, procesa previamente los datos de entrenamiento y los transfiere al dispositivo, mientras que el dispositivo ejecuta el entrenamiento del modelo real

El visor de rastreo le permite identificar problemas de rendimiento en su modelo y luego tomar medidas para resolverlos. Por ejemplo, a un nivel alto, puede identificar si la capacitación de entrada o modelo toma la mayor parte del tiempo. Profundizando, puede identificar qué operaciones tardan más en ejecutarse. Tenga en cuenta que el visor de seguimiento está limitado a 1 millón de eventos por dispositivo.

Interfaz de visor de seguimiento

Cuando abre el visor de seguimiento, aparece mostrando su ejecución más reciente:

imagen

Esta pantalla contiene los siguientes elementos principales:

  1. Panel de línea de tiempo: muestra las operaciones que el dispositivo y el host ejecutaron con el tiempo
  2. Panel de detalles: muestra información adicional para las operaciones seleccionadas en el panel Línea de tiempo

El panel Línea de tiempo contiene los siguientes elementos:

  1. Barra superior: contiene varios controles auxiliares
  2. Eje de tiempo: muestra el tiempo relativo al comienzo de la traza
  3. Etiquetas de sección y pista: cada sección contiene varias pistas y tiene un triángulo a la izquierda en el que puede hacer clic para expandir y contraer la sección. Hay una sección para cada elemento de procesamiento en el sistema.
  4. Selector de herramientas: contiene varias herramientas para interactuar con el visor de trazas, como Zoom, Panorámica, Selección y Temporización. Use la herramienta de sincronización para marcar un intervalo de tiempo.
  5. Eventos: muestran el tiempo durante el cual se ejecutó una operación o la duración de los metaeventos, como los pasos de entrenamiento
Secciones y pistas

El visor de rastreo contiene las siguientes secciones:

  • Una sección para cada nodo del dispositivo , etiquetada con el número del chip del dispositivo y el nodo del dispositivo dentro del chip (por ejemplo, /device:GPU:0 (pid 0) ). Cada sección de nodo de dispositivo contiene las siguientes pistas:
    • Paso: muestra la duración de los pasos de entrenamiento que se estaban ejecutando en el dispositivo
    • TensorFlow Ops - . Muestra las operaciones ejecutadas en el dispositivo.
    • Operaciones XLA: muestra las operaciones XLA (operaciones) que se ejecutaron en el dispositivo si XLA es el compilador utilizado (cada operación TensorFlow se traduce en una o varias operaciones XLA. El compilador XLA traduce las operaciones XLA en código que se ejecuta en el dispositivo).
  • Una sección para subprocesos que se ejecutan en la CPU de la máquina host, denominada "Subprocesos de host" . La sección contiene una pista para cada subproceso de CPU. Tenga en cuenta que puede ignorar la información que se muestra junto a las etiquetas de sección.
Eventos

Los eventos dentro de la línea de tiempo se muestran en diferentes colores; Los colores en sí mismos no tienen un significado específico.

El visor de rastreo también puede mostrar rastros de llamadas a funciones de Python en su programa TensorFlow. Si utiliza la API tf.profiler.experimental.start() , puede habilitar el seguimiento de Python utilizando ProfilerOptions namedtuple cuando comience la creación de perfiles. Alternativamente, si usa el modo de muestreo para la creación de perfiles, puede seleccionar el nivel de rastreo utilizando las opciones desplegables en el cuadro de diálogo Perfil de captura .

imagen

Estadísticas de kernel de GPU

Esta herramienta muestra estadísticas de rendimiento y la operación de origen para cada núcleo acelerado por GPU.

imagen

La herramienta muestra información en dos paneles:

  • El panel superior muestra un gráfico circular que muestra los núcleos CUDA que tienen el mayor tiempo total transcurrido

  • El panel inferior muestra una tabla con los siguientes datos para cada par exclusivo de kernel-op:

    • Un rango en orden descendente de la duración total de la GPU transcurrida agrupada por par kernel-op
    • El nombre del kernel lanzado
    • El número de registros de GPU utilizados por el núcleo
    • El tamaño total de la memoria compartida (estática + dinámica compartida) utilizada en bytes
    • La dimensión del bloque expresada como blockDim.x, blockDim.y, blockDim.z
    • Las dimensiones de la cuadrícula expresadas como gridDim.x, gridDim.y, gridDim.z
    • Si el operador es elegible para usar TensorCores
    • Si el núcleo contiene instrucciones de TensorCore
    • El nombre de la operación que lanzó este kernel
    • El número de ocurrencias de este par kernel-op
    • El tiempo total de GPU transcurrido en microsegundos
    • El tiempo promedio de GPU transcurrido en microsegundos
    • El tiempo mínimo de GPU transcurrido en microsegundos
    • El tiempo máximo de GPU transcurrido en microsegundos

Herramienta de perfil de memoria

La herramienta Perfil de memoria supervisa el uso de memoria de su host o dispositivo durante el intervalo de creación de perfiles. Puedes usar esta herramienta para:

  • Depuración de problemas de memoria (OOM) al identificar el uso de memoria pico y la asignación de memoria correspondiente a las operaciones de TensorFlow. También puede depurar los problemas de OOM que pueden surgir cuando ejecuta la inferencia multiempresa
  • Depurar problemas de fragmentación de memoria

La herramienta de perfil de memoria muestra datos en tres secciones:

  1. Resumen del perfil de memoria
  2. Gráfico de línea de tiempo de memoria
  3. Tabla de desglose de memoria

Resumen del perfil de memoria

Esta sección muestra un resumen de alto nivel del perfil de memoria de su programa TensorFlow como se muestra a continuación:

El resumen del perfil de memoria tiene seis campos:

  1. ID de memoria: menú desplegable que enumera todos los sistemas de memoria disponibles (host y dispositivo). Seleccione el sistema de memoria que desea ver en el menú desplegable. Tenga en cuenta que el host aparece como gpu_host_bfc
  2. # Asignación: la cantidad de asignaciones de memoria realizadas durante el intervalo de creación de perfiles
  3. # Desasignación: el número de desasignaciones de memoria en el intervalo de creación de perfiles
  4. Capacidad de memoria: la capacidad total (en GiB) del sistema de memoria que seleccione
  5. Uso máximo de almacenamiento dinámico: el uso máximo de memoria (en GiB) desde que el modelo comenzó a ejecutarse
  6. Uso máximo de memoria: el uso máximo de memoria (en GiB) en el intervalo de creación de perfiles. Este campo contiene los siguientes subcampos:
    1. Marca de tiempo: la marca de tiempo de cuándo se produjo el uso máximo de memoria en el gráfico de línea de tiempo
    2. Reserva de pila: cantidad de memoria reservada en la pila (en GiBs)
    3. Asignación de almacenamiento dinámico: cantidad de memoria asignada en el almacenamiento dinámico (en GiB)
    4. Memoria libre: cantidad de memoria libre (en GiBs). La capacidad de memoria es la suma total de la reserva de pila, la asignación de almacenamiento dinámico y la memoria libre
    5. Fragmentación: el porcentaje de fragmentación (menor es mejor). Se calcula como un porcentaje de (1 - Tamaño de la porción más grande de memoria libre / Memoria libre total)

Gráfico de línea de tiempo de memoria

Esta sección muestra una gráfica del uso de memoria (en GiBs) y el porcentaje de fragmentación versus tiempo (en ms).

imagen

El eje X representa la línea de tiempo (en ms) del intervalo de creación de perfiles. El eje Y a la izquierda representa el uso de memoria (en GiBs) y el eje Y a la derecha representa el porcentaje de fragmentación. En cada punto en el tiempo en el eje X, la memoria total se divide en tres categorías: pila (en rojo), montón (en naranja) y libre (en verde). Desplácese sobre una marca de tiempo específica para ver los detalles sobre los eventos de asignación / desasignación de memoria en ese punto, como se muestra a continuación:

imagen

La ventana emergente muestra la siguiente información:

  • marca de tiempo (ms): la ubicación del evento seleccionado en la línea de tiempo
  • evento: el tipo de evento (asignación o desasignación)
  • required_size (GiBs): la cantidad de memoria solicitada. Este será un número negativo para eventos de desasignación
  • allovery_size (GiBs): la cantidad real de memoria asignada. Este será un número negativo para eventos de desasignación
  • tf_op: el TensorFlow Op que solicita la asignación / desasignación
  • step_id: el paso de entrenamiento en el que ocurrió este evento
  • region_type: el tipo de entidad de datos para el que está destinada esta memoria asignada. Los valores posibles son temp para temporarios, output para activaciones y gradientes, y persist / dynamic para pesos y constantes
  • data_type: el tipo de elemento tensorial (p. ej., uint8 para un entero sin signo de 8 bits)
  • tensor_shape: la forma del tensor que se asigna / desasigna
  • memory_in_use (GiBs): la memoria total que está en uso en este momento

Tabla de desglose de memoria

Esta tabla muestra las asignaciones de memoria activa en el punto de uso máximo de memoria en el intervalo de creación de perfiles.

imagen

Hay una fila para cada TensorFlow Op y cada fila tiene las siguientes columnas:

  • Nombre de operación: el nombre de la operación de TensorFlow
  • Tamaño de asignación (GiBs): la cantidad total de memoria asignada a esta operación
  • Tamaño solicitado (GiBs): la cantidad total de memoria solicitada para esta operación
  • Ocurrencias: el número de asignaciones para esta operación
  • Tipo de región: el tipo de entidad de datos para el que está destinada esta memoria asignada. Los valores posibles son temp para temporarios, output para activaciones y gradientes, y persist / dynamic para pesos y constantes
  • Tipo de datos: el tipo de elemento tensorial
  • Forma: la forma de los tensores asignados

Recopilar datos de rendimiento.

TensorFlow Profiler recopila actividades de host y rastros de GPU de su modelo TensorFlow. Puede configurar Profiler para recopilar datos de rendimiento a través del modo programático o el modo de muestreo.

API de perfiles

Puede usar las siguientes API para realizar la creación de perfiles.

 # Profile from batches 10 to 15
tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                             profile_batch='10, 15')

# Train the model and use the TensorBoard Keras callback to collect
# performance profiling data
model.fit(train_data,
          steps_per_epoch=20,
          epochs=5,
          callbacks=[tb_callback])
 
  • Modo programático utilizando la API de funciones tf.profiler
 tf.profiler.experimental.start('logdir')
# Train the model here
tf.profiler.experimental.stop()
 
  • Modo programático usando el administrador de contexto
 with tf.profiler.experimental.Profile('logdir'):
    # Train the model here
    pass
 
  • Modo de muestreo: realice perfiles bajo demanda utilizando tf.profiler.experimental.server.start() para iniciar un servidor gRPC con la ejecución del modelo TensorFlow. Después de iniciar el servidor gRPC y ejecutar su modelo, puede capturar un perfil a través del botón Capturar perfil en el complemento de perfil de TensorBoard. Utilice el script en la sección Instalar perfilador anterior para iniciar una instancia de TensorBoard si aún no se está ejecutando.

    Como ejemplo,

 # Start a gRPC server at port 6009
tf.profiler.experimental.server.start(6009)
# ... TensorFlow program ...
 

Use el cuadro de diálogo Perfil de captura para especificar:

  • La URL del servicio de perfil o nombre de TPU
  • La duración del perfil
  • El nivel de dispositivo, host y seguimiento de llamadas de función de Python
  • Cuántas veces desea que Profiler vuelva a intentar capturar perfiles si no tiene éxito al principio

Perfilado de bucles de entrenamiento personalizados

Para perfilar bucles de entrenamiento personalizados en su código TensorFlow, instrumente el bucle de entrenamiento con la API tf.profiler.experimental.Trace para marcar los límites de los pasos para el Profiler. El argumento de name se usa como prefijo para los nombres de paso, el argumento de palabra clave step_num se agrega en los nombres de paso, y el argumento de palabra clave _r hace que este evento de seguimiento sea procesado como un evento de paso por Profiler.

Como ejemplo,

 for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)
 

Esto habilitará el análisis de rendimiento basado en pasos del Profiler y hará que los eventos de paso se muestren en el visor de seguimiento.

Asegúrese de incluir el iterador del conjunto de datos dentro del contexto tf.profiler.experimental.Trace para un análisis preciso de la canalización de entrada.

El fragmento de código a continuación es un antipatrón:

 for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)
 

Perfiles de casos de uso

El generador de perfiles cubre varios casos de uso a lo largo de cuatro ejes diferentes. Algunas de las combinaciones son compatibles actualmente y otras se agregarán en el futuro. Algunos de los casos de uso son:

  • Perfiles locales versus remotos: Estas son dos formas comunes de configurar su entorno de perfiles. En la creación de perfiles locales, la API de creación de perfiles se llama en la misma máquina que está ejecutando su modelo, por ejemplo, una estación de trabajo local con GPU. En la creación de perfiles remota, la API de creación de perfiles se llama en una máquina diferente desde donde se está ejecutando su modelo, por ejemplo, en un TPU en la nube.
  • Perfilado de múltiples trabajadores: puede perfilar múltiples máquinas cuando utiliza las capacidades de capacitación distribuida de TensorFlow.
  • Plataforma de hardware: CPU de perfil, GPU y TPU.

La siguiente tabla es una descripción general rápida de cuáles de los casos de uso anteriores son compatibles con las diversas API de creación de perfiles en TensorFlow 2.3:

API de perfiles Local Remoto Trabajadores múltiples Plataformas de hardware
TensorBoard Keras Callback Soportado No soportado No soportado CPU, GPU
tf.experimental.profiler Función API Soportado No soportado No soportado CPU, GPU
API de administrador de contexto Soportado No soportado No soportado CPU, GPU
API bajo demanda No soportado Soportado Soporte limitado CPU, GPU, TPU

Mejores prácticas para un rendimiento óptimo del modelo

Utilice las siguientes recomendaciones según corresponda para sus modelos TensorFlow para lograr un rendimiento óptimo.

En general, realice todas las transformaciones en el dispositivo y asegúrese de utilizar la última versión compatible de bibliotecas como cuDNN e Intel MKL para su plataforma.

Optimizar la canalización de datos de entrada

Una tubería de entrada de datos eficiente puede mejorar drásticamente la velocidad de ejecución de su modelo al reducir el tiempo de inactividad del dispositivo. Considere incorporar las siguientes mejores prácticas como se detalla aquí para hacer que su flujo de entrada de datos sea más eficiente:

  • Datos de captación previa
  • Extracción de datos en paralelo
  • Paralelizar la transformación de datos
  • Datos de caché en memoria
  • Vectorizar funciones definidas por el usuario
  • Reduce el uso de memoria al aplicar transformaciones

Además, intente ejecutar su modelo con datos sintéticos para verificar si la tubería de entrada es un cuello de botella de rendimiento.

Mejora el rendimiento del dispositivo

  • Aumente el tamaño del mini lote de entrenamiento (número de muestras de entrenamiento utilizadas por dispositivo en una iteración del ciclo de entrenamiento)
  • Use TF Stats para descubrir qué tan eficientemente se ejecutan las operaciones en el dispositivo
  • Use tf.function para realizar cálculos y, opcionalmente, habilite el indicador experimental_compile
  • Minimice las operaciones de Python del host entre los pasos y reduzca las devoluciones de llamadas. Calcular métricas cada pocos pasos en lugar de cada paso
  • Mantenga las unidades de cómputo del dispositivo ocupadas
  • Enviar datos a múltiples dispositivos en paralelo
  • Optimice el diseño de datos para preferir los canales primero (por ejemplo, NCHW sobre NHWC). Ciertas GPU como la NVIDIA® V100 funcionan mejor con un diseño de datos NHWC.
  • Considere utilizar representaciones numéricas de 16 bits como fp16 , el formato de coma flotante de precisión media especificado por IEEE o el formato bfloat16 de punto flotante Brain
  • Considere usar la API de precisión mixta Keras
  • Cuando entrene en GPU, utilice TensorCore. Los núcleos de GPU usan TensorCore cuando la precisión es fp16 y las dimensiones de entrada / salida son divisibles por 8 o 16 (para int8)

Recursos adicionales