Optimización de gráficos para la optimización del rendimiento del aprendizaje profundo

Aquí hay un resumen de la optimización gráfica parcial implementada por el autor en la optimización de algunos modelos de aprendizaje profundo reales. Ya existen algunos marcos de aprendizaje profundo existentes, y algunos son descubrimientos únicos del autor, pero los marcos de aprendizaje profundo existentes aún no existen. . Los nuevos descubrimientos se seguirán actualizando en el futuro, y los lectores pueden contribuir con optimizaciones únicas con una gama más amplia de escenarios de aplicación.

Concepto básico: El modelo de aprendizaje profundo es un gráfico acíclico dirigido (DAG) compuesto por conexiones de operadores.Podemos reemplazar el subgrafo de este gráfico con otro subgrafo que sea computacionalmente equivalente, para que la implementación de este subgrafo sea más eficiente. La optimización de gráficos convencional consiste en utilizar operadores existentes en el marco para combinar nuevos subgráficos para reemplazar subgráficos antiguos, mientras que la fusión de operadores es un caso especial de optimización de gráficos, que utiliza nuevos operadores generados artificial o automáticamente para reemplazar la antigua subtrama.

OneHot+MatMul para reunir

El patrón en el modelo de bert en la figura a continuación se puede reemplazar por un cálculo de recopilación, que puede reducir la cantidad y los tipos de operadores y simplificar significativamente el método de cálculo.

Operadores SpaceToDepth y DepthToSpace

En la figura, el cálculo reformar+transponer (perm=[0, 1, 3, 5, 2, 4]) es equivalente a SpaceToDepth. Dado que hay tantas escenas transpuestas, el cálculo puede ser más específico y optimizado después del reemplazo aquí Además, esta optimización facilita la optimización de la conversión de formatos como NCHW a NHWC.

Similar a lo anterior, aquí transpose(perm=[0, 1, 4, 2, 5, 3]) es equivalente al cálculo de DepthToSpace.

Por supuesto, la conversión de la transposición 6D a SpaceToDepth y DepthToSpace puede tener más de una permanente. Puede consultar estas dos definiciones de operador de Onnx y proporcionar otras posibilidades de permanente. Por ejemplo, hay este tipo de dimensión de canal colocada en la parte posterior:

Este patrón en realidad está haciendo un espacio2profundidad

Pero el espacio2profundidad estándar interpreta NCHW como NCH1H0W1W0, luego se transpone como NH0W0CH1W1 y H0W0 como el tamaño de bloque de espacio2profundidad. Sin embargo, el tipo de transposición de patrón anterior puede ser diferente del espacio estándar de profundidad 2. Por ejemplo, la disposición puede ser NW0H0CH1W1, pero todavía se puede reemplazar directamente por reformar+transponer+reformar.

transponer+reformar+transponer combinados

En una situación más complicada, el operador reformar ha dividido y fusionado elementos al mismo tiempo:

Cualquier cantidad de transposición+reforma+transposición anterior se puede combinar en un patrón de remodelación+transposición+reforma.

Un algoritmo relativamente simple que combina cualquier transposición+reforma+transposición es:

Divida la forma de entrada en la unidad de número primo más pequeña, por ejemplo, [4, 9] se divide en [a0, a1, a2, a3]. Necesitamos usar una forma de símbolo para representar el resultado de la división, y cada forma de símbolo corresponde al resultado real de un número primo dividido.

Un problema aquí es que, por ejemplo, 6 se puede dividir en [2,3] o [3,2], y algunos métodos de división pueden hacer que el procesamiento posterior falle. Por ejemplo, cuando 6 se divide en [2,3] y la reforma es [3,2], no se puede procesar, pero se puede dividir en [3, 2]. Puede considerar probar diferentes métodos de división.

Luego combine estas pequeñas unidades en el grupo de forma real de acuerdo con la forma de entrada, por ejemplo [4,9] es [[a0,a1], [a2,a3]]

De acuerdo con esta pequeña agrupación de formas, se deriva el formato de forma de salida, por ejemplo, [[a2,a3], [a0,a1]]

