1. Optimización de la inferencia del modelo.
Con la implementación de modelos en diversos escenarios, la aceleración de la inferencia de modelos se ha convertido desde hace mucho tiempo en una parte importante de la ingeniería de IA. En los últimos años, los modelos grandes basados en la arquitectura Transformer se han generalizado y logran resultados SoTA en diversas tareas. Sus costosos costos de capacitación e inferencia hacen que sus prácticas de implementación a costos razonables sean aún más importantes.
Los desafíos que enfrenta la inferencia de modelos grandes incluyen principalmente los dos puntos siguientes:
- Los enormes requisitos de memoria (memoria de vídeo) provienen principalmente de los requisitos inmediatos de parámetros e inferencias del propio modelo.
- Para un modelo LLaMA2-30B, cargar el modelo en la memoria de video requiere aproximadamente 60 GiB de memoria de video. Durante el proceso de inferencia, la caché KV de un solo token requiere aproximadamente 1,6 MiB de memoria de video: 6656 (capa tenue) * 52 (. número de capa) *2 (K y V) * 2(fp16, 2 bytes); para una solicitud de 2048 tokens, se requieren 3,3 GiB de memoria de vídeo.
- El paralelismo es deficiente porque el proceso de generación suele ser un proceso en serie en términos de tiempo, lo que dificulta la paralelización del proceso de decodificación y se convierte en un cuello de botella computacional.
Los métodos comunes de optimización del razonamiento incluyen la destilación del conocimiento (KD), la poda y la cuantificación, así como varias soluciones propuestas para la optimización de la memoria LLM (como atención flash, atención paginada, etc.).
La destilación se refiere a la construcción directa de un modelo pequeño como modelo de estudiante y al aprendizaje supervisado del conocimiento del modelo original mediante la combinación de etiquetas suaves y etiquetas originales, de modo que el modelo pequeño tenga un rendimiento comparable al modelo original y finalmente reemplace el modelo grande con un modelo pequeño para mejorar la eficiencia.
[Fuente de la imagen: Destilación del conocimiento: una encuesta, 2021, p2]
La poda "adelgaza" el modelo eliminando pesos sin importancia en el modelo y mejora la eficiencia de razonamiento del modelo. Para garantizar las capacidades del modelo, el proceso de poda generalmente también debe ir acompañado de un ajuste fino del modelo basado en datos de entrenamiento. . Según las diferentes dimensiones de los pesos de poda, se puede dividir en poda estructurada y poda no estructurada.
- Poda estructurada: generalmente poda canales sin importancia en bloques de acuerdo con una o más dimensiones del tensor de peso y mantiene la multiplicación de matrices normal; sin embargo, debido a que los canales podados afectan el razonamiento de las capas superior e inferior, la precisión lógica de la red debe ser mayor; ser revisado.
- Poda no estructurada: poda aleatoriamente elementos sin importancia en el tensor de peso, por lo que generalmente mantiene la estructura de peso original, lo que da como resultado cálculos de multiplicación escasos, pero no es adecuado para hardware de uso general, por lo que se requiere hardware especial para acelerarlo.
En la actualidad, existen pocas aplicaciones de poda en LLM. Por ejemplo, el siguiente trabajo de poda basado en Activation-aware [1] realiza principalmente poda no estructurada en función del valor absoluto del peso en sí y del valor absoluto del tensor de entrada. El tensor de peso en sí se vuelve escaso y la pérdida de precisión del modelo no puede cumplir con los requisitos de ingeniería.
[Fuente de la imagen: un enfoque de poda simple y eficaz para modelos de lenguaje grandes, 2021, p2]
Como se muestra a continuación, el trabajo reciente sobre poda estructurada [2] utiliza métodos de búsqueda para encontrar subestructuras en el modelo y mantiene la precisión del modelo mediante el reentrenamiento. La precisión del modelo podado se reduce considerablemente en comparación con el modelo original. en comparación con otros modelos más pequeños con el mismo número de parámetros (después de la poda) para mostrar la importancia de su método.
[Fuente de la imagen: Sheared LLaMA: aceleración del preentrenamiento del modelo de lenguaje mediante poda estructurada, 2023, p3]
[Fuente de la imagen: huggingface/Sheared-llama-1.3B]
La razón por la cual la cuantificación se ha convertido en la primera opción para las redes neuronales y el LLM es por las siguientes ventajas:
- El reflejo intuitivo de reducir la memoria de video.
- Generalmente, los pesos LLM se almacenan en FP16, y después de que los pesos se cuantifiquen en int4, el volumen se reducirá intuitivamente a 1/4 del tamaño original (en realidad, puede ser un poco más grande debido a incrustaciones no cuantificadas, asignación de memoria y otros). razones) y los requisitos de recursos para la memoria de video se reducen considerablemente.
- Aceleración de operadores como W4A16 y W8A16 para aumentar la velocidad de cálculo.
2. Introducción a la cuantificación
base
La esencia de la cuantificación suele ser convertir los parámetros del modelo, o el proceso de razonamiento de todo el modelo, de punto flotante a número entero.
El parámetro de cuantificación suele constar de dos valores: escala y punto cero. El primero es un punto flotante y el segundo es un número entero. Suponiendo que x es un tensor (puede ser un peso o una variable intermedia para el razonamiento), el proceso de cuantificación se puede expresar de la siguiente manera:
Utilice b para representar el ancho de bits de cuantificación, q {min} y q {max} representan respectivamente el rango del rango de valores enteros. Por ejemplo, la cuantificación int-8 puede tomar [-128,127], es decir, q {min} =. -2^(b-1 )=-128, q{max}=2^(b-1)-1=127, abrazadera(a;q{min},q{max}) significa que el valor de entrada a es Basado en la operación de truncamiento de rango [q{min}, q{max }], x{int} representa el resultado cuantificado, s y z representan la escala de los parámetros de cuantificación y el punto cero.
【图片出处:Una encuesta sobre métodos de cuantificación para la inferencia eficiente de redes neuronales, 2021,p5;Una introducción a la cuantificación de modelos de lenguaje grandes,p12】
El proceso de descuantización de entero a punto flotante es el siguiente,
En cuanto a los parámetros de cuantificación, existen muchos algoritmos basados en búsqueda, optimización, LKD (destilación capa por capa) y otros algoritmos para calcular sus soluciones óptimas, minimizando así la pérdida de precisión causada por la cuantificación y el método de cálculo de escala y escala más directo; Eso se basa en elementos tensoriales min/max.
El siguiente es un ejemplo de código simple que representa la cuantificación del tensor x de fp32 al tipo entero int8 y luego la cuantificación inversa de regreso a fp32:
Un ejemplo del procedimiento x->x{int}->x_hat es el siguiente:
x antes de la cuantización:
Después de la cuantificación x_hat:
Simétrico/asimétrico
En comparación con la cuantificación asimétrica, la definición de cuantificación simétrica es que el rango de valores enteros asignado por la cuantificación es simétrico según el valor 0, es decir, el punto cero de la fórmula anterior es 0, qmax = -qmin, lo que hace que la expresión forma de cuantificación más simplificada.
La cuantificación asimétrica es beneficiosa para utilizar completamente el rango de cuantificación. Por ejemplo, la salida del tensor de excitación de Conv+ReLU tiene todos los valores positivos. Si se utiliza la cuantificación simétrica, todos los puntos flotantes se asignarán al rango [0~127], la mitad del rango no se utiliza y su precisión de cuantificación no lo es. tan bueno como la cuantificación asimétrica.
[Fuente de la imagen: Estudio de métodos de cuantificación para la inferencia de redes neuronales eficientes, 2021, p5]
En la práctica, a menudo se opta por realizar una cuantificación simétrica en el tensor de peso y una cuantificación asimétrica en el tensor de entrada. El siguiente es un análisis del documento técnico de cuantificación de Qualcomm. Por ejemplo, cuando se selecciona la cuantificación asimétrica tanto para pesos como para entradas, tomando como ejemplo la multiplicación matricial de la capa lineal, la expresión se expande de la siguiente manera:
- El primer elemento es la operación de multiplicación del tensor de números enteros, que es una operación inmediata necesaria;
- Las operaciones de los elementos tercero y cuarto incluyen la multiplicación de pesos de escala, cero y enteros. Todos estos se predicen de antemano y, por lo tanto, pueden calcularse de antemano y agregarse como compensaciones;
- El cálculo del segundo elemento depende de x {int}, que debe calcularse inmediatamente para cada inferencia, lo que generará potencia informática adicional.
Por lo tanto, cuando cambiamos la cuantificación de peso a cuantificación simétrica (zW = 0), la fórmula anterior se simplifica de la siguiente manera. En el cálculo en tiempo real, solo necesitamos calcular la multiplicación matricial del primer elemento, y el segundo elemento es el. elemento de sesgo precalculado:
Cuando ambos están cuantificados simétricamente, las expresiones se simplifican de la siguiente manera:
Comparando el cálculo de punto flotante W {x} en el modelo original, W {int} x {int} es la multiplicación entre números enteros y enteros. Este último es mucho más rápido en la GPU de Nvidia que el primero. la velocidad se acelera mucho.
3. Cuantificación de LLM
Desafíos en la cuantificación de LLM
Desde la perspectiva del rendimiento del modelo, una premisa que la cuantificación debe resolver de principio a fin es cómo mantener la precisión del modelo cuantificado, es decir, hacer que los usuarios del modelo sientan que el modelo cuantificado puede mantener el rendimiento original mientras mejora el rendimiento. eficiencia del razonamiento.
Las operaciones que deben cuantificarse en la red neuronal son principalmente la capa convolucional Conv (x; W) y la capa completamente conectada Wx, es decir, la cuantificación de peso (WQ) y la excitación de W y x respectivamente de acuerdo con las operaciones descritas. en la parte anterior Cuantificación (Cuantificación por Activación, AQ).
A diferencia del modelo CNN o del modelo Transformer pequeño, el tensor de excitación generado por la multiplicación matricial del modelo Transformer grande generalmente tiene más valores atípicos, es decir, el grupo de puntos formado por la mayoría de los puntos de la distribución de valores está muy lejos de estos elementos. los valores con un valor absoluto grande pero una proporción baja aumentan la dificultad de la cuantificación. Cómo elegir valores atípicos suele ser una gran dificultad en el trabajo de cuantificación. Si lo considera demasiado, el rango de cuantificación será demasiado grande y el rango de expresión de cuantificación se reducirá. Si lo trunca demasiado, estos valores tienen un valor absoluto grande. Los valores generalmente estarán en el Tiene un mayor impacto en los resultados en la inferencia del modelo, lo que lleva a un rendimiento deficiente del modelo, y esto último es particularmente obvio en la cuantificación LLM.
Las siguientes figuras muestran las estadísticas del valor de los elementos de una determinada capa de tensores de entrada de Resnet18 y Opt-13B, respectivamente. sigma representa la desviación estándar de sus respectivas distribuciones. El valor máximo de la entrada de Resnet18 es de aproximadamente 28 sigma y la proporción de valores absolutos. distintos de 6 sigma son 0,05% y el valor de entrada máximo de la red Opt-13B es 325 sigma y la proporción de valores absolutos distintos de 6 sigma es 0,2%. En términos de efecto de cuantificación, la precisión int-8 de Resnet18 básicamente no tiene pérdida, mientras que la precisión del modelo int-8 de Opt-13B colapsó.
[Fuente de la imagen: Introducción a la cuantificación de modelos de lenguaje grandes, p20]
En respuesta al desafío de la cuantificación de incentivos, existen algunas soluciones que intentan reducir la precisión de la cuantificación, como la idea propuesta por SmoothQuant.
[Fuente de la imagen: SmoothQuant, p4]
En la multiplicación de matrices, reducen el valor del tensor de entrada ) y diag(s)·W. Esto reduce la dificultad de cuantificación del tensor X al tiempo que garantiza que el producto de la operación de multiplicación permanezca sin cambios. En la ingeniería real, el error de cuantificación causado por este esquema de cuantificación todavía tiene un impacto relativamente obvio en el efecto de razonamiento de modelos grandes, y existen errores obvios incluso en la cuantificación de precisión int-8. Por ejemplo, los siguientes resultados de la aplicación SmoothQuant para Llama2-7B muestran que su perplejidad es muy pobre y difícil de aplicar en la práctica.
Por lo tanto, la mayoría de las soluciones prácticas en el despliegue de ingeniería actual son soluciones de cuantificación de sólo peso, es decir, renunciar a la cuantificación de la activación.
GPTQ
GPTQ es el esquema de cuantificación más antiguo aceptado para la implementación de ingeniería. El efecto de cuantificación de W8A16 o W4A16 es cercano al modelo original en la mayoría de los escenarios y el proceso de cuantificación es muy rápido.
Proceso de cuantificación
Tomando como ejemplo la operación unitaria básica de la multiplicación de matrices, basada en el error cuadrático medio del producto antes y después de la cuantificación solo de peso, se puede escribir la siguiente función de optimización:
W es el peso de la capa lineal en Transformer y X representa su entrada correspondiente. El proceso de cuantificación fuera de línea consiste en cuantificar módulo por módulo (Transformador) y capa por capa (Q, K, V, O, Fc1, Fc2).
Los parámetros y datos se definen de la siguiente manera:
- W∈R^{K×M},X∈R^{M×N},Y=W×X∈R^{K ×N}
- calibrar conjunto: parte de los datos se usa para inferencia, se usa para ver el rango de valores del tensor de entrada de cada capa y se cuantifica en base a esto.
El proceso de cuantificación específico es el siguiente:
- Calcule el hessiano (la función de optimización anterior es para el hessiano de W_hat, no para el hessiano en retropropagación) y agregue el término de perturbación:
- ordenar orden de acto (desc_act, las columnas con rangos de valores similares se cuantifican juntas), según diag (H), las columnas de W se reorganizan según la dimensión M. De la misma manera, H se reorganiza en dos dimensiones en consecuencia.
- Encuentre la inversa H^(-1) (descomposición de Cholesky).
- Para W a lo largo de la dimensión M, cuantice bloque por bloque de izquierda a derecha, tamaño de bloque B = 128, y la parte no cuantizada en el lado derecho se actualiza según H^(-1) para compensar la pérdida de cuantización.
- (Bucle interno) Para cada bloque, cuantice columna por columna, calcule el error y actualice las columnas no cuantizadas dentro del bloque en función del error.
- (bucle externo) Después de operar el bloque, actualice todas las columnas que lo siguen:
tamaño del grupo
- Si no se especifica el tamaño del grupo, el valor predeterminado es g = -1. Los parámetros de cuantificación se cuentan en unidades de todas las columnas y se cuantifica el peso de cada fila. Para W∈R^{K×M}, se cuantifica el número de. Los parámetros de cuantificación son K×1.
- Si se especifica el tamaño del grupo, por ejemplo, g=128, los parámetros de cuantificación se contarán en unidades de 128 columnas y se cuantificará el peso de cada fila. Para W∈R^{K×M}, el número de. Los parámetros de cuantificación son K×( M/g).
Reorganizar desc_act
Según la matriz de Hesse H, W se reorganiza según la dimensión M según diag (H). El propósito es priorizar las columnas de peso correspondientes a la activación con valores absolutos más grandes. Estas columnas se consideran columnas más importantes que afectan los resultados en el razonamiento. Por lo tanto, se espera producir el menor error posible al cuantificar estas columnas. Desplaza más errores de cuantificación a columnas posteriores y menos importantes.
Algunos experimentos muestran que el efecto de desc_act sobre la pérdida de cuantificación es un truco eficaz en la mayoría de las tareas.
Perplejidad de Pygmalion-7B con GPTQ [7]
[Fuente de la imagen: https://huggingface.co/reeducator/vicuna-13b-free/discussions/22]
operador
Estrictamente hablando, el W4A16 basado solo en peso no tiene mucha mejora en eficiencia en comparación con el W16A16 original, y el proceso cuantitativo/descuantitativo también se agrega a la inferencia a medida que el peso exclusivo se convierte en la corriente principal de la cuantificación LLM y su aplicación es cada vez mayor; y más Hay muchos trabajos de código abierto basados en la escritura de operadores eficientes W4A16 para acelerar el razonamiento de algoritmos cuantificados. Por ejemplo, el paquete Python de GPTQ, AutoGPTQ, se ha integrado en la herramienta de código abierto exllama, que reescribe la computación paralela de la multiplicación cuantificada . Basado en tritón y CUDA. En
exllama/exllama_ext/matrix.cuh puedes ver la implementación de dot_product8_h de out=W_hat·x=(W{int}-z)s·x=(W{int}-z)x·s.
[Fuente de la imagen: https://github.com/turboderp/exllama/blob/3b013cd53c7d413cf99ca04c7c28dd5c95117c0d/exllama_ext/matrix.cuh#L86]
AWQ
En comparación con GPTQ, que diseña soluciones basadas en problemas de optimización, AWQ es una solución cuantitativa basada en búsqueda.
Usando Q (·) para representar el proceso de cuantificación y cuantificación inversa, el proceso de cuantificación antes de la modificación es el siguiente:
Después de la modificación, el proceso de cuantificación es el siguiente, agregando escala a W:
buscar
El nombre completo de AWQ es Cuantificación de peso consciente de la activación, lo que significa que la influencia del valor de activación se considera en el proceso de cuantificación del peso. El punto de partida también se basa en el hecho de que en cada canal de Peso, el canal con un valor de Actividad correspondiente mayor es relativamente importante, y viceversa. Su importancia se multiplica por un factor de escala Δ para reflejar su importancia y el valor. de Δ es igual a El rango está diseñado por el valor tensor de la activación de entrada.
El estándar de medición de la búsqueda se basa en la comparación de los resultados de salida antes y después de la cuantificación de la capa lineal, y el que tiene el resultado MSE más pequeño es la solución óptima.
Efecto
En términos de rendimiento del modelo, el coeficiente de escala óptimo se encuentra mediante la búsqueda de escala capa por capa para obtener la solución con el error de cuantificación más pequeño. La siguiente comparación de efectos del artículo de AWQ muestra los resultados de la cuantificación en la prueba de dos generaciones de Llama. desde la perspectiva de Perplexity. Ligeramente mejor que GPTQ y la versión ordenada de GPTQ.
[Fuente de la imagen: AWQ, p6]
A juzgar por la precisión de las tareas reales, la precisión de AWQ es comparable a la versión act_order de GPTQ (GPTQ-R), mientras que la velocidad es mejor que esta última.
[Fuente de la imagen: AWQ, p5]
En términos del rendimiento informático del modelo, GPTQ tiene una operación de reordenamiento y la multiplicación de matrices es MV (matriz × vector), que es un acceso a memoria discontinuo, mientras que AWQ no tiene una operación de reordenamiento y la multiplicación de matrices es ( matriz × matriz), que es más rápido.
4. Resumen
Con respecto al rendimiento SOTA actual del trabajo de cuantificación LLM, su principal contribución se basa básicamente en el modo de cuantificación de solo peso. La reducción de la memoria de video requerida para ejecutar el modelo en la GPU.
Desde el rendimiento del modelo, porque hay una pérdida de cuantificación inevitable, y el modelo LLM suele ser mucho más sensible a la cuantificación que el modelo CNN tradicional, aunque el rendimiento del LLM después de la cuantificación no es muy diferente del rendimiento antes de la cuantificación en muchas tareas. , pero en Es posible que aún no puedas realizar algunas tareas.
Desde la perspectiva de la aceleración del modelo, la cuantificación solo del peso promueve el trabajo de aceleración subyacente, que básicamente se acelera en operadores de multiplicación como W4A16, W3A16 y W8A16. A juzgar por los datos teóricos proporcionados en el documento, en comparación con el modelo FP16. Por lo general, la mejora de velocidad es solo 1.x ~ 3.x veces, pero el efecto de implementación real puede ser menor que este valor y su efecto de aceleración es muy inferior al método de cuantificación tradicional de W4A4, W8A8 y otros operadores de multiplicación de enteros. .
En términos generales, el trabajo cuantitativo en el campo de LLM aún es preliminar. Si la precisión del rendimiento del modelo es muy alta en tareas reales, se recomienda utilizar algoritmos y herramientas basados únicamente en caché KV para mejorar el rendimiento de la memoria de la unidad, como. Atención flash-2, Atención paginada, etc.
5. Referencia
1. Un enfoque de poda simple y eficaz para modelos de lenguaje grandes, 2023.
2. Sheared LLaMA: Aceleración del preentrenamiento del modelo de lenguaje mediante poda estructurada, 2023.
3. Libro blanco sobre la cuantificación de redes neuronales, 2021.
4. SmoothQuant: Cuantización posterior al entrenamiento precisa y eficiente para modelos de lenguaje grandes, 2023.
5. GPTQ: Cuantización precisa posterior al entrenamiento para transformadores generativos preentrenados, 2023.
6. AWQ: Cuantización de peso consciente de la activación para compresión y aceleración LLM, 2023.
7. Alguna evaluación sobre el desempeño del GPTQ.
*Texto/ xujiong
Este artículo es original de Dewu Technology. Para obtener más artículos interesantes, consulte: Sitio web oficial de Dewu Technology.
La reimpresión sin el permiso de Dewu Technology está estrictamente prohibida; de lo contrario, se perseguirá la responsabilidad legal de acuerdo con la ley.
El equipo de la Fundación Google Python fue despedido. Google confirmó los despidos y los equipos involucrados en Flutter, Dart y Python se apresuraron a la lista caliente de GitHub: ¿Cómo pueden ser tan lindos los lenguajes y marcos de programación de código abierto? Xshell 8 abre la prueba beta: admite el protocolo RDP y puede conectarse de forma remota a Windows 10/11 Cuando los pasajeros se conectan al WiFi del tren de alta velocidad , la "maldición de 35 años" de los codificadores chinos aparece cuando se conectan a la alta velocidad. Rail WiFi, la primera herramienta de búsqueda de IA con soporte a largo plazo de la versión 8.4 GA. Perplexica: completamente de código abierto y gratuito, una alternativa de código abierto a Perplexity. Los ejecutivos de Huawei evalúan el valor del código abierto. Hongmeng: todavía tiene su propio sistema operativo a pesar de la continua supresión. por países extranjeros, la empresa alemana de software para automóviles Elektrobit abrió una solución de sistema operativo para automóviles basada en Ubuntu.