Contáctenos

PowerInfer: modelo rápido de lenguaje grande que funciona con una GPU de consumo

Inteligencia Artificial

PowerInfer: modelo rápido de lenguaje grande que funciona con una GPU de consumo

mm

Debido a sus excepcionales capacidades de creación de contenido, los modelos generativos de lenguaje grande están ahora a la vanguardia de la revolución de la IA, con esfuerzos continuos para mejorar sus capacidades generativas. Sin embargo, a pesar de los rápidos avances, estos modelos requieren recursos y potencia computacional sustanciales. Esto se debe en gran medida a que constan de cientos de miles de millones de parámetros. Además, para funcionar sin problemas, los modelos de IA generativa dependen de miles de GPU, lo que genera importantes costos operativos. Las altas demandas operativas son una razón clave por la cual los modelos de IA generativa aún no se implementan de manera efectiva en dispositivos de nivel personal.

En este artículo, analizaremos PowerInfer, un motor de inferencia LLM de alta velocidad diseñado para ordenadores estándar con una sola GPU de consumo. El framework PowerInfer busca aprovechar la alta localidad inherente a la inferencia LLM, caracterizada por una distribución de ley de potencia en las activaciones neuronales. Esto significa que, en un momento dado, un pequeño subconjunto de neuronas "calientes" se activa de forma constante ante las entradas, mientras que el resto, denominadas neuronas "frías", se activan en función de entradas o requisitos específicos. Este enfoque permite que el framework PowerInfer reduzca la potencia de cálculo necesaria para que la IA generativa produzca los resultados deseados.

Profundizaremos en el marco PowerInfer, explorando su metodología, su flujo de trabajo y sus resultados prácticos. ¡Comencemos!

PowerInfer: modelo rápido de lenguaje grande con GPU de consumo

Los modelos generativos de lenguaje grande, como ChatGPT y DALL-E, son conocidos por sus sofisticadas tareas de procesamiento del lenguaje natural y generativo. Debido a sus altos requisitos computacionales, estos modelos generalmente se implementan en centros de datos con GPU avanzadas. La necesidad de una potencia computacional tan alta limita su implementación en los centros de datos, lo que destaca la necesidad de implementar grandes modelos de lenguaje en plataformas locales más accesibles, como las computadoras personales.

Aumentar la accesibilidad de modelos de lenguaje grandes podría reducir los costos de inferencia y generación de contenido, mejorar la privacidad de los datos y permitir la personalización del modelo. Además, si bien las implementaciones de centros de datos priorizan el alto rendimiento, local Implementaciones de LLM podría centrarse en una baja latencia debido a tamaños de lote más pequeños.

Sin embargo, implementar estos modelos en dispositivos locales plantea desafíos importantes debido a sus importantes requisitos de memoria. Los grandes modelos de lenguaje, que funcionan como transformadores autorregresivos, generan texto token por token, y cada token requiere acceso al modelo completo, que comprende cientos de miles de millones de parámetros. Esto requiere numerosas GPU de alta gama para generar resultados de baja latencia. Además, las implementaciones locales suelen procesar solicitudes individuales de forma secuencial, lo que limita el potencial de procesamiento paralelo.

Para abordar los complejos requisitos de memoria del marco de IA generativa, las soluciones existentes emplean métodos como la descarga y la compresión de modelos. Técnicas como la destilación, la poda y la cuantificación reducen el tamaño del modelo, pero aún son demasiado grandes para las GPU estándar de los ordenadores personales. La descarga de modelos, que divide el modelo en la capa de transformación entre las CPU y las GPU, permite el procesamiento distribuido de capas entre las memorias de ambas. Sin embargo, este método se ve limitado por la lenta interconexión PCIe y la limitada capacidad computacional de las CPU, lo que genera una alta latencia de inferencia.

El marco PowerInference postula que la falta de coincidencia entre las características de inferencia de LLM y la estructura del hardware es la causa principal de los problemas de memoria en la inferencia de LLM. Idealmente, los datos a los que se accede con frecuencia deberían almacenarse en GPU de gran ancho de banda y capacidad limitada, mientras que los datos a los que se accede con menos frecuencia deberían almacenarse en CPU de bajo ancho de banda y alta capacidad. Sin embargo, el gran volumen de parámetros de cada iteración de inferencia de LLM hace que el conjunto de trabajo sea demasiado grande para una sola GPU, lo que resulta en una explotación ineficiente de la localidad.

El proceso de inferencia en modelos de lenguaje grandes demuestra una alta localidad, y cada iteración activa un número limitado de neuronas. El marco PowerInference tiene como objetivo explotar esta localidad administrando una pequeña cantidad de neuronas calientes con la GPU, mientras que la CPU maneja las neuronas frías. Preselecciona y precarga neuronas activas en la GPU e identifica neuronas activadas durante el tiempo de ejecución. Este enfoque minimiza las costosas transferencias de datos PCIe, lo que permite a las GPU y CPU procesar de forma independiente sus neuronas asignadas.

