ds4, el repo que ahora se presenta como DwarfStar, es un motor de inferencia en C de Salvatore Sanfilippo (antirez, el creador de Redis). Corre DeepSeek V4 Flash y una lista corta de otros modelos de pesos abiertos de forma nativa en Metal, CUDA y ROCm. No es un runner de GGUF genérico: solo carga los archivos GGUF que produce el propio proyecto.
Leí el README y la carpeta docs/ el 2026-10-14 y no ejecuté nada de eso. Cada velocidad de este post la reporta el autor y está atribuida a la página de donde sale.
1. Qué Es ds4 y Qué Modelo Corre Realmente
github.com/antirez/ds4 tiene licencia MIT y está escrito en C. El README abre con el nombre DwarfStar, mientras que ds4 es el nombre del repo y el prefijo de los binarios (./ds4, ./ds4-agent, ./ds4-server).
Foto del repo (API de GitHub, 2026-10-14)
- • Stars y forks: 23.853 y 2.303
- • Licencia: MIT; el archivo LICENSE también conserva los copyright de los autores de ggml y de DeepSeek
- • Lenguaje y edad: C, creado el 2026-05-06, último push el 2026-10-08
- • Releases: GitHub no muestra ninguno (los endpoints de releases y tags devolvieron listas vacías), así que compilás desde main
- • Estado, en palabras del README: “very fast changing. Consider it beta quality.” (cambia muy rápido, consideralo calidad beta)
¿Qué modelo, exactamente?
Las notas más viejas que dicen “solo DeepSeek V4 Flash” están desactualizadas. El encabezado del README ahora lista una familia: primero DeepSeek V4 Flash (incluido un modelo de visión experimental), después DeepSeek V4.1 Flash en Metal con inferencia de texto en CUDA, GLM 5.2, 5.3 y 5.3 Flash, DeepSeek V4 PRO y Qwen3.8 Flash Next en Metal y CUDA. La descripción de GitHub todavía dice “DeepSeek 4 Flash and PRO”.
La descarga por defecto para la primera corrida, ds4f-q2, es DeepSeek V4 Flash (el checkpoint que los docs llaman “Flash 0731”), no V4.1. V4.1 Flash necesita su propio GGUF, tokenizer y grafo de inferencia (ds41f-q2), y los pesos de V4 Flash no son intercambiables con él. Para el modelo en sí, mirá mi guía de migración de V4.1 Flash.
2. Por Qué lo Construyó antirez, en Sus Palabras
Dos fuentes primarias: el README y su post “A few words on DS4” (mayo de 2026; la página solo muestra una antigüedad relativa, así que no puedo darte el día exacto). Las citas de abajo son textuales y cortas.
“…aims to be the best way to run a few excellent large language models on consumer hardware (that is, hardware that people can actually own).”
README, párrafo de apertura
“…there was a need for single-model integration focused local AI experience…”
antirez, A few words on DS4
“…an extremely asymmetric quants recipe of 2/8 bit, so that 96 or 128GB of RAM are enough to run it.”
antirez, A few words on DS4
“…using a local model for serious stuff that I would normally ask to Claude / GPT.”
antirez, A few words on DS4
Dicho sin vueltas, es una apuesta: un modelo abierto fuerte, una receta que lo aprieta hasta un presupuesto de memoria de notebook y un motor afinado a ese único modelo le ganan a un runner genérico en ese trabajo puntual. Él mismo dice que el lugar no es permanente (“the model can change over time”) y el README coincide: “A model may be removed when a better replacement arrives.”
Divulgación: código asistido por IA y una deuda con llama.cpp
El README dice que el software se desarrolla con “strong assistance from AI coding agents”, con humanos liderando las ideas, las pruebas y el debugging, y agrega que si no te gusta el código desarrollado con IA, “this software is not for you”. El post de antirez menciona a GPT 5.5. El README es igual de explícito en que ds4.c no enlaza contra GGML pero “exists thanks to the path opened by the llama.cpp project”, y conserva algunas piezas con licencia MIT adaptadas de ahí: layouts de cuantización GGUF, lógica de cuantización en CPU y ciertos kernels. También les pide a los lectores que tengan agentes de código que los usen para adaptar el código a su hardware. Es el flujo de trabajo del autor, no un requisito; si lo hacés, yo revisaría cualquier cambio hecho por un agente contra sus chequeos de regresión antes de confiar en la salida.
3. Arquitectura en 4 Pasos
ds4 es a propósito un corte vertical, no un framework. El README dice que la carga del modelo, el renderizado del prompt, las tool calls, el estado del KV, el servidor HTTP y el agente de código están “built and tested together”. Yo lo leo como cuatro capas:
De la descarga a la respuesta
- 1. Sus propios GGUF. download_model.sh baja archivos de repos de Hugging Face, en su mayoría del propio autor. La receta Q2 aprieta los expertos ruteados (IQ2_XXS en gate/up, Q2_K en down) y deja en mayor precisión las proyecciones Q8, los expertos compartidos y la salida; un imatrix guía la cuantización de los ruteados.
- 2. Un motor en C, tres backends nativos. ds4.c no enlaza GGML. Metal es el objetivo principal, CUDA apunta primero al DGX Spark (más placas Ada como la L40S) y ROCm apunta a Strix Halo. El backend se elige al compilar con los targets de make.
- 3. Un plan de memoria, no solo un loader. Los pesos quedan residentes, o el SSD streaming mantiene una caché acotada de expertos ruteados y lee el resto del GGUF. El estado del KV puede persistir a disco, y el tensor parallelism entre dos máquinas o los pipelines multi-máquina suman RAM.
- 4. Tres interfaces sobre el mismo estado. ./ds4 es un CLI interactivo, ./ds4-agent es un agente de código nativo que corre la inferencia directamente sin servidor HTTP, y ./ds4-server expone endpoints estilo OpenAI (chat, responses y completions) más mensajes estilo Anthropic.
Por qué rinde un corte vertical
Un ejemplo concreto de docs/SERVER.md: para los modelos DeepSeek el servidor conserva los bloques DSML de tool calls que se muestrearon y los reproduce por ID, lo que evita retokenizar un historial JSON con otro formato cuando el cliente reenvía la conversación. Eso solo es posible porque el renderizado, el parseo y el manejo del KV están escritos para una sola familia de modelos.
4. Hardware y Memoria: Qué Necesitás de Verdad
ds4 es un motor de mucha memoria. El README fija una Mac de 96 GB como piso para inferencia residente; por debajo de eso hacés streaming desde SSD y aceptás el costo en velocidad.
Metal
Objetivo principal: Macs con 96 GB o más. Las máquinas más chicas usan SSD streaming. El mismo build cubre M3 y M5 (docs/METAL.md).
Necesita: las herramientas de línea de comandos de Apple.
make
CUDA
El DGX Spark (GB10) es la meta principal. Los kernels de Flash soportan multi-GPU y placas Ada Lovelace, incluidas las L40S de 48 GB.
Necesita: driver de NVIDIA y toolkit CUDA con nvcc y cuBLAS.
make cuda-spark make cuda-generic
ROCm
Strix Halo, como un Framework Desktop de 128 GB (Radeon 8060S, gfx1151). Algunas configuraciones de 128 GB exponen solo unos 62 GB a la GPU, que es poco para Flash Q2 residente.
Necesita: archivos de desarrollo de HIP, hipBLAS, rocBLAS y rocWMMA.
make strix-halo
Dónde empezar según la memoria de tu Mac (docs/METAL.md)
- 64 GBFlash Q2 con --ssd-streaming
- 96 GBFlash Q2; dejá lugar para el contexto y otras apps
- 128 GBFlash Q2, o GLM 5.3 Flash Q2 con contexto modesto
- 256 GBFlash Q4 / MXFP4 o GLM 5.3 Flash Q4
- 512 GBModelos más grandes, incluido PRO Q2
Los docs las llaman “starting points, not guarantees”: puntos de partida, no garantías de que entre un contexto o una cantidad de sesiones dada.
Descargas de DeepSeek V4 Flash (docs/MODELS.md)
- ds4f-q2Flash 0731, unos 81 GiB; punto de partida para sistemas de 96/128 GB
- ds4f-q2-q4Mayormente Q2 con las últimas seis capas de expertos ruteados en Q4; necesita más memoria
- ds4f-q4Flash 0731 Q4; sistemas de más memoria o distribuidos
- ds4f-mxfp4Expertos ruteados MXFP4 nativos de DeepSeek, sin recuantizar; más memoria o distribuido
- pro-q2-imatrixPRO 0813; objetivo residente de 512 GB, o SSD streaming
V4.1 Flash es otra clase de tamaño
Según docs/MODELS.md, ds41f-q2 es un archivo de 341 GiB (152 GiB de pesos principales más 189 GiB de tablas Engram que siempre se leen del disco) y ds41f-q4 pesa 483 GiB. En una sola Mac de 128 GB o un Spark los docs indican usar SSD streaming, y Q4 necesita streaming o una Mac de 512 GB. Prevé un SSD local rápido y el espacio en disco antes de iniciar la descarga.
5. Quickstart
Los comandos de abajo están copiados del README (y de docs/METAL.md, DGX_SPARK.md, STRIX_HALO.md, SSD_STREAMING.md y SERVER.md para las variantes) y verificados contra el README el 2026-10-14. No los ejecuté. Leé download_model.sh antes de correrlo: el primer modelo pesa unos 81 GiB.
Clonar y compilar (Apple Silicon, Metal)
git clone https://github.com/antirez/ds4.git cd ds4 make
Primer modelo para una máquina de 96 o 128 GB
./download_model.sh ds4f-q2 # queda en gguf/, repetí el comando para retomar una descarga interrumpida
Preguntar una vez, chatear o servir
./ds4 -p "Explain Redis streams in one paragraph." ./ds4 ./ds4-server --ctx 32768
Otros builds (DGX Spark y Strix Halo)
make cuda-spark && ./ds4 --cuda make strix-halo && ./ds4 --rocm
Mac más chica: streaming de expertos desde SSD
./ds4 --ssd-streaming --ctx 32768 --nothink
Llamar al servidor local (docs/SERVER.md)
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"Explain Redis streams."}],"stream":true}'Bueno saber, según los docs
- • El modelo por defecto es ds4flash.gguf, un link que actualizan las descargas de modelos principales; pasá -m FILE para ser explícito.
- • El thinking viene activado por defecto; --nothink (o /nothink en el CLI) da respuestas directas.
- • El servidor escucha en 127.0.0.1:8000. --host 0.0.0.0 lo abre a la red y no tiene autenticación incorporada: los strings dsv4-local de las configs de cliente son placeholders.
- • docs/CLIENTS.md trae configuraciones de Pi, OpenCode, Codex CLI y Claude Code contra ds4-server.
6. Velocidad: Solo Números Reportados por el Autor
No medí nada. Estas cifras salen de docs/PERFORMANCE.md y docs/DGX_SPARK.md. El proyecto llama a la primera tabla una línea base registrada para DeepSeek V4 Flash Q2, no un benchmark nuevo de cada commit.
Línea base Flash Q2, máquinas de 128 GB (tokens por segundo)
Casos puntuales con fecha, de los docs
- • Decodificación especulativa DSpark en un DGX Spark (2026-09-06, mediana de tres corridas, 256 tokens): un prompt de tabla hash en C pasó de 19,72 a 31,41 t/s con temperatura 0, pero prosa impredecible con temperatura 1 pasó de 19,53 a 18,81 t/s, o sea más lento. Los docs dicen que una mala aceptación del borrador puede volverla más lenta.
- • Dos DGX Spark por un enlace RoCE directo (2026-10-02): 26,0 t/s de decode en Flash 0731 Q2, descrito como una sola medición y no una mediana de release.
- • Ocho L40S en la configuración de tensor parallelism de Flash: unos 126 t/s agregados con 16 sesiones de decode, que es throughput total y no la velocidad de un usuario.
- • SSD streaming en un M5 Max de 128 GB (2026-09-06): GLM 5.3 Flash Q4_K de 177,77 GiB generó 11,9 y 14,9 t/s tras el prefill inicial y el continuado; DeepSeek Flash Vision Exp MXFP4 generó 11,9 y 19,3 t/s en una sola corrida.
Mi lectura, no una medición
Con los números del autor, una Mac de gama alta sostiene entre 34 y 39 t/s hasta 32K de contexto, y el decode del Spark es menos de la mitad mientras que su prefill es mayor. Los propios docs advierten que un modelo en streaming que arranca igual puede ser demasiado lento para uso interactivo, y el thinking viene activado por defecto, así que la respuesta visible no es toda la factura de tokens.
7. Calidad de la Cuantización y Estado Beta
Dos advertencias separadas: qué te cuesta el 2-bit y qué tan asentado está el código.
“Q2” no significa que todo el modelo esté en 2 bits
Según los docs la compresión se gasta en los expertos ruteados, mientras que las proyecciones, los expertos compartidos y la salida quedan en Q8 y siguen los tensores F16/F32, por lo que el archivo “not all untouched source weights” (no son todos pesos originales intactos). La lista de motivaciones del README dice que V4 Flash, PRO y GLM 5.2 “tolerate aggressive routed-expert quantization”. Es una afirmación del mantenedor, y la evidencia que publica es interna.
Sin puntajes de leaderboard
El README dice que los resultados de ds4-eval son chequeos de integración de DwarfStar, “not official leaderboard scores”. Tomalos como tests de regresión, no como un ranking de calidad.
La calidad se mide contra continuaciones de modelos hospedados
QA_BEFORE_RELEASES.md lista una referencia de 100 casos junto a las notas de velocidad de Flash 0731 Q2 en ROCm: NLL 0,398 y 56/100 aciertos de primer token. No hay una línea base en precisión completa al lado, así que no puedo decirte cuánto cuesta el 2-bit frente a los pesos originales. El único par Q2 vs Q4 de ese archivo es GLM 5.3 Flash: Q2 0,458 y 89/100 contra Q4 0,300 y 90/100 (menor NLL es mejor).
No es bit-exact entre caminos
docs/MODELS.md dice que la ejecución escalar, batcheada y con tensor parallelism “not numerically identical”. La decodificación especulativa en su modo por defecto es “deliberately more deterministic than ordinary sampling”; --mtp-exact-sampling preserva la distribución ordinaria.
Beta, sin releases etiquetados
El README advierte que “instabilities and regressions are definitely possible”. GitHub cuenta 779 issues y pull requests abiertos (cuenta ambos; no los revisé uno por uno).
No uses el backend CPU en una Mac
CONTRIBUTING.md llama al backend CPU un camino de referencia/debug y advierte que correrlo en Metal “can crash the system because of a kernel bug in macOS”.
8. Casos de Uso Donde Encaja
Un agente de código privado en una Mac
Usá ds4-agent directo, o corré ds4-server y apuntá Pi, OpenCode, Codex CLI o Claude Code ahí. Poné el contexto del cliente no más alto que el del servidor, y esperá un primer prefill lento con prompts grandes de agentes (docs/CLIENTS.md).
Una caja multiusuario con placas CUDA
La configuración documentada de ocho L40S atiende 16 sesiones con --batched-session. El soporte Ada importa cuando otra implementación del mismo modelo pide GPUs más nuevas.
Dos máquinas, un modelo más grande
Dos Macs de 128 GB por Thunderbolt RDMA, o dos Spark por RoCE, corren cuantizaciones más grandes residentes. Los docs advierten que los protocolos de red no tienen autenticación ni cifrado y que todos los peers deben correr el mismo commit.
Estudiar un motor hecho a medida
El repo es un ejemplo trabajado de inferencia de un solo modelo: vectores de logprobs de ds4_test, barridos de contexto de ds4-bench y una checklist larga de QA. El autor dice que el software debería ser “a working template for the biggest use cases”.
9. Cuándo NO Usar ds4
El README es inusualmente franco sobre su alcance. Acá es donde elegiría otra cosa.
✅ Usá ds4 si...
- • Tenés una Mac de 96 a 128 GB+, un DGX Spark, un Strix Halo o placas CUDA
- • Uno de los modelos soportados es justo lo que querés correr
- • Querés un agente y un servidor nativos para ese modelo sin un stack de frameworks
- • Podés vivir con un motor beta que recompilás desde main
- • Probaste los expertos ruteados en 2-bit con tus propios prompts
⚠️ Elegí otra cosa si...
- • Necesitás GGUF arbitrarios o la cola larga de modelos: usá llama.cpp, que el propio README de ds4 reconoce
- • Tenés entre 16 y 32 GB de memoria o querés LoRA en modelos chicos: usá MLX
- • Necesitás servir con alta concurrencia y SLAs: usá vLLM o SGLang
- • Estás en Windows o solo con CPU: el README solo lista Metal, CUDA y ROCm
- • Necesitás un release fijo y etiquetado para producción
- • Solo querés las respuestas del modelo: la API hospedada da mucho menos trabajo
Para los vecinos, mirá mi guía de mlx-lm y la comparativa vLLM vs SGLang. Para servir, docs/SERVER.md lista ejecución ordenada (concurrencia sin batching nativo) en CUDA de una sola GPU, con una excepción documentada para V4.1 Q2 con SSD streaming en el Spark.
Mi perspectiva
La apuesta de un modelo y un motor es la idea más interesante de la inferencia local este año, y a la vez es el riesgo: cuando el próximo checkpoint cambie el layout, un motor hecho a medida tiene que adaptarse, como dice el propio autor. Tomalo como una muy buena herramienta para un trabajo acotado.
Lo que no verifiqué
- • No compilé ni corrí ds4, así que ninguna afirmación de velocidad, memoria o calidad de acá es de primera mano.
- • No encontré un benchmark independiente de terceros que pudiera verificar; todos los números son del autor.
- • El post del blog solo muestra una antigüedad relativa, así que “mayo de 2026” es aproximado.
- • El README no expande etiquetas como “0731” o “0813”; las trato como tags de checkpoint.
Conclusión
ds4 es el ejemplo más claro que vi del enfoque “un modelo, un motor”: una base de código en C, sus propios GGUF, kernels nativos para tres familias de GPU y un agente y un servidor testeados encima. Si tenés una Mac de 96 a 128 GB, un DGX Spark o un Strix Halo y querés DeepSeek V4 Flash corriendo en local, es lo primero que probaría, con las advertencias de arriba.
Si no los tenés, o necesitás estabilidad, un runner genérico o una API hospedada es la mejor opción. Elijas lo que elijas, medí con tus propios prompts: todos los números de acá vienen del autor.
Recursos
- • GitHub: github.com/antirez/ds4
- • Guía de modelos: docs/MODELS.md
- • Post del autor: antirez.com/news/165
- • Pesos: huggingface.co/antirez/deepseek-v4-gguf
- • llama.cpp: github.com/ggml-org/llama.cpp



