Optimización de la estructura del modelo de IA basada en NvidiaGPU

prefacio

Hace algún tiempo, recibí una solicitud de aterrizaje para un modelo de IA del grupo de algoritmos. Este modelo se adaptó sobre la base del modelo original para el razonamiento en tiempo real en el servidor, y la cantidad de cálculo se redujo de 7G Macs a 1G Macs. , pero el real reflejado El aumento de velocidad es solo del 30%.

Esto refleja un problema, es decir, los desarrolladores del algoritmo de IA no están familiarizados con el hardware del modelo y solo cortan y optimizan el modelo en su espacio cognitivo, por lo que habrá una brecha tan grande en la optimización. resultados. Así que envié comentarios de modificación del modelo al grupo de algoritmos. Después de su modificación, la cantidad de cálculo del modelo es 8G Macs, pero el tiempo de razonamiento es más corto que 1G Macs.

Si está entrenando un modelo de IA y desea implementarlo en la GPU de Nvidia, el siguiente contenido puede resultarle muy útil.

texto

En términos generales, la cantidad de cálculo del modelo es la cantidad de operaciones de multiplicación y suma de números de coma flotante. Si la inferencia se realiza en un solo núcleo en la CPU, el tiempo de inferencia básicamente aumentará con la cantidad de cálculo. Pero Básicamente, los modelos más grandes se implementan en la GPU o el chip AI para el razonamiento. En este momento, se debe considerar el problema de la paralelización del modelo. Pero este no es el tema de hoy. El tema de hoy es sobre el núcleo de computación matricial en NvidiaGPU, TensorCore.

A partir de la arquitectura Volta, Nvidia ha introducido un nuevo módulo Tensor Core además del módulo de operación INT y el módulo de operación FLOAT en cada núcleo SM, como se muestra en la siguiente figura:

Entre ellos, INT32 FP32 FP64 son módulos de operación matemática, que se utilizan para el cálculo general. El cálculo en el núcleo CUDA ordinario se calcula llamando al módulo correspondiente por cada subproceso. El Tensor Core a la derecha es el módulo utilizado para el cálculo matricial. Según los datos del manual de Nvidia Ampere A100, la potencia informática de TensorCore es 4 veces mayor que la potencia informática general.

TensorCore

He compartido tecnología relacionada en la empresa antes:

Entre ellos, analicé principalmente la arquitectura del servidor GPU A100 de Nvidia y Huawei Ascend 910. Sus módulos centrales son muy similares, es decir, el módulo de operación matricial, NV se llama TensorCore y Huawei se llama Cube.

Su mapa conceptual es más o menos así:

Entre ellos, el azul claro y el violeta son dos matrices de 4x4, y el gris es el núcleo informático. Cada núcleo completa la multiplicación de elementos de las posiciones correspondientes de las dos matrices, y el resultado de la multiplicación finalmente se acumula en el verde 4x4. matriz a continuación.

¿Qué capa en AI usará este TensorCore dedicado al cálculo de matrices?¿Es Dense Layer, FC?

Incorrecto, en realidad es convolución.

Dense Layer y FC también son cálculos matriciales, pero en la mayoría de los casos, son cálculos matriciales de 1 x ChannelIn x ChannelOut, por lo que para este cubo, solo se usa una fila de datos de matriz A, lo que no refleja la ventaja de potencia informática de TensorCore .

Hay dos formas de convertir la convolución en cálculos matriciales, una es Winograd y la otra es Gemm.Hasta donde yo sé, Gemm tiene una mayor ventaja en la estructura de TensorCore.

Sin embargo, diferentes parámetros de convolución tienen tasas de utilización muy diferentes para TensorCore.

Parámetros de convolución

En primer lugar, CUDA tiene ciertos requisitos sobre la forma de la matriz al llamar a TensorCore, como la forma de la matriz de 32x8x16, que es el principal factor que causa problemas de rendimiento. Los problemas subyacentes de CUDA no se explicarán.

Estos son algunos consejos para recordar: 1. El número de canales Tensor para entrada y salida debe ser preferiblemente un múltiplo de 16, y el mínimo no debe ser inferior a 8. 2. Trate de evitar el uso de convolución profunda, en la medida de lo posible. sepa que no se puede convertir efectivamente en cálculos matriciales, es decir, es imposible llamar a TensorCore para acelerar, 3. Use "convolución de dos pasos".

La cantidad de canales es un múltiplo de 16, principalmente debido a los requisitos de forma de la matriz cuando CUDA llama a la interfaz TensorCore.