Combine todas las formas pequeñas en un todo y combínelas y agrúpelas de acuerdo con la continuidad de las etiquetas de forma de símbolo para obtener [a2, a3], [a0, a1]

Con base en esta información, es fácil obtener la información final fusionada de remodelación y transposición.

Estos operadores se pueden combinar con algunos tipos de elemwise.

Demostración del efecto de fusión:

No todas las escenas se pueden fusionar en una transposición, como esta escena, puede considerar fusionar solo una parte de ellas.

Dividir y sesgar agregar orden de intercambio

La escena se puede ver en el codificador de texto CLIP

Este operador mul se puede colocar en cualquier lugar entre reformar y transponer a continuación, y se puede colocar en una posición adecuada para integrarse mejor con otros operadores.

Multiplicación de matrices + fusión BN

Similar a Conv2D + fusión de normalización por lotes (BN) con convolución + fusión BN_Blog de Luchang-Li-CSDN Blog_bn Fusion

Combinar Conv2D o MatMul adyacentes

No puede haber cálculos como operadores no lineales entre estos dos operadores, y dos Conv2D adyacentes y la multiplicación de matrices se pueden combinar directamente en uno.

Fusión de MatMul y Add, cálculo vectorial Mul

En la figura, MatMul y los siguientes tres operadores Add y Mul se combinan en un solo MatMul + add. De hecho, se puede fusionar cualquier número de operadores Add y Mul detrás de MatMul, pero hay algunos requisitos previos, como Add y Mul. El dos entradas deben ser constantes, y las dimensiones son 1D o 2D, etc.

Por ejemplo, combine MatMul+bias y agregue un vector Add o Mul:

(en*B+sesgo0) + sesgo1 = en*B + (sesgo0+sesgo1)

(en*B+sesgo0) * sclae1 = en*(B*sclae1) + (sesgo0*sclae1)

Por lo tanto, se puede fusionar todo el tiempo (el primer MatMul no tiene sesgo y se puede considerar que contiene un sesgo con un contenido de 0).

Esta fusión definitivamente mejora en rendimiento, pero puede haber sacrificios en precisión, especialmente la fusión del operador mul. Debido a que la matriz original multiplicada por el peso, el sesgo y la escala suelen ser valores relativamente pequeños inferiores a 1, después de integrar la escala en el peso y el sesgo, los valores de peso y sesgo se reducirán aún más, lo que puede conducir a una disminución en exactitud.

Puede intercambiar mul y add, y dividir el contenido de add por el valor escalar interno de mul, de modo que add se pueda integrar en matmul con sesgo, y el mul subsiguiente también se pueda integrar en matmul. Sin embargo, el cálculo del FP16 puede tener una gran pérdida de precisión.

DepthwiseConv+Añadir

El cálculo es x*w1+bias1+x, que puede convertirse en x*w1+x*w2+bias1, donde * es convolución.

Entre ellas, w2 es una función delta, es decir, un filtro con 1 en el medio y 0 en el resto. Entonces, al final, este cálculo se puede convertir a

x*(w1+w2)+sesgo1

(X+b1)*w2 = X*w2+b1*w2

 El primer Add se puede mover a MatMul, y luego los siguientes dos Add se pueden fusionar en uno.

Fusión del operador LayerNorm

La norma de capa de algunos marcos de trabajo de aprendizaje profundo se compone de varios operadores pequeños. Reemplace el reconocimiento de patrón anterior con un operador de norma de capa fusionado escrito a mano. El rendimiento del operador fusionado se puede mejorar varias veces. El último opset 17 de onnx agrega esta definición de operador de fusión.

Diferentes implementaciones de norma de capa en modelos

Esta es otra situación de norma de capa, que puede deberse principalmente a problemas de desarrollo de código, lo que da como resultado que aparezcan dos suboperadores después de reduce, pero los cálculos de estos dos operadores son exactamente iguales.

En algunos modelos, cuando pb se convierte en onnx, la reducción de la norma de capa se reemplaza por GlobalAvgPool. Cuando la longitud de la forma es 3, se puede reemplazar directamente por reducemean para evitar la falla de coincidencia de la norma de capa anterior.

