{"id":201,"date":"2026-07-18T13:35:21","date_gmt":"2026-07-18T13:35:21","guid":{"rendered":"https:\/\/alejandrollamazareslopez.online\/?p=201"},"modified":"2026-07-18T13:35:22","modified_gmt":"2026-07-18T13:35:22","slug":"guia-definitiva-despliegue-de-ia-local-con-docker-wsl2-sin-morir-en-el-intento","status":"publish","type":"post","link":"https:\/\/alejandrollamazareslopez.online\/?p=201","title":{"rendered":"Gu\u00eda Definitiva: Despliegue de IA Local con Docker, WSL2 sin morir en el intento"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><br>Desplegar modelos de lenguaje (LLMs) de forma local en un servidor dom\u00e9stico 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 <code>libnvidia-ml.so.1<\/code> y fallos del puente CDI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tras pelear con la capa de compatibilidad de Windows y lidiar con contenedores que colapsan por falta de memoria (el temido <code>signal: killed<\/code>), he documentado la soluci\u00f3n definitiva: <strong>descartar el passthrough de la GPU y montar una arquitectura por CPU ultraligera y estable usando Ollama y Open WebUI<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tienes el paso a paso, desde la preparaci\u00f3n del sistema hasta la ejecuci\u00f3n del primer prompt avanzado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Preparaci\u00f3n del Entorno: Controlando la RAM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El mayor enemigo de la ejecuci\u00f3n de IA por CPU es quedarse sin memoria f\u00edsica. Si WSL2 absorbe toda la RAM, el kernel de Linux aniquilar\u00e1 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)<sup><\/sup>. Este paso previene los errores de falta de memoria (Out of Memory - OOM)<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crea un archivo llamado <code>.wslconfig<\/code> en la carpeta ra\u00edz de tu usuario de Windows (<code>C:\\Users\\TuUsuario\\.wslconfig<\/code>) con los siguientes l\u00edmites:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ini, TOML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;wsl2]\nmemory=12GB\nprocessors=4\nswap=2GB\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nota: El l\u00edmite recomendado en un equipo de 16 GB de RAM es de 12 GB<sup><\/sup>. Reinicia el subsistema ejecutando <code>wsl --shutdown<\/code> en PowerShell para aplicar los cambios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. El Despliegue: Un <code>docker-compose.yml<\/code> a prueba de fallos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al eliminar cualquier intento de forzar el uso de la tarjeta gr\u00e1fica (bloques <code>deploy<\/code> o <code>runtime: nvidia<\/code>), Docker levantar\u00e1 los contenedores instant\u00e1neamente sin buscar librer\u00edas gr\u00e1ficas inexistentes. Utilizaremos el siguiente archivo docker-compose.yml para orquestar los contenedores<sup><\/sup>. Observa que el servicio web estar\u00e1 disponible en el puerto 3000, el cual luego podr\u00e1 ser gestionado por un proxy (Nginx\/Apache)<sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Crea el archivo <code>docker-compose.yml<\/code> con esta configuraci\u00f3n exacta:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">YAML<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  ollama:\n    image: ollama\/ollama:latest\n    container_name: ollama\n    restart: unless-stopped\n    ports:\n      - \"11434:11434\"\n    volumes:\n      - ollama_data:\/root\/.ollama\n    \n  open-webui:\n    image: ghcr.io\/open-webui\/open-webui:main\n    container_name: open-webui\n    restart: unless-stopped\n    ports:\n      - \"3000:8080\"\n    environment:\n      - OLLAMA_BASE_URL=http:\/\/ollama:11434\n    volumes:\n      - open-webui_data:\/app\/backend\/data\n    depends_on:\n      - ollama\n\nvolumes:\n  ollama_data:\n  open-webui_data:\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para levantar la infraestructura, simplemente ejecuta en tu terminal:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PowerShell<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1094\" height=\"123\" src=\"https:\/\/alejandrollamazareslopez.online\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-18-141218.png\" alt=\"\" class=\"wp-image-202\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">3. Instanciaci\u00f3n del Modelo (El Enfoque Ligero)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dado que operamos puramente en CPU y RAM, debemos elegir un modelo altamente eficiente. <strong>Qwen 2.5 (1.5B)<\/strong> es perfecto: requiere apenas 1.1 GB de memoria y ofrece una capacidad de razonamiento espectacular en espa\u00f1ol.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e1nzalo ejecutando este comando, lo que te llevar\u00e1 directamente a la consola interactiva (<code>&gt;&gt;&gt;<\/code>) de Ollama:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PowerShell<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec -it ollama ollama run qwen2.5:1.5b\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Parametrizaci\u00f3n en Caliente y Prevenci\u00f3n de Alucinaciones<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para garantizar que el modelo provea informaci\u00f3n confiable y se ajuste estrictamente a tus necesidades de an\u00e1lisis y revisi\u00f3n, implementa los siguientes controles<sup><\/sup>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dentro de la consola de Ollama, configuraremos los par\u00e1metros al vuelo usando el comando <code>\/set<\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Evitar cuelgues por historial:<\/strong> Al limitar el tama\u00f1o del contexto, evitamos que la RAM se llene con conversaciones largas.Plaintext<code>>>> \/set parameter num_ctx 2048<\/code><\/li>\n\n\n\n<li><strong>Temperatura Anal\u00edtica:<\/strong> Por defecto, los modelos son demasiado creativos. Ajustar la temperatura a 0.2 reduce la aleatoriedad en la respuesta. Plaintext<code>>>> \/set parameter temperature 0.2<\/code><\/li>\n\n\n\n<li><strong>System Prompt Estricto:<\/strong> Define el comportamiento central. Tu \u00fanico objetivo es dar informaci\u00f3n precisa y veraz. Nunca asumas ni inventes datos. Plaintext<code>>>> \/set system \"Eres un asistente estricto. No a\u00f1adas charla innecesaria. C\u00ed\u00f1ete a las instrucciones.\"<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1028\" height=\"151\" src=\"https:\/\/alejandrollamazareslopez.online\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-18-152409.png\" alt=\"\" class=\"wp-image-203\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5. El Test de Uso: L\u00f3gica, Rol y JSON Estricto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para comprobar que nuestra IA local configurada por CPU responde como un verdadero asistente avanzado, la someteremos a un \"test de estr\u00e9s\" usando un bloque multil\u00ednea. Las triples comillas (<code>\"\"\"<\/code>) permiten pegar textos largos sin que la terminal ejecute la orden a medias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Copia, pega y ejecuta esto en la consola de Ollama:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plaintext<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; \"\"\"\nAnaliza el siguiente escenario: Estoy aplicando una estrategia DCA (Dollar-Cost Averaging) en la bolsa. El activo 'A' recibe 150\u20ac al mes, el activo 'B' 50\u20ac y el activo 'C' 100\u20ac. Al mismo tiempo, acabo de llegar a Mukdahan y necesito escribir una breve entrada para mi blog de viajes.\n\nCalcula cu\u00e1ntos meses exactos tardar\u00e9 en invertir un total de 3.600\u20ac sumando las tres aportaciones mensuales. \n\nDevuelve tu respuesta EXCLUSIVAMENTE en un formato JSON estructurado con las siguientes tres claves:\n1. \"inversion_mensual_total\": (el n\u00famero calculado)\n2. \"meses_objetivo\": (el n\u00famero calculado)\n3. \"borrador_blog\": (Una reflexi\u00f3n de dos o tres l\u00edneas escrita estrictamente en primera persona, combinando el ambiente de Tailandia con la tranquilidad de mantener mi inversi\u00f3n en piloto autom\u00e1tico).\n\nNo a\u00f1adas saludos, ni explicaciones, ni formato Markdown fuera de las llaves del JSON.\n\"\"\"\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1115\" height=\"697\" src=\"https:\/\/alejandrollamazareslopez.online\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-18-152644.png\" alt=\"\" class=\"wp-image-204\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Al procesar este prompt, el modelo calcular\u00e1 la suma correcta (300\u20ac al mes), el objetivo (12 meses) y redactar\u00e1 la entrada del blog desde tu propia perspectiva, entregando todo en un c\u00f3digo JSON limpio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El resultado es un servidor local 100% funcional, a prueba de ca\u00eddas de RAM y sin la necesidad de depender de los fr\u00e1giles puentes virtuales de las tarjetas gr\u00e1ficas en Windows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que la interfaz gr\u00e1fica est\u00e1 disponible en el puerto 3000, abre <code>http:\/\/localhost:3000<\/code> en el navegador, crea tu usuario y selecciona el modelo local instalado en Ollama. Desde ah\u00ed podr\u00e1s conversar con tu IA de forma mucho m\u00e1s c\u00f3moda, manteniendo la privacidad y el procesamiento en tu propio equipo; Open WebUI se publica habitualmente mediante el mapeo <code>3000:8080<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2015\" height=\"1136\" src=\"https:\/\/alejandrollamazareslopez.online\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-18-141607.png\" alt=\"\" class=\"wp-image-206\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">El test final<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para cerrar la instalaci\u00f3n, conviene comprobar tres capacidades esenciales: razonamiento l\u00f3gico, adopci\u00f3n 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:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">text<code>Analiza el siguiente escenario: Estoy aplicando una estrategia DCA (Dollar-Cost Averaging) en la bolsa. El activo \"A\" recibe 150 \u20ac al mes, el activo \"B\" 50 \u20ac y el activo \"C\" 100 \u20ac. Al mismo tiempo, acabo de llegar a Mukdahan y necesito escribir una breve entrada para mi blog de viajes.\n\nCalcula cu\u00e1ntos meses exactos tardar\u00e9 en invertir un total de 3.600 \u20ac sumando las tres aportaciones mensuales.\n\nDevuelve tu respuesta EXCLUSIVAMENTE en un formato JSON estructurado con las siguientes tres claves:\n1. \"inversion_mensual_total\": el n\u00famero calculado\n2. \"meses_objetivo\": el n\u00famero calculado\n3. \"borrador_blog\": una reflexi\u00f3n de dos o tres l\u00edneas escrita estrictamente en primera persona, combinando el ambiente de Tailandia con la tranquilidad de mantener mi inversi\u00f3n en piloto autom\u00e1tico\n\nNo a\u00f1adas saludos, explicaciones ni formato Markdown fuera de las llaves del JSON.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La respuesta esperada debe indicar una inversi\u00f3n mensual total de 300 \u20ac, un plazo de 12 meses y un breve texto en primera persona. Para escenarios donde el JSON sea cr\u00edtico \u2014automatizaciones, scripts o integraciones\u2014 Ollama permite adem\u00e1s imponer un esquema JSON desde su API, una opci\u00f3n m\u00e1s fiable que depender \u00fanicamente de una instrucci\u00f3n en lenguaje natural.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2013\" height=\"545\" src=\"https:\/\/alejandrollamazareslopez.online\/wp-content\/uploads\/2026\/07\/Screenshot-2026-07-18-153336.png\" alt=\"\" class=\"wp-image-205\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Instalaci\u00f3n completada<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00e1s agradable para gestionar conversaciones, modelos y pruebas. Podr\u00e1s utilizar el modelo descargado o incorporar otros compatibles, sin depender de servicios externos ni de una GPU dedicada para las tareas b\u00e1sicas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desplegar modelos de lenguaje (LLMs) de forma local en un servidor dom\u00e9stico 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-201","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/posts\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=201"}],"version-history":[{"count":1,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions"}],"predecessor-version":[{"id":207,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=\/wp\/v2\/posts\/201\/revisions\/207"}],"wp:attachment":[{"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alejandrollamazareslopez.online\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}