Herramienta de visor de memoria
Puedes usar el visor de memoria para visualizar el uso de memoria durante el ciclo de vida del programa. Puedes analizar los detalles del contenido de la memoria en el punto de uso máximo de la memoria, lo que incluye depurar situaciones de memoria insuficiente (OOM). El visor de memoria puede ayudarte a ver el uso global de la memoria y qué tan cerca está el procesamiento de quedarse sin memoria.
Toda la información que se muestra en el Visor de memoria es puramente estática y se obtiene del compilador XLA. La información dinámica del entorno de ejecución se presenta en la herramienta Generador de perfiles de memoria.
Plataformas compatibles
TPU: Compatible
GPU: Compatible
Componentes del visor de memoria
El Visor de memoria consta de varios componentes clave:
- Menús desplegables de control de usuario que te permiten personalizar los datos que visualizas:
- Tipos de memoria: Los tipos de memoria admitidos dependen del acelerador. En el caso de las GPUs, el enfoque se centra en la memoria de gran ancho de banda (HBM), mientras que, en el caso de las TPU, también puedes ver el uso de las memorias integradas en el chip, como VMEM, SMEM, CMEM, marcas de sincronización (SFlag), Sparsecore y la memoria del host.
- Módulos: Son los programas XLA que formaron parte de tu ejecución. A menudo, un buen punto de partida es un módulo de nivel superior, etiquetado como “jit_train_step” o “jit_generate”.
- La sección de descripción general textual proporciona información de alto nivel, como la asignación de memoria máxima requerida para el programa, la división entre argumentos y variables temporales, etcétera. Hay una sobrecarga impuesta por el padding, que se necesita debido a las restricciones en las formas compatibles de tensores en los aceleradores. Si este padding es una fracción grande de la asignación total, puede indicar una oportunidad de optimización.
- El gráfico de líneas "Tamaño de asignación de memoria en comparación con el orden del programa" traza el uso de memoria en comparación con los puntos del programa (secuencia de HLO) según lo programó el compilador.
- Ten en cuenta que el eje X no es el tiempo.
- El gráfico destaca específicamente el punto del programa con el uso máximo de memoria del módulo elegido. El generador de perfiles y las herramientas no son conscientes de la coexistencia de módulos en un chip o una memoria determinados. Cuando se compila cada módulo, el compilador anota el perfil con el punto de partida “de referencia” de la memoria total asignada (por módulos que se compilaron antes de este) y cuenta hacia arriba y hacia abajo a partir de allí a medida que se producen más asignaciones y desasignaciones. Sin embargo, no se capturan las asignaciones futuras de otros módulos compilados antes de la ejecución. Ten esto en cuenta mientras depuras situaciones de OOM.
Los gráficos de búfer en la parte inferior de la página desglosan el uso de memoria en el punto de uso máximo del programa (indicado por la línea vertical en el gráfico de línea de uso de memoria). Hay tres gráficos, todos los cuales muestran todo el conjunto de búferes que asignó el programa, pero ordenados de tres maneras diferentes:
- Por orden de programa: Es el orden en que se activaron durante la ejecución del programa, y los más antiguos aparecen a la izquierda.
- Por tamaño: los que tienen el mayor impacto en el punto de uso máximo de memoria se muestran a la izquierda.
Por la sobrecarga de padding que imponen: los más “ineficientes” desde una perspectiva de hardware aparecen a la izquierda.
Ten en cuenta que los colores de los búferes no tienen un significado en particular.
Si te desplazas sobre un búfer en cualquiera de los tres gráficos, aparecerán dos pantallas adicionales:
- Una superposición en el gráfico de líneas de uso de memoria en un color que coincide con la tarjeta de búfer, que indica el ciclo de vida de ese búfer; es decir, una barra horizontal cuyos bordes izquierdo y derecho indican los puntos de asignación y desasignación dentro del orden del programa. La altura de la barra horizontal representa el tamaño relativo del búfer seleccionado en comparación con la asignación máxima.
- Una tarjeta de detalles del búfer independiente, por lo general, en el lado izquierdo, con detalles sobre la operación específica según corresponda. Una tarjeta típica incluye la siguiente información:
- Nombre: Es el nombre de la operación de XLA, que puedes buscar en el Visualizador de grafos o en el Visualizador de seguimiento.
- Tamaño: Es el tamaño de la asignación del búfer, con y sin relleno.
- Forma: Describe el rango, tamaño y tipo de datos del array n-dimensional.
- Nombre de la operación del framework: Muestra el nombre de la operación del framework asociada con esta asignación.
- Tipo de asignación: Clasifica las asignaciones de búfer en los siguientes tipos: Parámetro, Salida, Local del subproceso y Temporal (p.ej., asignación de búfer dentro de una fusión).