Los tres Slices aquí en realidad pueden ser reemplazados por un Split, por supuesto, también puede ver qué método de implementación es mejor

Fusionado en ReduceSumSquare

En la figura a continuación, se puede cambiar a reformar+transponer para calcular de manera más eficiente.Por supuesto, es mejor modificarlo en el nivel de código del modelo. Esto refleja profundamente el mismo paradigma informático y la diversidad de diferentes desarrolladores de código, pero la eficiencia informática de los diferentes métodos de composición de la misma informática puede ser diferente.

Combinar el mismo cálculo

Especialmente los operadores de transformación, como transposición, remodelación, etc.

Cómo identificar estos mismos patrones informáticos de manera más inteligente y eficiente también es un problema digno de investigación, en lugar de hacer juicios manualmente cada vez.

Eliminar operadores innecesarios

Como la identidad, ampliar

La expansión en la figura a continuación es en realidad innecesaria, porque, como elemento ternario, tiene su propia capacidad de transmisión, y la expansión requiere lectura y escritura de memoria adicional en un tensor grande, lo que resulta en una pérdida de tiempo. El juicio de generalidad se puede hacer de la siguiente manera: expand es seguido por un operador elemwise y otras formas de entrada de este elemwise y la forma de entrada de expand puede transmitirse a la salida de forma por elemwise, esta expansión se puede eliminar.

Puede cambiar la reforma directamente y, por lo general, la reforma no requiere un cálculo real. 

fusión de tensor concatenado dividido

La situación en la imagen de arriba también puede deberse al desarrollo del código. Muchos tensores pequeños se dividieron y luego se concatenaron. La entrada de split en concat es continua, por lo que los tensores en la división intermedia se pueden fusionar. Es decir, en la figura anterior se dividen 24 tensores, pero de hecho, solo se necesita dividir 2 tensores. El primer concat se puede eliminar directamente.

Plegado constante relacionado con la forma

Cuando la forma es fija y conocida, la forma puede calcularse por adelantado y reemplazarse con const, de modo que los operadores de conexión subsiguientes de la forma puedan realizar un plegado constante.

Optimización relacionada con el operador de transposición

Varios escenarios comunes para la optimización del operador de transposición - Blog de Luchang-Li - Blog de CSDN

Ajuste de orden de operador

Ajuste el orden para plegar el div en los parámetros matmul y bias_add, el segundo es similar. Aquí podemos considerar la abstracción de un algoritmo más general para hacer frente a una gama más amplia de situaciones.

Los mismos patrones de cálculo multicanal se fusionan en cálculos por lotes, lo que reduce significativamente el número de operadores y mejora la intensidad de cálculo de los operadores, como se muestra en la siguiente escena; además, otro escenario es que la multiplicación y combinación de las tres matrices de atención en el modelo de transformador se puede combinar en un matmul por lotes, o por sí mismo. La implementación especial puede aceptar múltiples entradas y multiplicación de matriz de polarización al mismo tiempo.

Los cortes paralelos multidireccionales se pueden reemplazar por recopilación en determinadas circunstancias, y todo lo siguiente se puede sintetizar en un solo cálculo. El de la figura a continuación es un poco más complicado. Slice se puede reemplazar por Gahter y, de forma alternativa, se puede fusionar en consecuencia, pero la fusión de Recolectar V2 requiere un operador personalizado Recolectar por lotes V2. 

Convolución adyacente/matmul+sesgo, si no hay una capa no lineal en el medio, se puede fusionar directamente en función de la linealidad de la convolución y la multiplicación de matriz

reemplazo del operador

Si solo se corta un eje, se puede reemplazar con reunir para simplificar la implementación y usar una implementación más eficiente.

método de optimización de gráfico de onnx y tensorflow pb model

optimización del gráfico del modelo onnx/modificación del modelo_Blog de Luchang-Li-CSDN Blog_onnx.checker.check_model

Modificación y optimización del modelo pb de TensorFlow_blog de Luchang-Li-blog de CSDN_optimización del modelo de tensorflow

Supongo que te gusta

Origin blog.csdn.net/u013701860/article/details/126808023
Recomendado
Clasificación