¿Alguna vez has sentido que tienes un «cementerio de GPUs» en casa? Tienes un portátil con Apple Silicon, un sobremesa con una NVIDIA potente y quizás un mini-PC haciendo de servidor, pero cada uno por separado solo puede cargar modelos pequeños. El hardware está ahí, ocioso, pero te falta esa capacidad de cómputo masiva que solo obtendrías con una tarjeta de miles de euros.
Aquí es donde entra Mesh LLM. Su objetivo es ambicioso pero directo: agrupa la potencia de cómputo y la memoria de varias máquinas para exponer el resultado como una sola API compatible con OpenAI en http://localhost:9337/v1. Lo mejor es que puedes empezar con un solo nodo y añadir más conforme los necesites; la malla es lo suficientemente inteligente para decidir si un modelo se ejecuta localmente, se enruta a un compañero (peer) o se reparte mediante stage splits para modelos que simplemente no caben en una sola máquina.
Es software libre (Apache-2.0), escrito principalmente en Rust y construido sobre iroh para gestionar toda la complejidad de la capa de red peer-to-peer.
Proyecto joven: la API y el CLI pueden cambiar
Mesh LLM se presentó públicamente en julio de 2026 y sus propios mantenedores lo describen como «experimental distributed-systems software». Los comandos, flags y formatos de configuración de esta guía están tomados de la documentación oficial en el momento de la revisión (2026-07-18), pero pueden cambiar entre versiones. Antes de automatizar nada, contrasta siempre con docs/CLI.md del repositorio oficial.
🎯 Qué problema resuelve
Si trabajas en un homelab o en un equipo de investigación, sabes lo que es tener hardware infrautilizado. Mesh LLM ataca este problema desde tres ángulos estratégicos:
| Situación | Qué hace la malla |
|---|---|
| El modelo cabe entero en un nodo | Lo sirve localmente, sin tráfico de stages |
| Otro peer ya tiene ese modelo cargado | Enruta la petición a ese peer según el campo model |
| El modelo no cabe en ninguna máquina | Lo parte por rangos de capas entre varios nodos (Skippy stage splits) |
Como dice su eslogan: «run bigger models without buying bigger GPUs».
🧭 Cómo encaja frente a lo que ya conoces
Para no perdernos, es importante situar a Mesh LLM en el ecosistema actual de IA local:
- Ollama y LM Studio: Son soluciones de un único nodo, cero red y arranque inmediato. Es lo correcto para el 90 % de los casos.
- llama.cpp: Es el motor de inferencia. Mesh LLM mantiene la paridad de familias de modelos de llama.cpp mediante el formato GGUF.
- Despliegue con Kubernetes: Esto es para inferencia en clústeres gestionados (vLLM y similares) con nodos homogéneos y red de datacenter.
- Mesh LLM: Es cómputo distribuido entre tus propias máquinas heterogéneas, sin necesidad de un orquestador central ni un servidor de coordinación en el plano de datos.
Consulta también Ecosistemas locales para situar todas estas piezas.
🏗️ Arquitectura P2P sobre iroh
Cada nodo levanta un endpoint de iroh cuya clave pública es su identidad de red. Gracias a iroh, el sistema se encarga del hole-punching, el NAT traversal y el fallback a relays. Esto permite que los nodos establezcan conexiones QUIC directas entre sí sin un servidor central en el plano de datos.
Sobre QUIC, Mesh LLM define varios ALPN según la documentación de iroh:
mesh-llm/1— gossip, routing, túneles HTTP y canales de plugins.mesh-llm-control/1— plano de control: configuración y ownership del operador.skippy-stage/2— transporte de activaciones, sensible a latencia.

