local-benchmarks
Local Model Benchmarks
Workflow para descubrir modelos locales, compararlos con benchmarks ya corridos, ejecutar nuevos benchmarks con whatcanirun, y opcionalmente submitear resultados.
Regla principal: NO descargar modelos. Solo trabajar con lo que ya está descargado localmente.
Fase 1 — Discovery de modelos locales
Escanear las dos ubicaciones de modelos locales y presentar una tabla consolidada.
Modelos MLX (HuggingFace cache)
ls -d ~/.cache/huggingface/hub/models--* 2>/dev/null | while read dir; do
basename "$dir" | sed 's/^models--//' | tr '--' '/'
done
El nombre de carpeta sigue el patrón models--{org}--{model}. Extraer org, modelo, y quantización del nombre.
Modelos GGUF (LM Studio)
find ~/.lmstudio/models -name "*.gguf" -not -name "mmproj-*" 2>/dev/null
Importante: Filtrar archivos mmproj-*.gguf — son proyectores multimodales, no modelos benchmarkeables.
Verificar metadata de un modelo
npx whatcanirun show model <path-o-hf-repo>
Retorna: display_name, format, quant, architecture, parameters, file_size_bytes, artifact_sha256.
Tabla de resultados
Presentar los modelos encontrados en formato:
| # | Modelo | Formato | Quant | Tamaño | Runtime |
|---|---|---|---|---|---|
| 1 | Qwen3.5-27B | MLX | 4bit | ~15 GB | mlx_lm |
| 2 | Qwen3.5-27B | GGUF | q6_k | ~22 GB | llama.cpp |
La asignación de runtime es automática: MLX → mlx_lm, GGUF → llama.cpp.
Fase 2 — Comparar con benchmarks existentes
Leer los bundles existentes y cruzar con los modelos descubiertos.
Listar benchmarks corridos
for zip in ~/.whatcanirun/bundles/*.zip; do
unzip -p "$zip" manifest.json 2>/dev/null | python3 -c "
import sys, json
m = json.load(sys.stdin)
model = m['model']
rt = m['runtime']
print(f\"{model['display_name']} | {model['format']} | {model['quant']} | {rt['name']} | {model.get('artifact_sha256','')[:12]}\")" 2>/dev/null
done
Cruzar modelos vs benchmarks
Comparar por SHA256 del artifact (más confiable) o por nombre + quant si no hay SHA disponible. Marcar cada modelo local con su estado:
| # | Modelo | Quant | Estado |
|---|---|---|---|
| 1 | Qwen3.5-27B-4bit | 4bit | ✗ nuevo |
| 2 | Qwen3.5-27B-Q6_K | q6_k | ✓ corrido (9.2 tok/s decode) |
Ver resultados de un benchmark existente
unzip -p ~/.whatcanirun/bundles/<bundle>.zip results.json | python3 -c "
import sys, json
r = json.load(sys.stdin)['aggregate']
print(f\"Decode: {r['decode_tps_mean']} tok/s | Prefill: {r['prefill_tps_mean']} tok/s | TTFT p50: {r['ttft_p50_ms']:.0f}ms | Mem: {r['peak_rss_mb']:.0f} MB\")"
Fase 3 — Selección y ejecución
Preguntar al usuario cuáles modelos correr. Ofrecer correr todos los nuevos (estado ✗) como opción por defecto.
Configuración
Preguntar si usar defaults o customizar:
| Parámetro | Default | Descripción |
|---|---|---|
--trials |
10 | Cantidad de repeticiones |
--prompt-tokens |
4096 | Tokens de prompt |
--gen-tokens |
1024 | Tokens a generar |
Ejecutar benchmark
npx whatcanirun run \
--model <hf-repo-id-o-path-local> \
--runtime <mlx_lm|llama.cpp> \
--trials 10
Para modelos MLX, usar el HuggingFace repo ID (e.g., mlx-community/Qwen3.5-27B-Claude-4.6-Opus-Distilled-MLX-4bit).
Para modelos GGUF, usar el path absoluto al archivo .gguf.
Interpretar resultados
Métricas clave del benchmark:
- decode_tps: Tokens/segundo de generación — velocidad percibida por el usuario
- prefill_tps: Tokens/segundo de procesamiento del prompt — afecta TTFT
- ttft_p50_ms: Time To First Token mediana — latencia inicial
- peak_rss_mb: Memoria pico — verificar que no se acerque a 64 GB (riesgo OOM)
Si peak_rss_mb supera 55,000 MB, advertir riesgo de OOM para otros usos simultáneos.
Fase 4 — Submit (opcional)
Preguntar al usuario si quiere subir los resultados a whatcani.run.
Verificar autenticación
npx whatcanirun auth status
Si no está logueado, ejecutar npx whatcanirun auth login primero.
Submitear resultados
Opción A — submit automático al correr:
npx whatcanirun run --model <model> --runtime <runtime> --submit
Opción B — submit de bundle existente:
npx whatcanirun submit <bundle-id-o-path>
Validar bundle antes de submit
npx whatcanirun validate <bundle-id-o-path>
Gotchas
- No descargar modelos — este skill solo trabaja con modelos ya presentes localmente
- mmproj-*.gguf son proyectores multimodales de visión, no modelos de texto — siempre filtrarlos
- Benchmarks largos: con 10 trials y 4096+1024 tokens, cada benchmark toma varios minutos. Reducir trials a 3 para pruebas rápidas
- Un modelo a la vez: no correr benchmarks en paralelo — compiten por memoria y GPU, invalida resultados
- Memoria: M4 Max tiene 64 GB compartidos CPU/GPU. Modelos >50 GB van a tener degradación por swap
- whatcanirun show model puede fallar con paths de LM Studio que tienen espacios — usar comillas
Additional Resources
Reference Files
Para detalle completo del CLI, estructura de bundles y schemas:
references/whatcanirun-cli.md— Referencia completa de whatcanirun: comandos, flags, formato de bundles, schema de resultados
More from testacode/llm-toolkit
claude-md-writer
Escribe y mejora archivos CLAUDE.md siguiendo best practices de Anthropic. Este skill se activa cuando el usuario dice "crear CLAUDE.md", "mejorar CLAUDE.md", "actualizar CLAUDE.md", "revisar CLAUDE.md", "escribir instrucciones del proyecto", "create CLAUDE.md", "improve CLAUDE.md", "review CLAUDE.md", "write project instructions", "optimize docs for Claude", "auditar CLAUDE.md", "audit CLAUDE.md", "limpiar CLAUDE.md", "dead weight", o configura un nuevo repositorio.
53doc-writer
Este skill se usa para crear documentos tecnicos organizados en /docs (specs, planes de implementacion, ADRs, documentacion de referencia). Se activa cuando el usuario dice "crear documento", "escribir spec", "documentar esto", "creame una spec", "escribime documentacion", "hacer documentacion", "write a spec", "create documentation", "write an ADR", o quiere agregar documentacion tecnica al proyecto.
44llms-txt-generator
This skill generates llms.txt documentation optimized for AI/LLM consumption. It should be used when the user says "crear llms.txt", "generate llms.txt", "documentar para AI", "document for AI", "crear documentacion para LLMs", "generate docs for LLMs", "make repo readable for Claude", or wants to create structured machine-readable documentation following the llms.txt standard.
40doc-organizer
Este skill se usa cuando el usuario pide "organizar docs", "ordenar documentacion", "mover documentos a carpetas", "categorizar archivos md", "reorganizar documentacion", o cuando hay archivos .md sueltos en docs/ que necesitan ser movidos a subcarpetas tematicas. Organiza y categoriza documentos tecnicos en la estructura correcta del proyecto.
28feature-planner
Planifica features con entrevista estructurada y crea tareas. Este skill se activa cuando el usuario dice "quiero agregar", "planificar feature", "nueva funcionalidad", "implementar esto", "crear plan", "planificar antes de codear", "disenar feature", "como deberia implementar esto", "pensar la arquitectura", o quiere alinear antes de escribir codigo.
27nextjs-project-starter
Creates Next.js projects with a configurable stack (Mantine, Supabase, Zustand, Zod). This skill should be used when the user says "create a Next.js project", "new web project", "bootstrap fullstack app", "start new app", "crear proyecto Next.js", "nuevo proyecto web", "empezar app fullstack", or wants to scaffold a new personal project from scratch.
25