Sin embargo, la implementación de LLM en dispositivos locales enfrenta obstáculos. Los predictores en línea, cruciales para identificar neuronas activas, consumen una cantidad considerable de memoria de GPU. El marco PowerInfer utiliza un método adaptativo para construir pequeños predictores para capas con mayor asimetría y escasez de activación, manteniendo la precisión y reduciendo el tamaño. Además, Marcos de LLM requieren escasos operadores especializados. El marco PowerInfer emplea operadores dispersos con reconocimiento de neuronas que se comunican directamente con las neuronas, eliminando la necesidad de conversiones de formatos dispersos específicos.

Finalmente, la colocación óptima de neuronas activadas entre la CPU y la GPU es un desafío. El framework PowerInfer utiliza una etapa offline para crear una política de colocación de neuronas, midiendo el impacto de cada neurona en los resultados de la inferencia LLM y planteándolo como un problema lineal entero.

Arquitectura y Metodología

La siguiente figura detalla la arquitectura del marco PowerInfer que consta de componentes en línea y fuera de línea en proceso. 

Gracias a la variación observada en las propiedades de la localidad entre diferentes grandes modelos de lenguaje, el componente fuera de línea perfila la escasez de activación del marco LLM, lo que le permite diferenciar entre neuronas frías y calientes. Por otro lado, en la fase fuera de línea, el motor de inferencia carga dos tipos de neuronas tanto en la CPU como en la GPU, atendiendo así las solicitudes de LLM durante el tiempo de ejecución con baja latencia. 

Fase fuera de línea: Policy Solver y LLM Profiler

En la fase fuera de línea, un componente del generador de perfiles LLM utiliza solicitudes derivadas de un conjunto de datos generales para recopilar datos de activación del proceso de inferencia. En el primer paso, monitorea la activación de las neuronas en todas las capas del marco y procede a utilizar un componente de resolución de políticas para clasificar las neuronas como calientes o frías. El objetivo principal del solucionador de políticas es asignar neuronas activadas con mayor frecuencia a las capas de GPU y asignar el resto a las capas de CPU. En la segunda etapa, el componente de resolución de políticas utiliza métricas de impacto neuronal y especificaciones de hardware para equilibrar la carga de trabajo entre las capas y maximiza la métrica de impacto de la GPU para las neuronas mediante la utilización de programación lineal entera. 

Fase en línea: motor de inferencia Neuron Aware LLM

Una vez que la etapa fuera de línea se ejecuta con éxito, el marco procede a ejecutar la fase en línea. En el tercer paso del proceso, el motor en línea asigna neuronas frías y calientes a sus respectivas unidades de procesamiento antes de procesar las solicitudes de los usuarios, según el resultado del solucionador de políticas fuera de línea. Durante el tiempo de ejecución y en el paso 4, el motor en línea administra los cálculos GPU-CPU mediante la creación de ejecutores de CPU y GPU que son subprocesos que se ejecutan en el lado de la CPU. Luego, el motor predice las neuronas activadas y procede a omitir las neuronas no activadas. Luego, las neuronas activadas se precargan en la GPU para su procesamiento. Mientras tanto, la CPU calcula y transfiere los resultados para que sus neuronas se integren con la GPU. El motor en línea puede centrarse en filas y columnas de neuronas individuales dentro de matrices porque utiliza operadores con reconocimiento de neuronas dispersas en las CPU y en las GPU. 

Predictores de escasez adaptativa

El concepto principal detrás de la reducción de las cargas computacionales mediante el motor de inferencia en línea en el marco PowerInfer es que solo procesa las neuronas que predice que se activarán. Tradicionalmente, dentro de cada capa de Transformer, un marco utiliza dos predictores diferentes para predecir la activación de las neuronas en el MLP y los bloques de autoatención, como resultado de lo cual el cálculo de inferencia se limita a las neuronas que se predice que estarán activas. Sin embargo, es difícil diseñar predictores eficaces para la implementación local porque la cantidad limitada de recursos dificulta equilibrar el tamaño del modelo y la precisión de la predicción. Dado que el marco implementa estos predictores con frecuencia para predecir neuronas activas, deben almacenarse en la GPU para permitir un acceso más rápido. Sin embargo, los marcos generalmente implementan una gran cantidad de predictores que ocupan una memoria considerable, incluso la necesaria para almacenar los parámetros LLM. 

Además, el tamaño de los predictores generalmente está determinado por dos factores: asimetría interna y dispersión de las capas LLM. 

Para optimizar estos factores, el marco PowerInfer utiliza un método de entrenamiento iterativo para cada predictor en la capa Transformer sin un tamaño fijo. En el primer paso de este método de entrenamiento, el tamaño del modelo de referencia se establece en función del perfil de escasez del modelo, y el tamaño del modelo se ajusta iterativamente teniendo en cuenta la asimetría de activación interna para mantener la precisión. 