Descubrimiento público vs. privado
Las mallas publicadas se anuncian mediante descubrimiento Nostr. Las mallas privadas se mantienen basadas en tokens de invitación: sólo entra quien tiene el token.
📦 Instalación
El instalador oficial descarga el ejecutable de release. El binario se llama mesh-llm (mesh-llm.exe en Windows).
curl -fsSL https://raw.githubusercontent.com/Mesh-LLM/mesh-llm/main/install.sh | bash
En Windows, usando PowerShell:
irm https://raw.githubusercontent.com/Mesh-LLM/mesh-llm/main/install.ps1 | iex
Una vez instalado, completa la configuración inicial:
mesh-llm setup
El comando mesh-llm setup configura el runtime nativo y puede instalar el servicio en segundo plano en máquinas macOS y Linux compatibles.
Compilar desde el código fuente
git clone https://github.com/Mesh-LLM/mesh-llm
cd mesh-llm
just build
Requiere just, cmake, Rust y Node.js 24 + npm. Las builds CUDA necesitan nvcc, las de ROCm necesitan ROCm/HIP y las de Vulkan necesitan las cabeceras de Vulkan más glslc. Metal es sólo macOS.
Si necesitas desinstalarlo más adelante, puedes previsualizar la limpieza primero:
mesh-llm uninstall --dry-run
mesh-llm uninstall --yes
Ten en cuenta que la desinstalación preserva la configuración e identidad en ~/.mesh-llm a menos que utilices el flag --purge-config.
🚀 Primeros pasos
Unirse a la malla pública
Si quieres empezar ya mismo, este comando hace casi todo el trabajo sucio:
mesh-llm serve --auto
Este comando elige un backend flavor, descarga un modelo adecuado si es necesario, se une a la mejor malla pública descubierta, arranca la API local en el puerto 9337 y la consola web en el 3131.
Para despliegues en servidores donde no necesites interfaz, usa --headless para ocultar la UI web pero mantener la API de gestión:
mesh-llm serve --auto --headless
Consultar modelos y lanzar una petición
Para ver qué modelos tienes disponibles:
curl -s http://localhost:9337/v1/models | jq '.data[].id'
Y para lanzar tu primera petición de chat:
curl http://localhost:9337/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"GLM-4.7-Flash-Q4_K_M","messages":[{"role":"user","content":"hello"}]}'
Como es compatible con OpenAI, puedes usar cualquier SDK, plugin de IDE o herramienta de agentes apuntando simplemente a http://localhost:9337/v1.
Malla privada entre tus máquinas
Si prefieres no estar en la malla pública, puedes montar tu propia red privada de forma sencilla:
-
Crear la malla en el primer nodo (esto te imprimirá un token de invitación):
mesh-llm serve --model Qwen3-8B-Q4_K_M -
Unir otro nodo con GPU:
mesh-llm serve --join <token> -
Unir un nodo que solo actúe como cliente (sin servir modelos):
mesh-llm client --join <token>
Si aun así quieres que tu malla sea parte del descubrimiento público, simplemente añade el flag --publish:
mesh-llm serve --model Qwen3-8B-Q4_K_M --publish
Hosts Linux con varias interfaces y Docker
En hosts con varias interfaces visibles para el kernel —especialmente con docker run --network host— iroh puede descubrir y anunciar direcciones de bridge Docker o CNI como 172.17.0.1. Si todos los hosts comparten esa dirección, los peers pueden intentar la bridge local equivocada en vez de la red real. Fija la interfaz explícitamente con --bind-ip y --bind-port.
🧩 Repartir un modelo grande: Skippy stage splits
Skippy es el runtime staged que hace la magia. Permite ejecutar modelos gigantes que no caben en una sola máquina cargando stages de capas respaldados por paquetes en varios peers. El proceso sigue estos pasos:
- El coordinador resuelve el modelo o el layer package solicitado.
- El planificador de topología elige peers y rangos de capas contiguos.
- Los stages finales (downstream) cargan primero.
- El stage 0 sólo se vuelve enrutable cuando todos los stages requeridos reportan
ready. - Los clientes OpenAI siguen usando el endpoint normal en
http://localhost:9337/v1.
Los layer packages son repositorios de Hugging Face con un manifiesto model-package.json y fragmentos GGUF, lo que permite que cada peer descargue sólo lo que necesita.
mesh-llm serve --model hf://meshllm/Qwen3-235B-A22B-UD-Q4_K_XL-layers@<revision> --split
Un nodo siempre gana al split
Si un nodo puede cargar el modelo completo, Mesh LLM prefiere la ruta de un solo nodo. El split se usa cuando el modelo físicamente lo necesita o cuando se pide de forma explícita. Para producción, usa refs inmutables (@<revision>) en lugar de refs móviles.
🔀 Routing y modelos especializados
Al exponer la misma API /v1 en todos los nodos, el enrutamiento se hace de forma inteligente por el campo model. Esto te permite tener un patrón muy cómodo en un homelab: una máquina para código, otra para modelos generalistas grandes y otra para visión, todo bajo un único endpoint.
Además, tienes la opción Mixture-of-Agents (MoA). Si envías "model": "mesh", el proxy lanza la petición a todos los modelos disponibles en la malla en paralelo, arbitra las respuestas y te devuelve una única respuesta coherente. Requiere al menos dos modelos distintos.
curl http://localhost:9337/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"mesh","messages":[{"role":"user","content":"What is the capital of Japan?"}]}'
MoA está marcado como experimental por el propio proyecto
La documentación oficial advierte de que el comportamiento, las heurísticas de routing, las formas de error y los parámetros de ajuste de "model": "mesh" pueden cambiar entre versiones. Úsalo como preview; para semántica estable, indica un id de modelo concreto.
⚡ Speculative decoding
Para mejorar la velocidad, Mesh LLM soporta speculative decoding en su runtime staged. Puedes optimizar esto con mesh-llm benchmark tune, que busca la mejor configuración midiendo tokens/s. Los tipos disponibles son auto, mtp, draft, ngram y disabled:
mesh-llm benchmark tune --model /models/qwen3-mtp.gguf --speculative-types auto
mesh-llm benchmark tune --model /models/qwen3-8b.gguf \
--speculative-types draft,ngram,disabled \
--spec-draft-models /models/qwen3-draft.gguf \
--spec-draft-max-tokens 4,8,16
Con la opción auto, el sistema probará primero MTP nativo, luego modelos draft locales, luego candidatos ngram y finalmente una línea base sin speculation para comparar. Los cambios se guardan en ~/.mesh-llm/config.toml si usas --apply.
Alcance del speculative decoding
Los controles de draft speculation, junto con el dtype de activaciones, los controles de prefill y los rangos de capas manuales, sólo se ejecutan en modo staged. La documentación oficial no describe un esquema en el que el modelo draft y el target residan en peers distintos: no asumas esa topología sin verificarla en el repositorio.
🔒 Seguridad y modelo de confianza
Las mallas se pueden asegurar con requisitos inmutables (versión mínima de nodo, política de release attestation, etc.). Cambiar estos requisitos genera un nuevo identificador de malla.
La attestation es procedencia de build, no atestación de runtime
Ojo con esto: una release attestation firmada prueba que el binario fue publicado por alguien de confianza, pero no garantiza que el proceso remoto no haya sido manipulado o que el SO sea seguro. En una malla pública, trata a los peers como entidades no confiables: la inferencia que envías es visible para ellos.
Puedes verificar la validez de un binario empaquetado así:
cargo run -p xtask -- release-attestation inspect \
--binary <path-to-packaged-mesh-llm> \
--public-key-file <release-signing-public-key.json>
Un binario de release reportará valid, uno de desarrollo dirá missing y uno modificado dirá invalid.
🧪 Casos de uso realistas
- Homelab multi-máquina: Unir un Apple Silicon, una NVIDIA y un mini-PC en una malla privada para servir un modelo de 70B+ mediante splits.
- Equipo de investigación: Compartir una malla privada donde cada investigador aporta su máquina y todos acceden a modelos especializados mediante el mismo endpoint local.
- Nodo cliente ligero: Usar un portátil sin GPU para consumir la potencia de una malla mediante
mesh-llm client --join <token>. - Aprovechar horas ociosas: Convertir máquinas de escritorio infrautilizadas en parte de la infraestructura de IA del equipo.
⚠️ Limitaciones y cuándo NO usarlo
Antes de lanzarte, hay algunas realidades técnicas que debes considerar.
Lee esto antes de invertir tiempo
- Latencia de red: Los splits por capas envían activaciones entre máquinas en cada token. En una LAN Gigabit va bien, pero sobre Wi-Fi o WAN la experiencia será muy mala.
- Madurez: Es software experimental. No es apto para entornos de producción con SLAs estrictos.
- Superficie de red: Un demonio P2P con NAT traversal abre puertas en tu red que quizás no quieras abrir. En mallas públicas, tus prompts salen de tu máquina.
- Confianza: No hay atestación de runtime. En malla pública, un nodo malicioso puede ver tus prompts.
- Complejidad: Gestionar tokens, políticas de owner y compatibilidad de versiones requiere atención.
No lo uses si:
- El modelo cabe en una sola máquina: Usa Ollama o llama.cpp.
- Necesitas throughput estable en producción: Usa vLLM sobre Kubernetes.
- Tus datos son ultra-sensibles y no controlas todos los nodos: Quédate en malla privada o usa soluciones locales tradicionales.
- Solo tienes una máquina: No hay nada que repartir.
Reportar bugs
Si encuentras un fallo, incluye el comando, la plataforma, el backend flavor, la salida de /api/status y si la malla era privada o pública.
🔗 Recursos relacionados
- Ollama: instalación y primeros pasos — el punto de partida de un solo nodo.
- llama.cpp — el motor GGUF subyacente.
- LM Studio — alternativa gráfica.
- Ecosistemas locales — panorama general.
- Despliegue a escala con Kubernetes — la alternativa para clústeres de datacenter.
📚 Referencias
Fuentes oficiales consultadas el 2026-07-18:
- Mesh LLM — sitio oficial
- Repositorio oficial: Mesh-LLM/mesh-llm (Apache-2.0)
- Mesh LLM: distributed AI computing on iroh — blog de iroh
docs/MESHES.md— mallas privadas y publicación.docs/SKIPPY_SPLITS.md— splits por capas.docs/CLI.md— referencia de comandos.docs/USAGE.md— guía operativa.- Documentación de iroh
Desambiguación
Este artículo trata de Mesh LLM, la malla de inferencia distribuida P2P construida sobre iroh. No debe confundirse con el paper académico homónimo sobre generación de mallas 3D (arXiv 2508.01242) ni con llmesh de Hewlett Packard Enterprise (agentic tool mesh).
Mesh LLM es una apuesta fascinante para quienes queremos democratizar el acceso a modelos gigantes sin tener que vender un riñón para comprar una nueva GPU. Si tienes hardware repartido por casa, ¡dale una oportunidad!
