MiniMax M3 sin sparse attention: más coherencia y velocidad

En pocas palabras: Sí, vale la pena. Desactivar la atención dispersa (MSA) en MiniMax M3 con llama.cpp mejora la coherencia en detalles finos y la velocidad de inferencia en contexto largo, respecto a la configuración default. Probado en Q8_0 sobre M3 Ultra, la versión densa reduce confusiones que la dispersa se saltea.

En septiembre de 2026 me agarró la paranoia con MiniMax M3. Lo venía usando como mi modelo principal en el M3 Ultra —corre en Q8_0, es rápido, no escupe un montón de tokens al pedo— pero cada tanto se mandaba una confusión de esas que te hacen ruido. Nada grave, pero sí recurrente. Después de darle vueltas, encontré algo que te puede servir si manejás modelos locales: desactivar la atención dispersa (MSA) en minimax m3 llama.cpp mejora la coherencia en detalles finos y, de paso, le gana en velocidad a la configuración default.

MiniMax M3 es un modelo de lenguaje grande desarrollado por MiniMax, diseñado para correr en hardware local y optimizado con atención dispersa (MSA) para reducir el costo computacional en contextos largos. Viene en versiones cuantizadas; la Q8_0 es la que está usando la comunidad en Macs con buena RAM unificada.

En 30 segundos

  • Desactivar MSA en llama.cpp mejora la coherencia: la atención densa reduce confusiones en detalles menores que la versión dispersa se saltea.
  • Separando MSA de Flash Attention ganás velocidad: con MSA off y FA on, la generación salta de ~7 tps a ~12 tps en 22K de contexto en un M3 Ultra.
  • Bajar la temperatura a 0.8 ayuda mucho: incluso sin tocar el código, reduce alucinaciones comparado con el 1.0 que recomienda MiniMax.

¿Por qué desactivar la atención dispersa (MSA) en MiniMax M3?

Te pongo un escenario concreto. Estás conversando con el modelo sobre un problema de varias partes. Razona bien la pregunta principal, pero después confunde el nombre de una tabla que ya mencionaste, o se olvida de una restricción que pusiste tres mensajes atrás. No es que se vuelva incoherente —para eso está lejos—, pero falla en pormenores que no esperás de un modelo de este tamaño.

Un usuario en Dev.to reportó exactamente esto: el modelo seguía la conversación, procesaba el problema grande, y de vez en cuando se le escapaba un detalle chico. Lo suficientemente seguido como para que valiera la pena investigar. (Spoiler: la hipótesis de que la atención dispersa de MiniMax tenía algo que ver resultó ser cierta).

Diferencia entre Flash Attention OFF y MSA OFF en llama.cpp

Acá viene lo técnico. MiniMax M3 usa MSA (MiniMax Sparse Attention). En la versión b10702 de llama.cpp, MSA depende de que Flash Attention esté activo. Si desactivás FA, MSA se apaga automáticamente y llama.cpp tira del fallback denso que tiene incorporado. El problema es que ese camino es lentísimo. Para más detalles técnicos, mirá configurar Ollama para IA local.

Probé las combinaciones en un M3 Ultra con unos 22K tokens de contexto. Mirá los números:

ConfiguraciónVelocidad de generación (tps)Velocidad de prompt processing
Flash Attention OFF, MSA OFF~7 tpsIgual que GLM 5.2
Flash Attention ON, MSA ON~12 tpsRápido
Flash Attention ON, MSA OFF~12+ tpsUn poco más lento que con MSA, pero la generación compensa
minimax m3 llama.cpp diagrama explicativo

¿Qué pasó cuando desactivé MSA pero dejé FA prendido? La velocidad de generación se mantuvo igual o mejor que con ambas habilitadas. Fue una sorpresa, posta. El prompt processing se ralentiza un pelo, pero la ventaja en generación lo compensa con creces.

Cómo forzar atención densa modificando el código de llama.cpp

Si querés lograrlo sin recompilar el mundo, la comunidad encontró dos caminos. Pero ojo, en Mac uno no conviene.

Opción 1 (no recomendada en Mac): Activar la KV cache unificada y subir el paralelismo a más de 1. En la línea de comandos pondrías algo como --parallel 2 --no-kv-offload. El problema es que el MSA depende del layout de los slots de la KV cache, y con múltiples secuencias en una caché unificada no es compatible. Además, en Mac el paralelismo no funciona bien con modelos grandes; te puede embarrar el servidor entero.

Opción 2 (la que funciona): Meté mano en el código. Buscá el archivo src/models/minimax-m3.cpp en tu build de llama.cpp. Hay una línea que chequea si la capa actual debe usar MSA o caer al path denso. Lo que hizo este usuario fue forzar que siempre tome el denso cambiando una condición. Algo así: Sobre eso hablamos en instalar Hermes Desktop gratis.

