Optimización de gráficos computacionales: Episodio 9
Contenido
- Introducción
- Optimización del gráfico computacional de alto nivel
- Transformaciones del grafo computacional de alto nivel
- La abstracción de gráficos computacionales de alto nivel
- Transformaciones de gráficos computacionales de alto nivel
- Transformación de gráficos computacionales para fusionar operaciones
- Implementación de patrones de fusión en gráficos computacionales de alto nivel
- Fusión de operaciones densas y agregar en gráficos computacionales de alto nivel
- Mapeo de funciones relacionadas al tensor en gráficos computacionales de bajo nivel
- Fusionar operaciones de gráficos computacionales en una única función de tensor
- Generación de código fusionado y ejecución del modelo fusionado
- Resultados y conclusiones
Introducción
En el episodio de hoy, hablaremos sobre la optimización del gráfico computacional de alto nivel. En episodios anteriores, hemos aprendido sobre los diferentes procesos de comprensión de MLC que nos permiten transformar entre diferentes funciones tensoriales. En particular, hemos aprendido cómo representar operadores tensoriales primitivos en una abstracción que contiene un gráfico computacional de alto nivel. También hemos aprendido cómo transformar esos programas para que podamos obtener un programa especializado en la tarea de interés. Junto con eso, también hemos aprendido sobre la abstracción de gráficos computacionales de alto nivel, que nos permite representar las computaciones de alto nivel.
Optimización del gráfico computacional de alto nivel
Hay muchas transformaciones que podemos hacer en este nivel de gráficos computacionales de alto nivel, y siempre hay una función primitiva tensorial subyacente en estas operaciones particulares. En la Figura 1, una cosa que podemos hacer es tomar dos operadores tensoriales primitivos y tratar de ejecutarlos y convertirlos en un único nodo de gráfico computacional, representado por la fusión de estas dos cosas juntas. Otra cosa que estamos haciendo en esta figura en particular es que estamos tratando de tomar este valor lineal y expandir una representación de nivel inferior de bucle correspondiente para que podamos ejecutar una transformación que optimice aún más este programa de bucle en particular. La mayoría de los procesos de MLC se pueden ver como transformaciones entre esas funciones tensoriales.
La abstracción de gráficos computacionales de alto nivel
La abstracción de gráficos computacionales de alto nivel nos permite representar las computaciones de alto nivel. Hay muchas transformaciones que también podemos hacer en este nivel de gráficos computacionales de alto nivel. Siempre hay una función tensorial primitiva subyacente en estas operaciones particulares. En la Figura 1, una cosa que podemos hacer es tomar dos operadores tensoriales primitivos y tratar de ejecutarlos y convertirlos en un único nodo de gráfico computacional, representado por la fusión de estos dos elementos juntos.
Transformaciones de gráficos computacionales de alto nivel
Hay muchas transformaciones que podemos hacer en este nivel de gráficos computacionales de alto nivel. Como se muestra en la Figura 1, una cosa que podemos hacer es tomar dos operadores tensoriales primitivos y tratar de ejecutarlos y convertirlos en un único nodo de gráfico computacional, representado por la fusión de estos dos elementos juntos. Otra cosa que estamos haciendo en esta figura en particular es que estamos tratando de tomar este valor lineal y expandir una representación de nivel inferior de bucle correspondiente para que podamos ejecutar una transformación que optimice aún más este programa de bucle en particular.
Transformación de gráficos computacionales para fusionar operaciones
En este ejemplo, estamos tratando de evaluar un tipo específico de programa de prueba llamado relax. Este programa representa una operación simple que Toma x e y e intenta calcular y + x * y. Estamos interesados en reconocer este patrón de operaciones de multiplicación y suma y tratar de fusionarlos en un solo nodo de gráfico computacional.
Implementación de patrones de fusión en gráficos computacionales de alto nivel
Hemos implementado un patrón de fusión utilizando el patrón de visitante en Python. Este patrón nos permite recorrer el gráfico computacional y, para cada nodo, aplicar una función de visita que nos permita realizar modificaciones en el nodo si corresponde.
Fusión de operaciones densas y agregar en gráficos computacionales de alto nivel
Hemos aplicado el patrón de fusión a las operaciones de densidad y suma en un gráfico computacional de alto nivel. Hemos detectado el patrón deseado y hemos fusionado las dos operaciones en una sola función que realiza la multiplicación y la suma en un solo paso.
Mapeo de funciones relacionadas al tensor en gráficos computacionales de bajo nivel
Para que nuestras operaciones fusionadas sean ejecutables en un entorno de bajo nivel, necesitamos mapear estas funciones relacionadas con el tensor a funciones de bajo nivel. Hemos usado la función core_te
para hacer esto y hemos mapeado las operaciones de adición y relu a operaciones tensoriales de bajo nivel.
Fusión de operaciones de gráficos computacionales en una única función de tensor
Hemos aplicado la fusión de operaciones de gráficos computacionales a una función de alto nivel y hemos obtenido dos funciones de tensor que representan la fusión de las operaciones deseadas.
Generación de código fusionado y ejecución del modelo fusionado
Hemos generado el código fusionado a partir de las funciones de tensor fusionadas y lo hemos ejecutado usando modelos frescos. El resultado fue el esperado.
Resultados y conclusiones
En este episodio, hemos explorado varias transformaciones en el gráfico computacional de alto nivel y hemos fusionado operaciones relacionadas en una sola función de tensor. Hemos demostrado cómo mapear estas funciones de alto nivel a funciones de bajo nivel y hemos ejecutado con éxito el modelo fusionado. Estamos seguros de que estas técnicas de optimización del gráfico computacional de alto nivel serán de utilidad en diversas aplicaciones de aprendizaje automático.