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:
| Formato | Tamaño de un modelo de 560 millones de parámetros | Velocidad típica en CPU |
|---|---|---|
| float32 | unos 2,2 GB | referencia |
| int8 | unos 0,6 GB | a 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ón | Tiempo por par mensaje–categoría |
|---|---|
| Precisión completa | unos 113 ms |
| ONNX int8 | unos 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.
Sigue aprendiendo
Míralo con mensajes reales
Prueba la demo en vivo o lee cómo funciona la API.