Desplegar modelos de lenguaje (LLMs) de forma local en un servidor doméstico es un proyecto excelente para mantener la privacidad de los datos. Sin embargo, en entornos Windows con WSL2, intentar que Docker Desktop se comunique con una GPU dedicada suele terminar en un bucle infinito de errores libnvidia-ml.so.1 y fallos del puente CDI.

Tras pelear con la capa de compatibilidad de Windows y lidiar con contenedores que colapsan por falta de memoria (el temido signal: killed), he documentado la solución definitiva: descartar el passthrough de la GPU y montar una arquitectura por CPU ultraligera y estable usando Ollama y Open WebUI.

Aquí tienes el paso a paso, desde la preparación del sistema hasta la ejecución del primer prompt avanzado.

1. Preparación del Entorno: Controlando la RAM

El mayor enemigo de la ejecución de IA por CPU es quedarse sin memoria física. Si WSL2 absorbe toda la RAM, el kernel de Linux aniquilará el proceso de Ollama al instante. Para asegurar que la inteligencia artificial se ejecute de manera estable en un entorno Windows, configuraremos el Subsistema de Windows para Linux (WSL2). Este paso previene los errores de falta de memoria (Out of Memory - OOM).

Crea un archivo llamado .wslconfig en la carpeta raíz de tu usuario de Windows (C:\Users\TuUsuario\.wslconfig) con los siguientes límites:

Ini, TOML

[wsl2]
memory=12GB
processors=4
swap=2GB

Nota: El límite recomendado en un equipo de 16 GB de RAM es de 12 GB. Reinicia el subsistema ejecutando wsl --shutdown en PowerShell para aplicar los cambios.

2. El Despliegue: Un docker-compose.yml a prueba de fallos

Al eliminar cualquier intento de forzar el uso de la tarjeta gráfica (bloques deploy o runtime: nvidia), Docker levantará los contenedores instantáneamente sin buscar librerías gráficas inexistentes. Utilizaremos el siguiente archivo docker-compose.yml para orquestar los contenedores. Observa que el servicio web estará disponible en el puerto 3000, el cual luego podrá ser gestionado por un proxy (Nginx/Apache).

Crea el archivo docker-compose.yml con esta configuración exacta:

YAML

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - open-webui_data:/app/backend/data
    depends_on:
      - ollama

volumes:
  ollama_data:
  open-webui_data:

Para levantar la infraestructura, simplemente ejecuta en tu terminal:

PowerShell

docker-compose up -d

3. Instanciación del Modelo (El Enfoque Ligero)

Dado que operamos puramente en CPU y RAM, debemos elegir un modelo altamente eficiente. Qwen 2.5 (1.5B) es perfecto: requiere apenas 1.1 GB de memoria y ofrece una capacidad de razonamiento espectacular en español.

Lánzalo ejecutando este comando, lo que te llevará directamente a la consola interactiva (>>>) de Ollama:

PowerShell

docker exec -it ollama ollama run qwen2.5:1.5b

4. Parametrización en Caliente y Prevención de Alucinaciones

Para garantizar que el modelo provea información confiable y se ajuste estrictamente a tus necesidades de análisis y revisión, implementa los siguientes controles:

Dentro de la consola de Ollama, configuraremos los parámetros al vuelo usando el comando /set:

  • Evitar cuelgues por historial: Al limitar el tamaño del contexto, evitamos que la RAM se llene con conversaciones largas.Plaintext>>> /set parameter num_ctx 2048
  • Temperatura Analítica: Por defecto, los modelos son demasiado creativos. Ajustar la temperatura a 0.2 reduce la aleatoriedad en la respuesta. Plaintext>>> /set parameter temperature 0.2
  • System Prompt Estricto: Define el comportamiento central. Tu único objetivo es dar información precisa y veraz. Nunca asumas ni inventes datos. Plaintext>>> /set system "Eres un asistente estricto. No añadas charla innecesaria. Cíñete a las instrucciones."

5. El Test de Uso: Lógica, Rol y JSON Estricto

