Avanzado7 min de lecturaActualizado

Ejecutar IA en una CPU: cuantización, ONNX y por qué ganan los modelos pequeños

No siempre hace falta una GPU. Cómo la cuantización int8, ONNX Runtime y el tamaño adecuado hacen que un modelo responda en milisegundos en CPU.

Por qué importa la velocidad

Una API de moderación de chats tiene que responder mientras el usuario todavía mira la pantalla: unos cientos de milisegundos como mucho. Las GPU son rápidas pero caras; los servidores normales tienen CPU. Conseguir que un modelo sea rápido en una CPU es lo que hace asequible un servicio de moderación.

Qué calcula un modelo

Una red neuronal es sobre todo multiplicación de matrices: los números que representan el texto se multiplican por los pesos del modelo, capa tras capa. La velocidad depende de cuántas multiplicaciones hay (el tamaño del modelo y la longitud del texto) y de lo rápida que es cada una.

La cuantización

Los pesos se guardan normalmente como números decimales de 32 bits. La cuantización los guarda como enteros de 8 bits (int8), con un factor de escala por fila o canal:

FormatoTamaño de un modelo de 560 millones de parámetrosVelocidad típica en CPU
float32unos 2,2 GBreferencia
int8unos 0,6 GBa menudo de 2 a 4 veces más rápido

Las CPU modernas tienen instrucciones que multiplican muchos números de 8 bits a la vez (VNNI, AVX-512, Intel AMX), y de ahí viene la velocidad.

El precio es una pérdida mínima de precisión. Con la cuantización dinámica por canal, un buen clasificador no suele perder casi nada medible, pero las puntuaciones se desplazan un poco. Por eso hay que volver a ajustar los umbrales después de cuantizar: cada umbral se mueve para que el modelo cuantizado marque la misma proporción de mensajes que el original en un conjunto de calibración.

ONNX y ONNX Runtime

ONNX es un formato abierto para guardar un modelo como un grafo de operaciones, independiente del framework con el que se entrenó. ONNX Runtime ejecuta ese grafo y está optimizado para CPU: fusiona operaciones, usa todos los núcleos y elige las instrucciones más rápidas disponibles.

Un ejemplo real

VigiMod 1.2.1 tiene unos 560 millones de parámetros. Con 4 núcleos de CPU:

VersiónTiempo por par mensaje–categoría
Precisión completaunos 113 ms
ONNX int8unos 32 ms (3,5 veces más rápido)

Tras ajustar los umbrales, la pérdida de calidad medida en datos de validación fue inferior a 0,005 de F1, dentro del ruido.

Otros trucos

  • Entradas más cortas: limita el contexto a los últimos mensajes que importan.
  • Lotes: puntúa varios mensajes a la vez cuando llegan juntos.
  • Guardar en caché la parte fija de la entrada (por ejemplo una política larga) en los modelos que lo permiten.
  • Modelo más pequeño, mejores datos: un modelo pequeño entrenado con los ejemplos adecuados suele superar a uno grande y genérico, a una fracción del coste.

Cuándo sí hace falta una GPU

Para entrenar y para ejecutar modelos muy grandes que generan respuestas largas. Un diseño habitual es una cascada: un modelo pequeño y rápido para cada mensaje y uno más grande solo para los pocos casos dudosos.

Ponte a prueba

Responde a las preguntas y comprueba tus respuestas.

  1. 1. ¿Qué cambia la cuantización a int8?
  2. 2. ¿Por qué hay que revisar los umbrales después de cuantizar?
  3. 3. ¿Qué es ONNX Runtime?
  4. 4. ¿Qué es una cascada?

Todas las guías →

Míralo con mensajes reales

Prueba la demo en vivo o lee cómo funciona la API.