Original (más o menos): if (use_msa) { // sparse } else { // dense } → Lo modificó a use_msa = false; directo. Recompilá, y listo. No necesitás tocar nada más.

Cuando recompilás y corrés con --flash-attn, el modelo queda con atención densa y Flash Attention activo. Según la prueba, la velocidad de generación se mantuvo en el mismo rango que con MSA prendido (~12 tps en 22K de contexto).

Optimización de temperatura para reducir alucinaciones

Antes incluso de meter mano en la atención, un cambio mucho más simple ya estaba dando resultados. MiniMax recomienda una temperatura de 1.0. El usuario que documentó todo esto probó bajarla a 0.8 y notó una mejora grande en la solidez de las respuestas.

Con 0.8, las alucinaciones y rarezas se redujeron bastante, incluso sin tocar MSA. No es magia —la temperatura controla la aleatoriedad en el muestreo de tokens—, pero es un truco que podés aplicar ya, sin recompilar nada. Si todavía no probaste esto con tu MiniMax M3, hacelo antes de meterte a editar código. Capaz te alcanza.

Comparativa de rendimiento: Q8_0 vs cuantizaciones mayores

El post original menciona un detalle clave: cuando probaron el modelo crudo en MXFP8 a través de oMLX, veían errores ortográficos básicos —como escribir “birtday” en vez de “birthday”—. Al pasarse a la cuantización Q8_0 de Bartowski en llama.cpp, esos errores desaparecieron. No es solo un tema de precisión numérica: la implementación de llama.cpp en Q8_0 parece manejar mejor el modelo que la versión sin cuantizar en otro framework. Te puede servir nuestra cobertura de reducir costos de API Llama.

En un M3 Ultra, la Q8_0 corre bien y, sumándole la atención densa y la temperatura baja, el modelo se vuelve mucho más predecible para uso diario. Si tenés 64 GB o más de RAM unificada, es una combinación que vale la pena.

Qué está confirmado / qué no sobre esta configuración

  • Confirmado: desactivar MSA mejoró la consistencia en el caso documentado. Las confusiones en detalles menores dejaron de aparecer durante varios días de prueba.
  • Pendiente: el usuario admite que las fallas eran esporádicas, así que no puede asegurar que la mejora no sea producto de la suerte. Hace falta más testing longitudinal.
  • Confirmado: la velocidad con MSA off + FA on es igual o mayor que con ambos activos en 22K de contexto en M3 Ultra.
  • Pendiente: no hay benchmarks independientes de la comunidad sobre este cambio en otros hardware (PC con NVIDIA, AMD, etc.).

Errores comunes al configurar MiniMax M3 en llama.cpp

Pensar que desactivar Flash Attention es lo mismo que desactivar MSA

No es lo mismo. Si apagás FA, MSA se desactiva por dependencia, pero te quedás con atención densa sin aceleración de Flash. El resultado es lentísimo (~7 tps). La solución es separarlos.

Usar paralelismo para forzar atención densa en Mac

Técnicamente funciona con --parallel 2, pero en Mac los modelos grandes no manejan bien la inferencia paralela. Podés terminar con el servidor colgado o respuestas erráticas. Mejor modificar el código directamente.

No recompilar llama.cpp después del cambio

Si editás el archivo .cpp pero corrés el binario viejo, el cambio no se aplica. Recompilá siempre y verificá que el flag use_msa esté en false en la salida de debug si la hay.

Preguntas Frecuentes

¿Qué es MiniMax M3?

MiniMax M3 es un modelo de lenguaje grande desarrollado por MiniMax. Está optimizado para correr en hardware local con soporte para contextos largos mediante atención dispersa (MSA). Tema relacionado: asegurar dispositivos con Intune.

¿Qué pasa si desactivo Flash Attention en MiniMax M3 en llama.cpp?

Si desactivás Flash Attention, MSA también se apaga, y llama.cpp usa su fallback denso sin aceleración. La velocidad de generación cae a alrededor de 7 tokens por segundo en un M3 Ultra con 22K de contexto, comparado con los ~12 tps con Flash Attention activo.

¿Cómo desactivar MSA sin perder velocidad en llama.cpp?

Modificando el archivo src/models/minimax-m3.cpp para forzar use_msa = false mientras mantenés Flash Attention encendido. Recompilás llama.cpp y ejecutás con --flash-attn. La velocidad se mantiene en ~12 tps en 22K de contexto.

¿Por qué MiniMax M3 tiene alucinaciones con atención dispersa?

La atención dispersa (MSA) reduce el costo computacional procesando solo bloques seleccionados del contexto. En algunos casos, esa selección omite detalles relevantes, lo que lleva a confusiones menores. La atención densa, al considerar todo el contexto, evita esas lagunas.

¿Es mejor usar atención densa o dispersa en LLM locales?

Depende del caso. La atención densa da mejor coherencia en detalles, pero consume más recursos. En hardware con suficiente RAM unificada (como M3 Ultra), la velocidad con densa es igual o mejor que con dispersa. En hardware más limitado, la dispersa puede ser necesaria para mantener velocidad.

Conclusión

Si usás MiniMax M3 en llama.cpp y notás esas confusiones raras en detalles que no deberían pasar, desactivar la atención dispersa es un camino viable. No solo mejora la consistencia, sino que, si lo hacés bien —separando MSA de Flash Attention—, la velocidad no se resiente. Bajá la temperatura a 0.8 de paso. Son dos cambios simples que, combinados, transforman un modelo que zafa en uno sólido para uso diario.

La contracara es que requiere recompilar llama.cpp y no hay garantía 100% de que elimine todas las alucinaciones. Pero si laburás con prompts largos o conversaciones complejas, vale la pena. Y si te da paja compilar, probá primero la temperatura. Capaz con eso safás.

Fuentes

Desplazarse hacia arriba