Ejecutar Gemma 4 12B con 8GB de VRAM no es principalmente un problema de espacio en disco. La presión real está en la VRAM durante la ejecución.
Con una versión GGUF cuantizada como Q4_K_M, el archivo del modelo puede acercarse ya a los 8GB. Al ejecutarlo también hacen falta KV cache, buffers temporales de cálculo, uso del escritorio y sobrecarga del driver. El resultado es conocido: parece que el modelo “casi cabe”, pero al abrir contexto largo aparece OOM.
Si la máquina solo tiene 8GB de VRAM, la estrategia razonable no es forzar todo a la GPU, sino usar descarga híbrida entre VRAM y memoria del sistema: poner tantas capas como sea posible en la GPU y dejar el resto en RAM con participación de la CPU.
Script recomendado
Supongamos que la ruta del modelo es:
|
|
En Linux / macOS puedes crear run_gemma4.sh:
|
|
Dale permisos:
|
|
Ejecuta:
|
|
En Windows puedes crear run_gemma4.bat:
|
|
En Windows normalmente no conviene poner --mlock por defecto. Su comportamiento depende de versión, permisos y configuración del sistema. Primero importa que el modelo arranque. En Linux, si hay suficiente memoria del sistema, --mlock sí merece la pena probarse.
Por qué usar descarga híbrida
-ngl es el parámetro más importante de esta configuración. Controla cuántas capas se descargan a la GPU.
|
|
Con 8GB de VRAM, el objetivo no es meter todo el modelo en la GPU, sino dejar margen para KV cache y buffers de ejecución. -ngl 26 puede usarse como valor inicial: algunas capas van a VRAM y la memoria del sistema recibe el resto.
La forma de ajustar es simple:
| Síntoma | Ajuste |
|---|---|
| OOM al arrancar o crasheo durante generación | Baja -ngl 26 a 22 o 20 |
| Uso de VRAM solo alrededor de 6GB | Sube -ngl 26 a 28 o 30 |
| Estable pero lento | Cambia a una cuantización de menos bits o sube -ngl |
| OOM con contexto largo | Baja primero -c, luego baja -ngl |
En una máquina con 8GB de VRAM no mires solo el tamaño del modelo. Lo importante es si capas del modelo, KV cache, fragmentación de VRAM y escritorio caben con margen.
--flash-attn: recomendable con 8GB de VRAM
|
|
Este parámetro ayuda mucho con poca VRAM. Reduce la presión de memoria en attention y mejora la eficiencia de inferencia con contexto largo.
Si tu build de llama.cpp, backend GPU o arquitectura de tarjeta no soporta Flash Attention, puede fallar al arrancar. En ese caso, quita primero --flash-attn para confirmar que el modelo funciona, luego actualiza llama.cpp o revisa soporte de CUDA / Metal / Vulkan.
Con 8GB de VRAM, actívalo si puedes. Si no, baja primero el contexto.
-c 8192: empezar con contexto 8K
|
|
Cuanto más largo sea el contexto, mayor será la KV cache. Muchos modelos anuncian contexto muy largo, pero una máquina con poca VRAM no debería abrir el máximo de entrada.
Con 8GB de VRAM, 8192 es un punto de partida equilibrado. Sirve para chat diario, análisis de fragmentos de código y textos medianos, sin comerse la VRAM tan rápido como 32K o 64K.
Si sigue habiendo OOM, baja:
|
|
Si cambias a una cuantización más pequeña y hay margen claro de VRAM, prueba:
|
|
No persigas el contexto máximo al principio. Primero estabilidad, luego expansión.
--mlock: reducir intercambio de memoria
|
|
Si la memoria del sistema es relativamente amplia, este parámetro intenta mantener el modelo residente en memoria física y evitar que el sistema lo mande a swap o pagefile lento.
En modo de descarga híbrida, algunas capas quedan en RAM. Si esas páginas se intercambian fuera, la respuesta puede volverse muy lenta o entrecortada. --mlock reduce ese riesgo.
Dos advertencias:
- En Linux puede requerir ajustar
ulimit -lo permisos. - En Windows no siempre hace falta activarlo por defecto. Primero arranca el modelo.
Si --mlock impide el arranque, elimínalo. Es una optimización de estabilidad y velocidad, no un requisito.
-t 8: no subir hilos CPU a ciegas
|
|
-t controla el número de hilos CPU. En descarga híbrida, las capas que no entran en VRAM necesitan participación de CPU, así que los hilos afectan la velocidad.
Usa el número de núcleos físicos, no de hilos lógicos:
| CPU | Recomendación |
|---|---|
| 6 núcleos / 12 hilos | -t 6 |
| 8 núcleos / 16 hilos | -t 8 |
| 12 núcleos / 24 hilos | -t 10 o -t 12 |
Más hilos no siempre es mejor. Demasiados pueden empeorar planificación, ancho de banda de memoria y respuesta del escritorio. Empieza con núcleos físicos y ajusta con tokens/s reales.
Sobre -p "<|think|>\n"
El script original incluía:
|
|
Conviene usarlo con cuidado. Distintos modelos, conversiones GGUF y plantillas tratan los thinking markers de forma distinta. Forzar <|think|> en el prompt no activa de forma fiable “pensamiento profundo” y puede contaminar el formato de salida.
Lo más seguro al principio es solo activar modo interactivo:
|
|
Si la model card del GGUF de Gemma 4 indica que hace falta un system prompt o token especial, añádelo según esa documentación. No trates un marcador concreto como interruptor universal.
Primera ejecución conservadora
Si te preocupa la estabilidad con 8GB de VRAM, empieza con un script más conservador:
|
|
Este sacrifica contexto y capas descargadas a GPU, pero es más fácil que arranque. Cuando sea estable, vuelve hacia:
|
|
y:
|
|
Para acelerar, cambia primero la cuantización
Si Q4_K_M solo permite descargar unas veinte capas en 8GB de VRAM, la velocidad estará limitada por CPU y ancho de banda de memoria. La mejora más directa es usar una cuantización más pequeña.
Puedes probar:
| Cuantización | Característica |
|---|---|
Q4_K_M |
Calidad más estable, más presión de VRAM |
Q3_K_L |
Más pequeño, puede permitir descargar más capas |
Q3_K_M |
Ahorra más VRAM, con más caída de calidad |
Con Q3_K_M o Q3_K_L, prueba:
|
|
o incluso:
|
|
Si la mayoría de capas entran en GPU, la velocidad puede mejorar bastante. Pero cuanto más baja la cuantización, más puede caer la calidad. Compara con los mismos prompts, no solo tokens/s.
El ancho de banda de memoria también importa
La descarga híbrida no es gratis. Las capas que no entran en VRAM pasan por CPU y memoria del sistema, por lo que la velocidad depende mucho del ancho de banda de memoria.
Revisa:
- Si la memoria del sistema está en doble canal.
- Si DDR5 tiene XMP / EXPO activado.
- Si hay procesos en segundo plano consumiendo mucho ancho de banda de memoria.
- Si un portátil está en modo de alto rendimiento.
Si la memoria está en canal único, la descarga híbrida será claramente más lenta. En una configuración de 8GB de VRAM, tener suficiente memoria del sistema es solo el primer paso. El ancho de banda también cuenta.
Orden de resolución de problemas
Si aparece OOM, no cambies muchos parámetros a la vez. Sigue este orden:
- Baja contexto:
|
|
- Baja capas descargadas a GPU:
|
|
Si hace falta:
|
|
- Quita
--mlock:
|
|
- Si
--flash-attnda error, quítalo primero para confirmar si es un problema del backend:
|
|
- Cambia a un modelo cuantizado de menos bits.
Cambia un parámetro cada vez y registra tokens/s, uso de VRAM y si hay OOM. Así sabrás dónde está el cuello de botella real.
Tabla de ajuste
| Objetivo | Parámetros |
|---|---|
| Arranque más estable | -ngl 20 -c 4096 -n 512 |
| Equilibrio diario | -ngl 26 -c 8192 -n -1 |
| Más velocidad | Cambia a Q3_K_M y prueba -ngl 34 o más |
| Contexto largo | Mantén --flash-attn y sube desde -c 8192 poco a poco |
| Evitar swap de memoria | Prueba --mlock en Linux |
Lo peor con 8GB de VRAM es intentar maximizar todo de golpe. Empieza conservador y sube -ngl y -c paso a paso.
Resumen
Ejecutar Gemma 4 12B Q4_K_M con 8GB de VRAM depende sobre todo de la descarga híbrida. Empieza con -ngl 26, -c 8192, --flash-attn, --mlock y -t 8. Si hay OOM, baja primero el contexto y luego las capas GPU.
Si buscas velocidad, cambiar a Q3_K_M o Q3_K_L suele ser más efectivo que insistir con Q4_K_M. La memoria del sistema puede absorber parte de la presión de la descarga híbrida, pero la sensación real de velocidad depende de las capas descargadas a GPU, el tamaño de KV cache y el ancho de banda de memoria.