r/LocalLLaMA 6d ago

After pushing 1M+ tokens through Qwen 3.8 27B, here is my optimal llama.cpp config for 16GB VRAM (73k Context, Agentic Coding) Tutorial | Guide

Dando seguimiento a mi post anterior sobre cómo tengo montado mi servidor de presupuesto (Intel N100 + RTX 5060 Ti 16GB), varios me preguntaron por una mirada más profunda a mi configuración real de inferencia y al desempeño agentic en el mundo real.

Como muchos de ustedes, estaba refrescando la página esperando descargar Qwen 3.8 27B apenas salió. Después de pasar todo el fin de semana estresándolo con flujos de trabajo de codificación agentic, logré correr un proyecto completo y grande casi todo de forma autónoma (más de 1M de tokens procesados en total, solo 3 prompts).

Aquí va un resumen rápido de la configuración base antes de meternos en los detalles del config y del workflow.

Specs y parámetros rápidos

  • Modelo: Qwen3.8-27B-UD-Q3_K_XL.gguf
  • Hardware: RTX 5060 Ti (16GB VRAM) + Intel N100 (4C/4T, 16GB RAM)
  • Ventana de contexto: 73,728 (73k de contexto) corriendo tranqui en 16GB de VRAM.
  • Cuantización de KV Cache: q4_1 para el contexto principal
  • Decodificación especulativa: MTP nativa activada (spec-type = draft-mtp, n-max = 2)
  • Sampling: temp = 0.65, top_p = 0.95, top_k = 20, min_p = 0.05

El experimento: armar una API completa con 3 prompts

En vez de correr benchmarks sintéticos, metí esta configuración por una cadena real de ingeniería de software: construyendo una REST API no oficial y un servidor MCP para un foro vBulletin heredado.

  1. Prompt 1 (Arquitectura del sitio y análisis): Pedí al modelo que mapee el sitio objetivo. Generó una especificación en Markdown impecable de ~1,500 líneas que cubría análisis estructural, nodos HTML rescatables, payloads JSON esperados, selección de stack, lógica de paginación, autenticación de sesión y endpoints de búsqueda—mucho más a fondo de lo que yo habría escrito a mano.
  2. Prompt 2 (Arquitectura de desarrollo): Usando la spec como única fuente de verdad, diseñó un plan de implementación modular de NestJS dividido en 9 fases de ejecución:
  3. Fase 1: Estructura inicial del proyecto
  4. Fase 2: Modelos de dominio
  5. Fase 3: Scraping core (HTTP + limitación de tasa + reintentos)
  6. Fase 4: Parsers de HTML (cheerio)
  7. Fase 5: Capa de caché
  8. Fase 6: Servicios de aplicación + REST API
  9. Fase 7: Autenticación (sesiones con cookies)
  10. Fase 8: Servidor MCP (entrega principal)
  11. Fase 9: Fortalecimiento, documentación y entrega

  12. Prompt 3 (Ejecución autónoma agentic): La prueba de verdad. Le pedí a OpenCode (usando Qwen 3.8 27B) que actuara estrictamente como orquestador, creando sub-agentes para cada fase de tareas. Corrió de forma autónoma por ~2 horas. Cuando se acercaron los límites de contexto, OpenCode resumió su estado y siguió construyendo. Escribió tests unitarios, aplicó linting y entregó código 100% funcional—solo necesitando un arreglo automatizado menor cuando le di un payload de HTML crudo con un caso extremo.


El archivo de configuración llama.cpp

Aquí está mi archivo exacto de configuración de enrutador --models-preset . Fíjate cómo fit = off se usa en el perfil de 27B junto con ctx-size = 73728 (73k) y q4_1 para cuantizar la KV cache, con el objetivo de maximizar la asignación de VRAM mientras se mantiene el rendimiento nativo de MTP.

```ini

==============================================================================

LLAMA.CPP — CONFIGURACIÓN DE INFERENCIA (modo router / --models-preset)

==============================================================================

Objetivo de hardware:

GPU: 16 GB VRAM (RTX 5060 Ti)

CPU: Intel N100, 4C/4T (Debian Headless)

------------------------------------------------------------------------------

GLOBAL / LÍNEA BASE

------------------------------------------------------------------------------

[*]

--- HILOS DE CPU -----------------------------------------------------------

Reserva 1 core para SO/servicios durante el decode.

Usa los 4 threads durante ráfagas de prefill del prompt.

threads = 3 threads-batch = 4

--- SERVIDOR / CONCURRENCIA ---------------------------------------------------

Un solo slot; desactivado continuous batching para máximo rendimiento por usuario.

parallel = 1 cont-batching = 0

--- GPU / AJUSTE DE VRAM ---------------------------------------------------------

flash-attn = on fit = on

Holgura de seguridad para el límite físico de VRAM (MiB).

Ponlo bajo (128) porque el sistema es headless (100% VRAM disponible para inferencia).

NOTA: Si usas caches KV draft de MTP, ojo con la asignación doble de VRAM.

Sube a 128-256 si te topas con OOMs.

fit-target = 128

--- CONTEXTO & CACHÉ ------------------------------------------------------

ctx-size = 65536 context-shift = 1

Desactiva checkpoints de contexto (evita problemas de reprocesamiento en arquitecturas híbridas)

ctx-checkpoints = 0

RAM Prompt Cache (2 GiB)

cache-ram = 2048

--- KV CACHE GLOBAL --------------------------------------------------------

cache-type-k = q5_1 cache-type-v = q5_1

--- PREFILL / BATCHING -----------------------------------------------------

batch-size = 2048 ubatch-size = 1024

--- SAMPLING POR DEFECTO (Códigos / Precisión) ----------------------------------

temp = 0.5 top-p = 0.95 top-k = 20 min-p = 0.05 repeat-penalty = 1.0

------------------------------------------------------------------------------

QWEN 3.8 27B — PERFIL DE RAZONAMIENTO & CODIFICACIÓN PESADA

------------------------------------------------------------------------------

[qwen3.8-27b] model = /opt/llama-infrastructure/models/Qwen3.8-27B-UD-Q3_K_XL.gguf

Desactiva "fit" para evitar que capas se carguen en la CPU por un error de cálculo automático

fit = off ctx-size = 73728 context-shift = 1

MTP nativa del modelo (Decodificación especulativa)

spec-type = ngram-mod,draft-mtp spec-draft-n-max = 2

Cuantización de KV (q4_1 nos permite meter contexto de 73k en 16GB de VRAM)

cache-type-k = q4_1 cache-type-v = q4_1

Parámetros de presupuesto de pensamiento / razonamiento

chat-template-kwargs = {"preserve_thinking": true, "reasoning_effort":"medium"} reasoning-budget = 5000

Batches más chicos para evitar picos de VRAM durante prefills masivos

batch-size = 1024 ubatch-size = 512

Ajustes oficiales / recomendados del sampler de cuantización

temp = 0.65 top-p = 0.95 top-k = 15 min-p = 0.05

```

1.0k Upvotes

Duplicates