💡 Para ingenieros de IA y CTOs evaluando si ejecutar LLMs localmente — y por qué la arquitectura distribuida es la respuesta a los cuellos de botella de VRAM.
🎯 TL;DR — Resumen Ejecutivo
- Problema: Ejecutar un LLM de 7B parámetros y generar embeddings en la misma máquina satura la VRAM instantáneamente
- Solución: Arquitectura distribuida que separa inferencia (servidor) de indexación (cliente local)
- Stack: Qdrant (motor vectorial) + vLLM (inferencia) + Ollama (embeddings) + Arize Phoenix (observabilidad)
- Resultado: Escalabilidad sin comprometer el entorno de desarrollo local
📋 Tabla de Contenidos
- El Problema de VRAM en RAG
- Arquitectura del Sistema: Dos Máquinas, Un Sistema
- Máquina Cliente (Local)
- Máquina Servidor (192.168.0.50)
- Beneficios del Enfoque Distribuido
- ¿Por Qué Esto Importa para Producción de IA?
- Conclusiones Clave
- Explora el Código
- Aprendizaje Continuo
- Contribuir
- Artículos Relacionados
� El Problema de VRAM en RAG
En el desarrollo de sistemas de Retrieval-Augmented Generation (RAG), uno de los mayores desafíos es gestionar los recursos computacionales de manera eficiente. Ejecutar grandes modelos de lenguaje (LLMs) localmente a menudo satura la VRAM, lo que penaliza la velocidad de indexación y recuperación de documentos.
flowchart TD
subgraph Problem["Problema: Máquina Única — Competencia por VRAM"]
direction TB
A["GPU (8-24GB VRAM)"] --> B["LLM Local<br/>7B-13B parámetros"]
A --> C["Modelo de Embeddings<br/>768 dimensiones"]
A --> D["Base de Datos Vectorial<br/>Qdrant"]
B --> E["⚠️ Competencia por memoria"]
C --> E
D --> E
E --> F["Indexación lenta"]
E --> G["Búsquedas inutilizables"]
endLos Números del Problema
| Componente | VRAM Requerida | Estado en GPU Única |
|---|---|---|
| LLM 7B (cuantizado) | ~4-6 GB | ✅ Carga |
| Embeddings (Ollama) | ~1-2 GB | ⚠️ Compite |
| Qdrant (vector DB) | ~2-4 GB | ⚠️ Compite |
| Contexto de inferencia | ~2-8 GB | ❌ Insuficiente |
💡 Arquitectura del Sistema: Dos Máquinas, Un Sistema
El sistema se divide en dos componentes principales: la Máquina Cliente (Local) y la Máquina Servidor, comunicadas a través de la red local.
flowchart LR
subgraph Cliente["Máquina Cliente (Local)"]
direction TB
U["UI / MCP Bridge"] --> I["Indexer"]
I --> O["Ollama<br/>Embeddings"]
I --> Q["Qdrant<br/>Vector DB"]
I --> P["Arize Phoenix<br/>Observabilidad"]
end
subgraph Servidor["Máquina Servidor (192.168.0.50)"]
direction TB
V["vLLM<br/>Inferencia LLM"]
end
Cliente -->|"HTTP API<br/>192.168.0.50:8000"| ServidorMáquina Cliente (Local)
Esta máquina se encarga de la orquestación, indexación y la interfaz con el usuario.
- GPU 0 (Primaria): Compartida estratégicamente entre Ollama y Qdrant.
- Ollama: Se utiliza exclusivamente para generar embeddings rápidos (modelos de 768 dimensiones), lo que permite un procesamiento ágil de los documentos.
- Qdrant: Motor de base de datos vectorial que aprovecha la aceleración para la indexación HNSW.
- Arize Phoenix: Una herramienta fundamental para la observabilidad. Recolecta trazas de ejecución de los servicios locales, permitiendo auditar y depurar la recuperación de contexto (retrieval) en tiempo real.
- MCP Bridge & Indexer: El componente central de lógica de negocio. Se encarga de vigilar los archivos, orquestar los flujos de datos y servir la interfaz para las herramientas de IA.
GPU Sharing Strategy
| GPU | Componentes | Uso Objetivo |
|---|---|---|
| GPU 0 (Local) | Ollama + Qdrant | Embeddings + Indexación vectorial |
| GPU 1 (Server) | vLLM | Inferencia LLM pesada |
Local Components
| Componente | Propósito | Puerto |
|---|---|---|
| Ollama | Generación de embeddings | localhost:11434 |
| Qdrant | Base de datos vectorial | localhost:6333 |
| Arize Phoenix | Observabilidad y tracing | localhost:6006 |
| MCP Bridge | Puente de comunicación | localhost:8760 |
🖥️ Máquina Servidor (192.168.0.50)
Esta máquina está dedicada al trabajo pesado de la inferencia del modelo.
- vLLM: Ejecuta el Modelo de Lenguaje de Gran Tamaño (LLM). Al mantener este proceso en un servidor separado mediante un motor de inferencia altamente optimizado como vLLM o TensorRT-LLM, evitamos saturar la VRAM de la máquina de trabajo principal. Esto garantiza que las inferencias pesadas no afecten el rendimiento del indexador local ni de las herramientas de desarrollo.
¿Por qué vLLM?
| Característica | Beneficio |
|---|---|
| Paged Attention | Gestión eficiente de memoria VRAM |
| Continuous Batching | Mayor throughput de inferencia |
| Model Swapping | Cambio entre modelos sin downtime |
| Tensor Parallelism | Escalado multi-GPU |
📈 Beneficios del Enfoque Distribuido
- Eficiencia de VRAM: Al aislar el LLM grande en el servidor, la GPU local puede dedicarse completamente a generar embeddings y realizar búsquedas vectoriales veloces, sin competir por memoria.
- Escalabilidad: Se puede actualizar o cambiar el LLM en el servidor (ej. de un modelo de 8B a uno de 70B) sin alterar la lógica de indexación local.
- Observabilidad: La integración de Arize Phoenix en el nodo local asegura que cada "Retrieval" pueda ser traceado y evaluado para mitigar alucinaciones.
🤔 ¿Por Qué Esto Importa para Producción de IA?
Este patrón distribuido se extiende más allá de los sistemas RAG:
| Tipo de Sistema | Desafío Similar | Solución Distribuida |
|---|---|---|
| Aplicaciones de Chat | Límites de VRAM en velocidad de respuesta | Separar inferencia de UI |
| Procesamiento de Documentos | Indexación compite con generación | GPU dedicada vs inferencia compartida |
| IA Empresarial | Tamaño del modelo vs costo de hardware | Cambiar modelos sin downtime |
| Debugging | Alucinaciones difíciles de rastrear | Observabilidad en cada capa |
✅ Conclusiones Clave
- VRAM es el cuello de botella — ejecutar LLM + embeddings + base de datos vectorial en una GPU causa competencia
- La arquitectura distribuida resuelve esto — separar inferencia (servidor) de indexación (local)
- vLLM permite inferencia flexible — paged attention, continuous batching, cambio de modelos
- Arize Phoenix proporciona observabilidad — rastrear cada recuperación para mitigar alucinaciones
- Escalabilidad modular — actualizar el servidor independientemente del entorno de desarrollo local
🔗 Explora el Código
¿¿Quieres ver la implementación completa? Consulta el repositorio: 87maxi/rag_distributed_system en GitHub:
docker-compose.yml— Configuración de despliegue para ambas máquinasclient/— Orquestación local, MCP Bridge e Indexerserver/— Configuración del servidor de inferencia vLLMobservability/— Configuración de tracing con Arize Phoenix
💬 ¿Quieres Contribuir?
Esta arquitectura es open-source y dirigida por la comunidad. Ya sea que quieras:
- Agregar soporte para bases de datos vectoriales adicionales (Pinecone, Weaviate, Milvus)
- Implementar balanceo de carga multi-servidor con vLLM
- Crear una configuración de despliegue en Kubernetes
- Mejorar los dashboards de Arize Phoenix
Haz fork del repositorio y envía un Pull Request: 87maxi/rag_distributed_system en GitHub
🔗 Aprendizaje Continuo
Mantente actualizado con lo último en arquitectura RAG y sistemas de IA distribuidos:
Recurso Descripción Enlace Documentación vLLM Docs oficiales para paged attention y continuous batching vllm.ai Guías de Qdrant Mejores prácticas de búsqueda vectorial qdrant.tech Arize Phoenix Frameworks de observabilidad y evaluación LLM arize.com Modelos Ollama Biblioteca de modelos de embeddings optimizados ollama.com Docker Compose Patrones de orquestación multi-contenedor docs.docker.com
🔗 Artículos Relacionados
Explora más contenido técnico profundo de este blog:
Artículo Categoría Descripción Aprendizaje Asistido por IA: eBPF y Blockchain Deep Tech Cómo aprendí programación a nivel de kernel con IA API REST con Rust y Rocket Programación de Sistemas API full-stack con framework Rocket y SQLx Interrupciones de Hardware y XDP Internos de Linux Entendiendo tormentas de interrupciones Blindando Validadores con XDP Seguridad Blockchain Mitigación de DoS a nivel de kernel con Rust