Si alguna vez hubiera un ejemplo destacado de técnica contraria a la intuición, sería la cuantificación de redes neuronales. La cuantificación reduce, a menudo de forma drástica, la precisión de los pesos y otros tensores en los modelos de redes neuronales. No sorprende que reducir la precisión de los pesos y otros parámetros de, digamos, flotantes de 32 bits a enteros de 8 bits, haga que el modelo se ejecute más rápido y le permita ejecutarse en procesadores menos potentes con mucha menos memoria. El hallazgo sorprendente y contraintuitivo es que La cuantificación se puede realizar preservando en gran medida la precisión del modelo..
¿Por qué necesitamos la cuantización? La corriente grandes modelos de lenguaje (LLM) son enormes. Los mejores modelos deben ejecutarse en un grupo de GPU de clase servidor; Atrás quedaron los días en los que se podía ejecutar un modelo de última generación localmente en una GPU y obtener resultados rápidos. La cuantificación no solo hace posible ejecutar un LLM en una sola GPU, sino que también le permite ejecutarlo en una CPU o en un dispositivo perimetral.
Cuantización post-entrenamiento
La cuantización posterior al entrenamiento es una técnica de conversión que puede reducir el tamaño del modelo y al mismo tiempo mejorar la latencia del acelerador de hardware y de la CPU, con poca degradación en la precisión del modelo.
Dado lo maduro que es TensorFlow Lite en comparación con, digamos, el modelo Gen AI del día (probablemente Codestral de Mistral AI, que se publicó el día que escribí esto), vale la pena ver cómo TensorFlow Lite implementa la cuantización. En primer lugar, TensorFlow Lite implementa tres opciones de cuantización:
Técnica |
Beneficios |
Hardware |
Cuantización de rango dinámico |
4 veces más pequeño, aceleración de 2 a 3 veces |
UPC |
Cuantización entera completa |
4 veces más pequeño, 3 veces más velocidad |
CPU, Edge TPU, microcontroladores |
Cuantización float16 |
2 veces más pequeño, aceleración de GPU |
CPU, GPU |
En el árbol de decisiones que acompaña a esta tabla, los documentadores de TensorFlow Lite describen las consideraciones para elegir una técnica de cuantificación. Vale la pena leer la lógica. En pocas palabras, el mejor método de poscuantización para su caso de uso dependerá de la compatibilidad de su hardware con operaciones de punto flotante o entero y de si puede proporcionar un conjunto de datos representativo para la calibración.
Cuantización de rango dinámico
Luego explican por qué la cuantificación del rango dinámico es el punto de partida habitual: proporciona un uso reducido de la memoria y un cálculo más rápido sin necesidad de proporcionar un conjunto de datos representativo para la calibración. La cuantización de rango dinámico cuantiza estáticamente solo los pesos de punto flotante a entero en conversión tiempo, que proporciona 8 bits de precisión. Además, los operadores de «rango dinámico» cuantifican dinámicamente las activaciones en función de su rango a 8 bits y realizan cálculos con pesos y activaciones de 8 bits. Las salidas todavía se almacenan como valores de punto flotante.
Cuantización entera completa
La cuantificación de números enteros completos puede acelerar las cosas incluso más que la cuantificación de rango dinámico, pero es necesario proporcionar un conjunto de datos representativo para la calibración (normalmente unos pocos cientos de muestras) y ejecutar algunos ciclos de inferencia para poder capturar el rango de todos los valores de punto flotante. tensores en el modelo. Estos incluyen no solo ponderaciones y sesgos del modelo, sino también entradas, activaciones (salidas de capas intermedias) y salidas del modelo. La cuantificación de enteros completos es esencialmente obligatoria en dispositivos de solo números enteros, como microcontroladores de 8 bits, y aceleradores de solo números enteros, como el Coral Edge TPU.
flotador16 cuantificación
La cuantización Float16 reduce el tamaño del modelo hasta a la mitad, ya que todos los pesos se convierten en la mitad de su tamaño original y provoca una pérdida mínima de precisión. También admite algunos «delegados» (es decir, aceleradores en el dispositivo, como una GPU) que pueden operar directamente con datos float16. En el lado negativo, la cuantificación float16 no reduce la latencia tanto como la cuantificación a matemáticas de punto fijo. Además, un modelo cuantificado float16 «descuantificará» los valores de peso a float32 cuando se ejecute en una CPU, lo cual es una excelente razón para usar un delegado de GPU, junto con el aumento de velocidad al usar la GPU.
Cuantización y precisión del modelo.
Como es de esperar, la precisión puede ser un problema al cuantificar un modelo. Puede evaluar la precisión de un modelo cuantificado frente al modelo original y decidir si el modelo cuantificado es lo suficientemente preciso para sus propósitos. Por ejemplo, TensorFlow Lite ofrece Tres ejecutables para comprobar la precisión de los modelos cuantificados.. También podrías considerar Banco MQun punto de referencia y un marco para evaluar algoritmos de cuantificación en implementaciones de hardware del mundo real que utiliza PyTorch.
Si la degradación de la precisión debido a la cuantificación posterior al entrenamiento es demasiado alta, entonces una alternativa es utilizar entrenamiento consciente de la cuantificación.
Entrenamiento consciente de la cuantificación
Entrenamiento consciente de la cuantificación (QAT) modela los efectos de la cuantificación durante el entrenamiento o el ajuste fino y produce un modelo con pesos float32 que luego se pueden cuantificar en pesos enteros y activaciones. El modelo cuantificado resultante suele ser más preciso que un modelo producido mediante cuantificación posterior al entrenamiento (PTQ) sin tener en cuenta la cuantificación durante el entrenamiento.
Una forma rápida de comprender cómo y por qué funciona QAT es observar cuando Se calculan los rangos de activación. Para la cuantificación dinámica posterior al entrenamiento, el rango para cada activación se calcula sobre la marcha en tiempo de ejecución. Para la cuantificación estática posterior al entrenamiento (llamada cuantificación entera completa arriba), el rango para cada activación se calcula de antemano en el momento de la cuantificación, utilizando observadores para registrar los valores de las activaciones. Para el entrenamiento consciente de la cuantificación, el rango para cada activación se calcula en el momento del entrenamiento, siguiendo la misma idea que la cuantificación estática posterior al entrenamiento. El problema es que en QAT se utilizan operadores de “cuantización falsa” en lugar de observadores, no sólo para registrar valores, sino también para simular el error inducido por la cuantificación, de modo que el modelo pueda adaptarse a él.
LLM de 1 bit
El punto final obvio de la tendencia a la cuantización es un reducción al absurdo: Cuantización de 1 bit. Sorprendentemente, los modelos cuantificados de 1 bit (introducidos en el documento BitNet) realmente funcionan, y Modelos de 1,58 bits (explicaremos esa fracción en un momento) son incluso mejores. Ambos tipos de modelos fueron desarrollados por un grupo de Microsoft Research y la Academia de Ciencias de China.
Primero, modelos cuantificados de 1 bit. Para que no te hagas una idea equivocada, no, Modelos de transformadores BitNet de 1 bit No reduzca todos los tensores del modelo a 1 bit, quiera o no. Los pesos, y sólo los pesos, se binarizan a -1 o 1, después de la centralización a media cero, y luego los pesos binarizados se escalan para reducir el error introducido por la binarización.
Las activaciones se cuantifican a bPrecisión de bits (el documento original usaba precisión de 8 bits) después de un poco de escalado y recorte. El modelo se modifica para usar capas BitLinear en lugar de nn.capas Linear, y se aplica una función LayerNorm a la entrada de cada capa BitLinear. En otras palabras, se trabaja mucho para que los modelos cuantificados de 1 bit sean competitivos con los modelos originales en precisión, y al mismo tiempo sean mucho más pequeños y rápidos.
Ahora, sobre ese número de 1,58 bits. El papel La era de los LLM de 1 bit: Todos los modelos de lenguaje grande están en 1,58 bits introduce una variante LLM de 1 bit, llamada BitNet b1.58, en la que cada peso del LLM es ternario {-1, 0, 1}. Los autores dicen que son 1,58 bits, pero no muestran sus cálculos.
Según el documento, BitNet b1.58 “iguala el Transformer LLM de precisión total (es decir, FP16 o BF16) con el mismo tamaño de modelo y tokens de entrenamiento en términos de perplejidad y rendimiento de la tarea final, a la vez que es significativamente más rentable en términos de latencia, memoria, rendimiento y consumo de energía”. Los autores continúan diciendo que «permite un nuevo paradigma de computación y abre la puerta al diseño de hardware específico optimizado para LLM de 1 bit».
La arquitectura de BitNet b1.58 comienza con BitNet, pero usa una función de cuantificación diferente para llegar a la representación de peso ternario y usa escala de activación al rango. [−Qb,Qb] por token en lugar del rango [0,Qb]. Para ser más compatible con modelos tipo LLaMA, BitNet b1.58 agrega RMSNorm, SwiGLU e incrustación rotativa.
Los autores compararon BitNet b1.58 con un LLaMA LLM FP16 reproducido en varios tamaños, entrenado desde cero en el Conjunto de datos de RedPajama por 100 mil millones de tokens. Su conclusión fue que “BitNet b1.58 comienza a igualar la precisión total de LLaMA LLM en un tamaño de modelo 3B en términos de perplejidad, al mismo tiempo que es 2,71 veces más rápido y utiliza 3,55 veces menos memoria de GPU. En particular, BitNet b1.58 con un tamaño de modelo de 3.9B es 2,4 veces más rápido, consume 3,32 veces menos memoria, pero tiene un rendimiento significativamente mejor que LLaMA LLM 3B”.
LLM más pequeños y más rápidos
Como hemos visto, la cuantificación puede ayudar a resolver algunos de los mayores problemas con los modelos de lenguaje grandes: los LLM son demasiado grandes y lentos para ejecutarse en hardware normal, por lo que requieren grupos de GPU en la nube. Varias técnicas de cuantificación ayudan en diferentes grados, pero los interesantes e inesperados modelos de “un bit” (es decir, cuantificaciones binarias de 1 bit y ternarias de 1,58 bits) están comenzando a romper el estancamiento de los tamaños de modelos en aumento.
Copyright © 2024 IDG Communications, Inc.