Colocación y gestión de neuronas

Como se mencionó anteriormente, mientras el componente de resolución de políticas fuera de línea determina la política de ubicación de neuronas, el componente del motor de inferencia en línea carga el modelo en la memoria de la GPU y la CPU según la política generada. Para cada capa que puede tener o no múltiples matrices de peso, el marco PowerInfer asigna cada neurona a la CPU o a la GPU en función de si la neurona está activada en caliente. Garantizar un cálculo preciso de las neuronas segmentadas en la secuencia determinada es esencial para obtener resultados precisos. Para abordar esto, el marco PowerInfer genera dos tablas de neuronas: una ubicada en la GPU y otra ubicada en la memoria de la CPU, y cada tabla correlaciona neuronas individuales con su posición original en la matriz. 

Operador consciente de las neuronas

Dada la escasez de activación observada en modelos de lenguaje grandes, las neuronas inactivas y sus pesos pueden evitarse mediante operaciones de multiplicación de matrices, creando así la necesidad del uso de operadores dispersos. En lugar de emplear operadores dispersos que tienen varias limitaciones, el marco PowerInfer emplea operadores con reconocimiento de neuronas que calculan las neuronas activadas y sus pesos directamente en la GPU y la CPU sin requerir conversión a formato denso durante el tiempo de ejecución. Los operadores con reconocimiento de neuronas se diferencian de los operadores dispersos tradicionales en que se centran en vectores de filas y columnas individuales dentro de una única matriz en lugar de centrarse en toda la matriz. 

Política de colocación de neuronas

Para explotar las capacidades computacionales de las CPU y GPU, el componente fuera de línea en el marco PowerInfer genera una política de ubicación que guía el marco al asignar neuronas a las capas de CPU o GPU. El solucionador de políticas genera esta política y controla la ubicación de las neuronas dentro de cada capa, lo que ayuda a determinar la carga de trabajo computacional para las unidades de procesamiento individuales. Al generar la política de ubicación, el componente de resolución de políticas considera diferentes factores, incluida la frecuencia de activación de cada neurona, la sobrecarga de comunicación y las capacidades computacionales como anchos de banda y tamaño de memoria de cada unidad de procesamiento. 

Resultados e implementación

Para demostrar las capacidades de generalización del marco PowerInfer en dispositivos con diferentes configuraciones de hardware, los experimentos se llevan a cabo en dos computadoras personales distintas: una equipada con un procesador Intel i9-13900K, GPU NVIDIA RTX 4090 y 192 GB de memoria de host, mientras que la otra opera con Intel. Procesador i7-12700K, GPU NVIDIA RTX 2080Ti y 64 GB de memoria host. 

El rendimiento de extremo a extremo del marco PowerInfer se compara con llama.cpp con un tamaño de lote de 1 y una configuración de implementación predeterminada. Luego, el marco toma muestras de mensajes de los conjuntos de datos ChatGPT y Alpaca dada la variabilidad de longitud observada en la entrada y salida de diálogos del mundo real. La siguiente figura demuestra las velocidades de generación para diferentes modelos. 

Como se puede observar, el framework PowerInfer genera 8.32 tokens por segundo, y llega a generar hasta 16 tokens por segundo, superando así por un margen significativo al framework llama.cpp. Además, a medida que aumenta la cantidad de tokens de salida, el rendimiento del marco PowerInfer también mejora, ya que la fase de generación afecta significativamente el tiempo de inferencia general. 

Además, como se puede observar en la imagen de arriba, el marco PowerInfer supera al marco llama.cpp en PC de gama baja con una tasa de generación máxima de 7 tokens por segundo y una velocidad promedio de generación de tokens de 5 tokens por segundo. 

La imagen de arriba demuestra la distribución de cargas neuronales entre la GPU y la CPU para los dos marcos. Como puede verse, el marco PowerInfer aumenta significativamente la proporción de carga neuronal de la GPU, del 20 al 70 %. 

La imagen de arriba compara el rendimiento de los dos marcos en dos PC con especificaciones diferentes. Como puede verse, el marco PowerInfer ofrece constantemente una alta velocidad de generación de tokens de salida en comparación con el marco llama.cpp. 

Conclusión

En este artículo, hemos hablado de PowerInfer, un motor de inferencia LLM de alta velocidad para una computadora estándar impulsada por un único GP de consumo. En esencia, el marco PowerInfer intenta explotar la inferencia inherente de alta localidad en los LLM, un método caracterizado por la distribución de la ley de potencia de la activación neuronal. El marco PowerInfer es un sistema de interferencia rápida diseñado para modelos de lenguaje grandes que utiliza predictores adaptativos y operadores conscientes de las neuronas para activar las neuronas y la escasez computacional. 

"Ingeniero de profesión, escritor de corazón". Kunal es un escritor técnico con un profundo amor y comprensión de AI y ML, dedicado a simplificar conceptos complejos en estos campos a través de su atractiva e informativa documentación.