Para comprobar que nuestra IA local configurada por CPU responde como un verdadero asistente avanzado, la someteremos a un "test de estrés" usando un bloque multilínea. Las triples comillas (""") permiten pegar textos largos sin que la terminal ejecute la orden a medias.

Copia, pega y ejecuta esto en la consola de Ollama:

Plaintext

>>> """
Analiza el siguiente escenario: Estoy aplicando una estrategia DCA (Dollar-Cost Averaging) en la bolsa. El activo 'A' recibe 150€ al mes, el activo 'B' 50€ y el activo 'C' 100€. Al mismo tiempo, acabo de llegar a Mukdahan y necesito escribir una breve entrada para mi blog de viajes.

Calcula cuántos meses exactos tardaré en invertir un total de 3.600€ sumando las tres aportaciones mensuales. 

Devuelve tu respuesta EXCLUSIVAMENTE en un formato JSON estructurado con las siguientes tres claves:
1. "inversion_mensual_total": (el número calculado)
2. "meses_objetivo": (el número calculado)
3. "borrador_blog": (Una reflexión de dos o tres líneas escrita estrictamente en primera persona, combinando el ambiente de Tailandia con la tranquilidad de mantener mi inversión en piloto automático).

No añadas saludos, ni explicaciones, ni formato Markdown fuera de las llaves del JSON.
"""

Al procesar este prompt, el modelo calculará la suma correcta (300€ al mes), el objetivo (12 meses) y redactará la entrada del blog desde tu propia perspectiva, entregando todo en un código JSON limpio.

El resultado es un servidor local 100% funcional, a prueba de caídas de RAM y sin la necesidad de depender de los frágiles puentes virtuales de las tarjetas gráficas en Windows.

Ahora que la interfaz gráfica está disponible en el puerto 3000, abre http://localhost:3000 en el navegador, crea tu usuario y selecciona el modelo local instalado en Ollama. Desde ahí podrás conversar con tu IA de forma mucho más cómoda, manteniendo la privacidad y el procesamiento en tu propio equipo; Open WebUI se publica habitualmente mediante el mapeo 3000:8080.

El test final

Para cerrar la instalación, conviene comprobar tres capacidades esenciales: razonamiento lógico, adopción de un rol concreto y respeto estricto de una estructura JSON. En lugar de usar la terminal, pega el siguiente prompt directamente en el chat de la interfaz:

textAnaliza el siguiente escenario: Estoy aplicando una estrategia DCA (Dollar-Cost Averaging) en la bolsa. El activo "A" recibe 150 € al mes, el activo "B" 50 € y el activo "C" 100 €. Al mismo tiempo, acabo de llegar a Mukdahan y necesito escribir una breve entrada para mi blog de viajes.

Calcula cuántos meses exactos tardaré en invertir un total de 3.600 € sumando las tres aportaciones mensuales.

Devuelve tu respuesta EXCLUSIVAMENTE en un formato JSON estructurado con las siguientes tres claves:
1. "inversion_mensual_total": el número calculado
2. "meses_objetivo": el número calculado
3. "borrador_blog": una reflexión de dos o tres líneas escrita estrictamente en primera persona, combinando el ambiente de Tailandia con la tranquilidad de mantener mi inversión en piloto automático

No añadas saludos, explicaciones ni formato Markdown fuera de las llaves del JSON.

La respuesta esperada debe indicar una inversión mensual total de 300 €, un plazo de 12 meses y un breve texto en primera persona. Para escenarios donde el JSON sea crítico —automatizaciones, scripts o integraciones— Ollama permite además imponer un esquema JSON desde su API, una opción más fiable que depender únicamente de una instrucción en lenguaje natural.

Instalación completada

Con esto dispones de un servidor de IA local plenamente operativo: Ollama ejecuta el modelo en CPU y Open WebUI aporta una experiencia visual más agradable para gestionar conversaciones, modelos y pruebas. Podrás utilizar el modelo descargado o incorporar otros compatibles, sin depender de servicios externos ni de una GPU dedicada para las tareas básicas.