Varios escenarios y métodos para convertir cálculos de convolución en cálculos de multiplicación de matrices

El formato de datos de entrada y salida de convolución predeterminado en este documento es NHWC.

¿Por qué convertir la convolución al cálculo de la multiplicación de matrices?

Hay varias razones, 1. Debido a que la optimización de la multiplicación de matrices se ha estudiado durante décadas, existen resultados de investigación ricos y se encuentra disponible una biblioteca de aceleración BLAS con buen rendimiento. 2. La optimización de la multiplicación de matrices es más simple que la convolución Esto se debe principalmente a que la multiplicación de matrices tiene menos parámetros, principalmente M, N y K. Además, se puede agregar un lote con 4 parámetros. La entrada de convolución tiene [N, Hi, Wi, Ci], el filtro tiene [Hf, Wf, Ci, Co] y otros parámetros como la zancada. Entonces, el tipo de convolución supera con creces el tipo de multiplicación de matrices, por lo que la optimización suele ser más difícil.

Por supuesto, no es necesario convertir la convolución en multiplicación de matrices, ya que la conversión a multiplicación de matrices es solo uno de los medios para optimizar la convolución. Algunos escenarios no necesariamente necesitan convertirse a la multiplicación de matrices, como la conversión profunda.

convolución 1x1

La forma de entrada es [N, H, W, C] y el filtro es [Hf, Wf, Ci, Co]

FH, FW son ambos 1, remodelan directamente la forma de entrada a [N, H * W, C], filtran la remodelación a [[Hf * Wf * Ci, Co] y luego realizan la multiplicación de matrices para obtener [N, H * W , Co ], y luego remodelar a la forma de salida de la convolución.

forma del núcleo = convolución de zancadas

Similar a la convolución 1x1, este tipo de convolución se caracteriza por el hecho de que no hay superposición entre los bloques de datos de entrada calculados por cada convolución, y puede procesarse simplemente como una multiplicación de matriz en combinación con la transposición:

Suponiendo que el formato de entrada es [N, H, W, C], se puede reinterpretar como [N, H1*H0, W1*W0, C], H0, W0 son el tamaño de la forma del kernel, H1 y W1 son el ancho de la imagen de la salida de convolución, y el formato del filtro es [Hf, Wf, Ci, Co]

Convierta la entrada de convolución de [N, H1*H0, W1*W0, C] remodele y transponga a [N, H1*W1, H0*W0*C], y luego con el filtro [Hf*Wf*Ci, Co] Simplemente haga la multiplicación de matrices, y la salida es [N, Ho*Wo, Co], y remodelar es la forma de la salida de convolución.

Convolución de multiplicación de matriz explícita (convolución GEMM explícita)

También llamado Im2Col o im2row. Esto requiere dividir la convolución en dos operadores, Im2Col y multiplicación de matrices.

La idea de Im2Col es muy sencilla, es decir, expandir en una fila la parte de los datos de FH*FW*Ci que cubre cada filtro, como la K de la multiplicación de matrices, y la Co del filtro. como el N de la multiplicación de matrices.

El ancho de la imagen de todo el Hi*Wi de los datos de entrada debe calcularse para el cálculo de la convolución Ho*Wo, por lo que se utiliza como la parte M de la multiplicación de la matriz. Por lo tanto, los datos de entrada se convierten en [N, Ho*Wo , FH*FW*Ci] después de Im2Col El tensor de convolución y la remodelación del filtro de convolución es el tensor de [FH*FW*Ci, Co]. La matriz de multiplicación de los dos da como resultado [N, Ho*Wo, Co ], y luego Reshape se puede usar como salida de convolución.

Una gran desventaja de este método es que los datos temporales después de Im2Col tienen una gran mejora en comparación con la entrada de la convolución, que ocupará mucha memoria, especialmente en el caso de stride=1. Por ejemplo, si kernel_shape es 3x3 y stride=1, entonces los datos del tensor después de Im2Col son 9 veces mayores que los de la entrada de convolución.

Convolución GEMM implícita

Es lo mismo que el método Im2Col, pero no es necesario dividir la convolución en dos partes independientes de Im2Col y de multiplicación de matrices, sino implementar im2col mediante el uso de un método de lectura de datos específico al leer los datos para los cálculos de multiplicación de matrices.

El método GEMM implícito prefiere que el formato de datos de entrada sea NC1HWC0, donde la entrada C=C1*C0, C0 suele ser 4, 8, 16, etc.

Referencia de método de cálculo específico

Convolución: comprensión desde la perspectiva de la optimización del motor de inferencia y la optimización del hardware: se busca programador

El algoritmo de convolución indirecta

La parte superior es el principio de im2col. La siguiente es la multiplicación de matriz real. La matriz A lee los mismos mosaicos de columna de varias filas a la vez, y el núcleo lee varias columnas de la misma fila de mosaicos y recorre el k dirección.

convolución de Winograd

Aunque este método solo puede manejar varios escenarios que comparan formas y avances específicos del núcleo, su rendimiento suele ser mejor que el método Im2Col. Winograd convierte la convolución en el cálculo de la multiplicación de matrices a través de la transformación de entrada y peso, y finalmente obtiene el resultado de la convolución a través de la transformación de salida. Para conocer los principios específicos, consulte:

El algoritmo de Winograd realiza el principio de convolución_winograd convolution_Luchang-Li's Blog-CSDN Blog

práctica de convolución winograd_Blog de Luchang-Li-Blog CSDN

Árbitro

Convolución: comprensión desde la perspectiva de la optimización del motor de inferencia y la optimización del hardware: se busca programador

Técnicas de optimización de convolución en OpenPPL - Se busca programador

El algoritmo de convolución indirecta

Supongo que te gusta

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