La convolución de dos pasos es una palabra que creé temporalmente. Esto significa: si desea usar la convolución para convertir un tensor de canal n en un canal m, donde n es menor que 8, por ejemplo, la mayoría de ellos no son 1 al ingresar Es 3. m es muy grande, como 32, 64, 128, que son números de canal iniciales comunes. De manera similar, m es pequeño y n es muy grande. En este momento, la operación del kernel de convolución usa directamente mxnx3x3 (como 3x3 convolución) es La eficiencia es muy baja. En este momento, se puede dividir en dos convoluciones. Tome un número de canal intermedio k (8 o 16), primero convolucione de n a k, y luego convolucione de k a m.

Prueba de razonamiento modelo

Primero veamos la imagen de la estructura del modelo, lo que está haciendo la convolución de dos pasos:

El modelo de la imagen de arriba es un tensor cuya entrada es de 1 canal, que se convierte en 64 canales después de la primera capa de convolución.Esto es muy complejo con el rango de tamaño de n y m que escribí arriba, uno es muy pequeño y el otro es muy grande.

Siguiendo el método de convolución en dos partes, el modelo se modifica de la siguiente manera:

Es decir, el modelo primero se convoluciona a 16 canales y luego se convoluciona a 64 canales.

Eche un vistazo a la comparación de la cantidad de cálculos y parámetros de los dos modelos:

Método de convolución directa: 1G Macs, 1217 params

Convolución de dos pasos: 17G Macs, 18817 params

Obviamente, independientemente del número de parámetros o la cantidad de cálculo, la convolución de dos pasos es más de 10 veces mayor que la convolución directa, pero ¿será tan diferente el tiempo de razonamiento real?

Usé TensorRT7.2.2.3 para probar la velocidad de estos dos modelos, y la forma del tensor de entrada es 1x1x720x1280. El resultado de ejecución es: 

Convolución directa 2ms

Convolución de dos pasos 2.5ms

Eso es una reducción del 25% en la velocidad.

Bajo este cambio de velocidad, en primer lugar, aumenta la cantidad de capas de red y también aumenta la cantidad de parámetros, lo que puede decirse que es un negocio muy rentable para el modelo de IA. Por el contrario, para reducir la cantidad de cálculo, el número de capas de red se reduce o cambia a Para una estructura de red de canal pequeño por debajo de 8, tales beneficios no son rentables.

Se debe usar acero en la hoja.

Resumir

Debido a la aparición de TensorCore, ha traído algunos cambios nuevos al razonamiento de los modelos de IA, que es diferente de la computación de CPU y la computación de uso general de GPU. Por lo tanto, si desea que su propio modelo de IA haga un buen uso de TensorCore de Nvidia rendimiento del razonamiento, lo compartiré con ustedes en Las siguientes recomendaciones se hicieron al diseñar la estructura del modelo:

1. El número de canales de Tensor para entrada y salida debe ser preferiblemente un múltiplo de 16, y el mínimo no debe ser inferior a 8;

2. Trate de evitar el uso de la convolución en profundidad.Hasta donde yo sé, no se puede convertir efectivamente en un cálculo matricial, es decir, no se puede acelerar llamando a TensorCore;

3. Use "convolución de dos pasos".

 

Finalmente, que yo sepa, el único motor que puede reproducir perfectamente el rendimiento de TensorCore es TensorRT. Algunas plataformas de entrenamiento e inferencia (como pytorch) en realidad llaman a cuDNN para completar el razonamiento del modelo. Pero según mi experiencia, el mismo La implementación de la convolución de parámetros cuDNN es más de 3 veces más lenta que la implementación de TensorRT. También traté de implementar la convolución basada en TensorCore, pero al final seguirá siendo un 20% más lenta que TensorRT.

Por lo tanto, si modifica la estructura del modelo de acuerdo con lo que dije, también debe usar TensorRT para implementar su modelo, a fin de lograr el máximo rendimiento de inferencia del modelo.

Epílogo

Hace mucho tiempo que no actualizo el artículo, principalmente porque no sé qué escribir. Debido a que el contenido del trabajo es demasiado profesional, todavía quiero escribir algunos artículos que el público pueda leer y beneficiarse. Es Esperaba que planeara algunos nuevos para escribir después de que VS2022 se publique algo.

 

Supongo que te gusta

Origin blog.csdn.net/luoyu510183/article/details/117385131
Recomendado
Clasificación