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

Optimiza el rendimiento de TensorFlow con Profiler

Utilice las herramientas disponibles con Profiler para realizar un seguimiento del rendimiento de sus modelos de TensorFlow. Vea cómo funciona su modelo en el host (CPU), el dispositivo (GPU) o en una combinación de host y dispositivo (s).

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

Esta guía le mostrará cómo instalar Profiler, las diversas herramientas disponibles, los diferentes modos de cómo Profiler recopila datos de rendimiento y algunas de las 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. Cumpla con los requisitos de los controladores de GPU NVIDIA® y del kit de herramientas CUDA® que se enumeran en los requisitos de software de compatibilidad con GPU TensorFlow .
  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 encuentre la biblioteca CUPTI.

Resolver problemas de privilegios

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

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

docker run option '--privileged=true'

Herramientas de perfilado

Acceda a Profiler desde la pestaña Profile 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 canalización de entrada
  • Estadísticas de TensorFlow
  • Visor de seguimiento
  • Estadísticas del kernel de GPU
  • Herramienta de perfil de memoria
  • Visor de pod

Página de resumen

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

La página de descripción general 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 desempeño tiene dos partes:

    1. Desglose del tiempo de paso: divide el tiempo de paso promedio en varias categorías de dónde se dedica el tiempo:

      • Compilación: tiempo dedicado a compilar núcleos
      • Entrada: tiempo dedicado a leer datos de entrada
      • Salida: tiempo dedicado a la lectura de datos de salida
      • Lanzamiento del kernel: tiempo empleado por el host para iniciar kernels
      • Tiempo de procesamiento del host
      • Tiempo de comunicación de dispositivo a dispositivo
      • Tiempo de computación en el dispositivo
      • Todos los demás, incluida la sobrecarga de Python
    2. Precisiones de cálculo del dispositivo: informa el porcentaje de 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 dedica 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 realmente funcionando el dispositivo

  • Las 10 operaciones principales de TensorFlow en el dispositivo: muestra las operaciones en el dispositivo que se ejecutaron durante más tiempo.

    Cada fila muestra el tiempo propio de una operación (como el porcentaje de tiempo empleado por 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 siguientes pasos: informa cuando un modelo está vinculado a la entrada y recomienda herramientas que puede utilizar para localizar y resolver los cuellos de botella en el rendimiento del modelo.

Analizador de canalización de entrada

Cuando un programa de TensorFlow lee datos de un archivo, comienza en la parte superior del gráfico de TensorFlow de manera 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 denomina canalización 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 canalización de entrada ineficiente puede ralentizar gravemente su aplicación. Una aplicación se considera vinculada a la entrada cuando pasa una parte significativa de tiempo en la canalización de entrada. Utilice la información obtenida del analizador de canalización de entrada para comprender dónde es ineficiente la canalización de entrada.

El analizador de canalización de entrada le indica inmediatamente si su programa está vinculado a la entrada y lo guía a través del análisis del lado del dispositivo y 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 canalización de entrada para conocer las mejores prácticas recomendadas para optimizar las canalizaciones de entrada de datos.

Panel de control de canalización 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 contiene tres secciones:

  1. Resumen: resume la canalización de entrada general con información sobre si su aplicación está vinculada a la entrada y, de ser así, en qué medida
  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 que el dispositivo pasó esperando los datos de entrada en los núcleos en cada paso.
  3. Análisis del lado del host: muestra un análisis detallado del 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 al presentar el porcentaje de tiempo del dispositivo dedicado a esperar la entrada del host. Si está utilizando una canalización de entrada estándar que se ha instrumentado, la herramienta informa dónde se dedica 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 empleado en el dispositivo frente al host y cuánto tiempo del dispositivo se dedicó a esperar los datos de entrada del host.

  1. Tiempo de paso representado 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 dedica 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 realmente funcionando 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 de la 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 intercalación
  • Leer datos de archivos por adelantado: tiempo dedicado a leer archivos, incluido el almacenamiento en caché, la búsqueda previa y el entrelazado
  • Procesamiento previo de datos: tiempo dedicado al procesamiento previo de operaciones, como la descompresión de imágenes
  • Colocación de datos en cola para transferirlos al dispositivo: tiempo dedicado a colocar datos en una cola de entrada antes de transferirlos al dispositivo

Expanda Estadísticas de operaciones de entrada para ver las estadísticas de 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. Opción de entrada: muestra el nombre de la operación de TensorFlow de la operación de entrada
  2. Recuento: muestra el número total de instancias de ejecución de operaciones durante el período de elaboración de perfiles.
  3. Tiempo total (en ms): muestra la suma acumulativa del tiempo dedicado a cada una de esas instancias.
  4. Porcentaje de tiempo total: muestra el tiempo total dedicado a una operación como una fracción del tiempo total dedicado al procesamiento de entrada.
  5. Tiempo total de uno mismo (en ms): muestra la suma acumulada del tiempo de uno mismo gastado en cada una de esas instancias. El tiempo propio aquí mide el tiempo pasado dentro del cuerpo de la función, excluyendo el tiempo pasado en la función que llama.
  6. Porcentaje total de tiempo propio . Muestra el tiempo total de uno mismo 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 (op) 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 ejecución automática de cada tipo de operación en el dispositivo.
  • El panel inferior muestra una tabla que informa datos 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 "acumulado" total de una operación incluye el tiempo pasado dentro de las operaciones secundarias.

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

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

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

      • El porcentaje del tiempo total en el host incurrido por esta operación será 0
      • El porcentaje acumulado del tiempo total de tiempo propio en el host hasta esta operación incluida será 0

Puede optar por 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 de las operaciones ejecutadas por tu modelo de TensorFlow
  • Qué parte del sistema (host o dispositivo) ejecutó una operación. Normalmente, el host ejecuta operaciones de entrada, preprocesa los datos de entrenamiento y los transfiere al dispositivo, mientras que el dispositivo ejecuta el entrenamiento del modelo real

El visor de seguimiento le permite identificar problemas de rendimiento en su modelo y luego tomar medidas para resolverlos. Por ejemplo, en un nivel alto, puede identificar si el entrenamiento de entrada o modelo está tomando la mayor parte del tiempo. Al profundizar, 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 del 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 a lo largo del 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 del sistema.
  4. Selector de herramientas: contiene varias herramientas para interactuar con el visor de trazas, como Zoom, Panorámica, Seleccionar y Sincronización. Utilice 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 trazas contiene las siguientes secciones:

  • Una sección para cada nodo de 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.
    • Operaciones de TensorFlow - . Muestra las operaciones ejecutadas en el dispositivo.
    • XLA Ops: muestra las operaciones XLA (ops) 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 los subprocesos que se ejecutan en la CPU de la máquina host, denominada "Subprocesos del host" . La sección contiene una pista para cada subproceso de la CPU. Tenga en cuenta que puede ignorar la información que se muestra junto a las etiquetas de las secciones.
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 trazas también puede mostrar trazas de llamadas a funciones de Python en tu programa TensorFlow. Si usa la API tf.profiler.experimental.start() , puede habilitar el rastreo de Python usando ProfilerOptions namedtuple al comenzar a generar perfiles. Alternativamente, si utiliza el modo de muestreo para la creación de perfiles, puede seleccionar el nivel de seguimiento mediante las opciones desplegables del cuadro de diálogo Capturar perfil .

imagen

Estadísticas del kernel de GPU

Esta herramienta muestra estadísticas de rendimiento y la operación de origen para cada kernel 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 transcurrida de la GPU agrupada por par kernel-op
    • El nombre del kernel lanzado
    • La cantidad de registros de GPU usados ​​por el kernel
    • El tamaño total de la memoria compartida (estática + compartida dinámica) 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 la operación es elegible para usar TensorCores
    • Si el kernel contiene instrucciones de TensorCore
    • El nombre de la operación que lanzó este kernel
    • El número de apariciones de este par kernel-op
    • El tiempo total transcurrido de la GPU en microsegundos
    • El tiempo promedio transcurrido de la GPU en microsegundos
    • El tiempo mínimo transcurrido de la GPU en microsegundos
    • El tiempo máximo de GPU transcurrido en microsegundos

Herramienta de perfil de memoria

La herramienta Memory Profile monitorea el uso de memoria de su dispositivo durante el intervalo de generación de perfiles. Puede utilizar esta herramienta para:

  • Depura los problemas de memoria insuficiente (OOM) al señalar el uso máximo de memoria y la asignación de memoria correspondiente a las operaciones de TensorFlow. También puede depurar problemas de OOM que pueden surgir cuando ejecuta inferencia de tenencia múltiple
  • Depurar problemas de fragmentación de la 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 del dispositivo disponibles. Seleccione el sistema de memoria que desea ver en el menú desplegable
  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 del montón: 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 GiB)
    3. Asignación de montón: cantidad de memoria asignada en el montón (en GiB)
    4. Memoria libre: cantidad de memoria libre (en GiB). La capacidad de memoria es la suma total de la reserva de pila, la asignación de pila y la memoria libre
    5. Fragmentación: el porcentaje de fragmentación (cuanto más bajo, 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 un gráfico del uso de memoria (en GiB) y el porcentaje de fragmentación frente al tiempo (en ms).

imagen

El eje X representa la línea de tiempo (en ms) del intervalo de perfil. El eje Y de la izquierda representa el uso de memoria (en GiB) y el eje Y de la derecha representa el porcentaje de fragmentación. En cada momento 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)
  • Request_size (GiBs): la cantidad de memoria solicitada. Este será un número negativo para los eventos de desasignación.
  • tamaño_asignación (GiB): la cantidad real de memoria asignada. Este será un número negativo para los eventos de desasignación.
  • tf_op: 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 es esta memoria asignada. Los valores posibles son temp para temporales, output para activaciones y gradientes, y persist / dynamic para pesos y constantes
  • data_type: el tipo de elemento tensorial (por ejemplo, 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 generación de perfiles.

imagen

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

  • Op Name: el nombre de la operación de TensorFlow
  • Tamaño de asignación (GiB): la cantidad total de memoria asignada a esta operación
  • Tamaño solicitado (GiB): 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 es esta memoria asignada. Los valores posibles son temp para temporales, output para activaciones y gradientes, y persist / dynamic para pesos y constantes
  • Tipo de datos: el tipo de elemento tensor
  • Forma: la forma de los tensores asignados

Visor de pod

La herramienta Pod Viewer muestra el desglose de un paso de capacitación en todos los trabajadores.

imagen

  • El panel superior tiene un control deslizante para seleccionar el número de paso.
  • El panel inferior muestra un gráfico de columnas apiladas. Esta es una vista de alto nivel de categorías divididas en tiempo de paso colocadas una encima de la otra. Cada columna apilada representa un trabajador único.
  • Cuando pasa el cursor sobre una columna apilada, la tarjeta del lado izquierdo muestra más detalles sobre el desglose de los pasos.

Recopilar datos de desempeño

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

API de creación de perfiles

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

  • Modo programático usando TensorBoard Keras Callback ( tf.keras.callbacks.TensorBoard )

    # 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 usando la API de función 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 la creación de perfiles a pedido mediante tf.profiler.experimental.server.start() para iniciar un servidor gRPC con la ejecución de su modelo de 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 generador de perfiles anterior para iniciar una instancia de TensorBoard si aún no se está ejecutando.

    Como ejemplo,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Un ejemplo para crear perfiles de varios trabajadores:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Utilice el cuadro de diálogo Capturar perfil para especificar:

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

Perfilar bucles de entrenamiento personalizados

Para crear perfiles de ciclos de entrenamiento personalizados en tu código de TensorFlow, instrumenta el ciclo de entrenamiento con la API tf.profiler.experimental.Trace para marcar los límites de los pasos para Profiler. El argumento de name se utiliza como prefijo para los nombres de los pasos, el argumento de la palabra clave step_num se agrega a los nombres de los pasos y el argumento de la palabra clave _r hace que este evento de seguimiento sea procesado como un evento de paso por el generador de perfiles.

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 permitirá el análisis de rendimiento basado en pasos de Profiler y hará que los eventos de pasos aparezcan en el visor de trazas.

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 siguiente fragmento de código es un anti-patrón:

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

Casos de uso de perfiles

El generador de perfiles cubre una serie de 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:

  • Generación de perfiles local o remota: estas son dos formas comunes de configurar su entorno de generación de perfiles. En la creación de perfiles local, la API de creación de perfiles se llama en la misma máquina que ejecuta 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 a la que se ejecuta su modelo, por ejemplo, en una TPU de Cloud.
  • Creación de perfiles de varios trabajadores: puede crear perfiles de varias máquinas cuando utilice las capacidades de entrenamiento distribuido 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 distintas API de creación de perfiles en TensorFlow:

API de creación de perfiles Local Remoto Varios trabajadores Plataformas de hardware
TensorBoard Keras Callback Soportado No soportado No soportado CPU, GPU
tf.profiler.experimental start / stop API Soportado No soportado No soportado CPU, GPU
tf.profiler.experimental client.trace API Soportado Soportado Soportado CPU, GPU, TPU
API de administrador de contexto Soportado No soportado No soportado CPU, GPU

Mejores prácticas para un rendimiento óptimo del modelo

Utilice las siguientes recomendaciones según corresponda para sus modelos de 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 canalización 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 canal de entrada de datos sea más eficiente:

  • Obtener datos previamente
  • Paralelizar la extracción de datos
  • Paralelizar la transformación de datos
  • Caché de datos en la memoria
  • Vectorizar funciones definidas por el usuario
  • Reducir el uso de memoria al aplicar transformaciones

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

Mejorar el rendimiento del dispositivo

  • Aumentar 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 averiguar qué tan eficientemente se ejecutan las operaciones en el dispositivo
  • Use tf.function para realizar cálculos y, opcionalmente, habilite la tf.function experimental_compile
  • Minimice las operaciones de Python del host entre pasos y reduzca las devoluciones de llamada. Calcule métricas cada pocos pasos en lugar de cada paso
  • Mantenga ocupadas las unidades de cálculo del dispositivo
  • Envíe datos a varios 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 el uso de 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 coma flotante de Brain.
  • Considere utilizar la API de precisión mixta de Keras
  • Cuando entrenes en GPU, usa TensorCore. Los kernels 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

Limitaciones conocidas

Creación de perfiles de varias GPU en TensorFlow 2.2 y TensorFlow 2.3

TensorFlow 2.2 y 2.3 admiten múltiples perfiles de GPU solo para sistemas de un solo host; No se admite la creación de perfiles de GPU múltiples para sistemas con varios hosts. Para perfilar configuraciones de GPU de varios trabajadores, cada trabajador debe perfilarse de forma independiente. En TensorFlow 2.4, se pueden crear perfiles de varios trabajadores mediante la API tf.profiler.experimental.trace .

Se requiere CUDA® Toolkit 10.2 o posterior para perfilar múltiples GPU. Como TensorFlow 2.2 y 2.3 solo admiten las versiones de CUDA® Toolkit 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