[{"data":1,"prerenderedAt":186},["ShallowReactive",2],{"seo-verification":3,"blog-autoalojar-mlflow-vps-seguimiento-experimentos-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-autoalojar-mlflow-vps-seguimiento-experimentos-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":120,"ctaBody":121,"ctaButton":122,"ctaUrl":123,"relatedPosts":124},567,"autoalojar-mlflow-vps-seguimiento-experimentos",{"fr":12,"en":13,"ar":14,"es":10},"self-host-mlflow-vps","self-host-mlflow-vps-experiment-tracking","استضافة-mlflow-على-vps-تتبع-تجارب-تعلم-الآلة","MLflow en un VPS: seguimiento de experimentos ML y modelos","Instala MLflow en un VPS: seguimiento de experimentos de machine learning, registro de modelos y trazas LLM, protegidos por contraseña y servidos por HTTPS.",6,0,false,"2026-11-05T00:00:00+00:00","2026-11-06T16:13:06+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},1,"Inteligencia Artificial","intelligence-artificielle","bg-purple-500\u002F10 text-purple-400","ia",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-mlflow-vps-poster.svg",{"categorySlug":34,"appSlug":35},"inteligencia-artificial","mlflow","Un proyecto de machine learning produce enseguida decenas de pruebas: una tasa de aprendizaje cambiada aquí, un conjunto de datos limpiado allá, y una métrica anotada en un rincón del notebook. Tres semanas después, nadie sabe qué modelo fue el más preciso, ni con qué código. MLflow es la plataforma open source (licencia Apache-2.0) que guarda todo eso en un servidor central: parámetros, métricas y archivos de cada ejecución, modelos versionados y trazas de las aplicaciones LLM. Esta guía lo instala en un VPS con Docker Compose, lo protege con contraseña, conecta tu código Python y configura las cuentas, las copias de seguridad y las actualizaciones.",[38,42,52,79,82,98,102,105,108,111,114,117],{"type":39,"title":40,"body":41},"h2","Por qué un servidor MLflow","Ejecutado en local, MLflow escribe sus resultados en una carpeta `mlruns` de tu equipo: nadie más los ve, y desaparecen con la máquina. Un servidor de seguimiento lo cambia todo. Cada notebook, cada script de entrenamiento y cada miembro del equipo envía sus ejecuciones al mismo sitio, y la interfaz las compara lado a lado.\n\nEl mismo servidor aloja el registro de modelos — la lista de modelos validados y versionados, con un alias para el que está en producción — y, para la IA generativa, las trazas de tus llamadas a los modelos de lenguaje.",{"type":43,"title":44,"items":45},"ul","Lo que aporta MLflow",[46,47,48,49,50,51],"**Seguimiento de experimentos** — parámetros, métricas y artefactos de cada ejecución, filtrados y comparados en la interfaz.","**Registro de modelos** — versiones, alias e historial, para saber exactamente qué funciona en producción.","**Trazas LLM** — entradas, salidas, latencia y pasos de cada petición de tus aplicaciones de IA generativa.","**Artefactos servidos por el servidor** — archivos, gráficos y modelos subidos por HTTPS, sin almacenamiento S3 que configurar.","**Registro automático** — `autolog()` para scikit-learn, PyTorch, Transformers, XGBoost, OpenAI o LangChain.","**Cuentas y permisos** — una cuenta por persona, permisos concedidos experimento por experimento.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","MLflow frente al seguimiento a mano",[5,56,57],"Servidor MLflow","Notebooks y hoja de cálculo",[59,63,67,71,75],[60,61,62],"Historial de pruebas","Cada ejecución registrada automáticamente","Lo que alguien se acordó de anotar",[64,65,66],"Comparar dos modelos","Una pantalla, métricas lado a lado","Copiar cifras",[68,69,70],"Archivos generados","Guardados con la ejecución que los creó","Dispersos en los portátiles",[72,73,74],"Modelo en producción","Una versión y un alias en el registro","Un archivo llamado «final_v3»",[76,77,78],"Trabajo en equipo","Un servidor compartido, cuentas","Envíos de archivos",{"type":39,"title":80,"body":81},"Requisitos previos","Un VPS Ubuntu 24.04 con **2 GB de RAM** basta para empezar; prevé 4 GB y más disco si guardas muchos modelos, porque son los artefactos los que ocupan espacio. Necesitas Docker con el plugin Compose y un **nombre de dominio** que apunte al VPS, con nginx y un certificado HTTPS: tus scripts y tu equipo se conectarán a él.",{"type":83,"title":84,"steps":85},"steps","Instalar MLflow con Docker Compose",[86,89,92,95],{"title":87,"body":88},"Preparar el directorio y los secretos","Crea el directorio de la aplicación y un archivo `.env` con la contraseña de la cuenta `admin`, la clave de sesión y tu dominio.\n```bash\nmkdir -p \u002Fopt\u002Fmlflow && cd \u002Fopt\u002Fmlflow\ncat > .env \u003C\u003CEOF\nADMIN_PASSWORD=$(openssl rand -hex 16)\nSECRET_KEY=$(openssl rand -hex 24)\nDOMAIN=mlflow.example.ma\nEOF\nchmod 600 .env\n```",{"title":90,"body":91},"Escribir el docker-compose.yml","La imagen `-full` es la variante oficial que incluye el módulo de autenticación. Al arrancar, el comando escribe el archivo `basic_auth.ini` que declara la cuenta `admin`; `--allowed-hosts` solo acepta tu dominio y la interfaz local. El puerto solo se publica en la interfaz local: solo nginx accede a él. `MLFLOW_SERVER_ENABLE_JOB_EXECUTION=false` desactiva el ejecutor de tareas en segundo plano, que consume mucha memoria y no hace falta para el seguimiento.\n```yaml\nservices:\n  mlflow:\n    image: ghcr.io\u002Fmlflow\u002Fmlflow:v3.18.0-full\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:5000:5000\"\n    environment:\n      ADMIN_PASSWORD: ${ADMIN_PASSWORD}\n      DOMAIN: ${DOMAIN}\n      MLFLOW_FLASK_SERVER_SECRET_KEY: ${SECRET_KEY}\n      MLFLOW_AUTH_CONFIG_PATH: \u002Fmlflow\u002Fbasic_auth.ini\n      MLFLOW_SERVER_ENABLE_JOB_EXECUTION: \"false\"\n    entrypoint: [\"\u002Fbin\u002Fsh\", \"-c\"]\n    command:\n      - >-\n        mkdir -p \u002Fmlflow\u002Fartifacts &&\n        printf '[mlflow]\\ndefault_permission = NO_PERMISSIONS\\ndatabase_uri = sqlite:\u002F\u002F\u002F\u002Fmlflow\u002Fbasic_auth.db\\nadmin_username = admin\\nadmin_password = %s\\nauthorization_function = mlflow.server.auth:authenticate_request_basic_auth\\n' \"$$ADMIN_PASSWORD\" > \u002Fmlflow\u002Fbasic_auth.ini &&\n        exec mlflow server --app-name basic-auth --host 0.0.0.0 --port 5000 --workers 2\n        --backend-store-uri sqlite:\u002F\u002F\u002F\u002Fmlflow\u002Fmlflow.db --artifacts-destination \u002Fmlflow\u002Fartifacts\n        --allowed-hosts \"$$DOMAIN,localhost:*,127.0.0.1:*\"\n    volumes:\n      - mlflow-data:\u002Fmlflow\n\nvolumes:\n  mlflow-data: {}\n```",{"title":93,"body":94},"Arrancar y comprobar","El arranque tarda unos quince segundos. `\u002Fhealth` responde sin autenticación; la API, en cambio, devuelve 401 sin credenciales.\n```bash\ndocker compose up -d\ncurl -fsS http:\u002F\u002F127.0.0.1:5000\u002Fhealth\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:5000\u002Fapi\u002F2.0\u002Fmlflow\u002Fexperiments\u002Fsearch\n```",{"title":96,"body":97},"Publicar por HTTPS con nginx","En el vhost de tu dominio (certificado obtenido con certbot), redirige al puerto local transmitiendo la cabecera `Host`. Aumenta `client_max_body_size`: un modelo subido como artefacto supera enseguida el límite por defecto.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:5000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    client_max_body_size 512m;\n}\n```",{"type":99,"title":100,"body":101},"tip","Sin --app-name basic-auth, el servidor está abierto","Por defecto, `mlflow server` no tiene autenticación: cualquiera que llegue a la dirección puede leer tus experimentos, descargar tus modelos y borrarlo todo. Mantén `--app-name basic-auth`, no publiques nunca el puerto 5000 en la IP pública y deja `--allowed-hosts` con tu dominio únicamente: es la protección de MLflow contra el DNS rebinding.",{"type":39,"title":103,"body":104},"Enviar tus experimentos desde Python","Instala el cliente (`pip install mlflow`) en la máquina de entrenamiento y apúntalo a tu servidor. Las credenciales se pasan por variables de entorno:\n```python\nimport os\nimport mlflow\n\nos.environ[\"MLFLOW_TRACKING_USERNAME\"] = \"admin\"\nos.environ[\"MLFLOW_TRACKING_PASSWORD\"] = \"TU_CONTRASEÑA\"\nmlflow.set_tracking_uri(\"https:\u002F\u002Fmlflow.example.ma\")\nmlflow.set_experiment(\"churn-model\")\n\nwith mlflow.start_run():\n    mlflow.log_param(\"learning_rate\", 0.01)\n    mlflow.log_metric(\"accuracy\", 0.93)\n    mlflow.log_artifact(\"confusion_matrix.png\")\n```\nLa ejecución aparece al instante en la interfaz, con sus parámetros, sus métricas y el archivo subido. `mlflow.sklearn.autolog()` o `mlflow.pytorch.autolog()` registran todo eso sin una línea más.",{"type":39,"title":106,"body":107},"Trazar una aplicación LLM","Para un asistente o un agente, las trazas registran cada petición con sus llamadas al modelo, sus pasos y su duración. Activa el registro automático de tu biblioteca o decora tus propias funciones:\n```python\nimport mlflow\n\nmlflow.set_experiment(\"support-assistant\")\nmlflow.openai.autolog()   # cada llamada al cliente de OpenAI se convierte en una traza\n\n@mlflow.trace\ndef answer(question: str) -> str:\n    ...\n```\nLas trazas aparecen en la pestaña del experimento: ves qué llamada fue lenta, qué contexto se envió y qué respondió el modelo.",{"type":39,"title":109,"body":110},"El registro de modelos","Cuando validas una prueba, registra su modelo: recibe un número de versión y puedes darle un alias como `production`.\n```python\nmlflow.register_model(f\"runs:\u002F{run_id}\u002Fmodel\", \"churn-model\")\n```\nTu servicio de inferencia carga entonces `models:\u002Fchurn-model@production`: cambiar de modelo consiste en mover el alias, sin tocar el código.",{"type":39,"title":112,"body":113},"Cuentas y permisos","La cuenta `admin` crea las demás cuentas a través de la API:\n```bash\ncurl -u admin:TU_CONTRASEÑA -X POST https:\u002F\u002Fmlflow.example.ma\u002Fapi\u002F2.0\u002Fmlflow\u002Fusers\u002Fcreate \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\"username\": \"sara\", \"password\": \"UNA_CONTRASEÑA_LARGA\"}'\n```\nUna cuenta nueva no ve **ningún** experimento hasta que se le comparte uno: los permisos (lectura, edición, gestión) se conceden experimento por experimento y modelo por modelo. Cambia la contraseña de `admin` con la API `users\u002Fupdate-password` (indicando la anterior en `current_password`); la nueva se conserva tras los reinicios.",{"type":39,"title":115,"body":116},"Copias de seguridad y actualizaciones","Todo el estado de MLflow está en el volumen `mlflow-data`: la base de los experimentos, la de las cuentas y la carpeta de artefactos. Haz la copia con el contenedor detenido y luego copia el archivo fuera del VPS:\n```bash\ncd \u002Fopt\u002Fmlflow\ndocker compose stop\ndocker run --rm -v mlflow_mlflow-data:\u002Fdata -v \"$PWD\":\u002Fbackup alpine \\\n  tar czf \u002Fbackup\u002Fmlflow-$(date +%F).tar.gz -C \u002Fdata .\ndocker compose start\n```\nPara actualizar, lee primero las notas de la versión — una actualización puede migrar el esquema de la base —, cambia la etiqueta de la imagen en `docker-compose.yml` y luego:\n```bash\ncd \u002Fopt\u002Fmlflow\ndocker compose pull && docker compose up -d\ndocker compose logs --tail 20\n```",{"type":39,"title":118,"body":119},"Instalación en 1 clic con ServOrbit","Las Aplicaciones en 1 clic de ServOrbit instalan MLflow en tu VPS sin línea de comandos: despliega el contenedor oficial, genera la contraseña de la cuenta `admin` y la clave de sesión, activa la autenticación en la interfaz y la API, limita los nombres de host aceptados a tu dirección y publica el servidor por HTTPS en un subdominio de tu dominio o en el subdominio gratuito del VPS (mlflow.{dns_slug}.servorbit-dns.com). La contraseña aparece en tu área de cliente; solo queda conectar tus notebooks.","Tus experimentos de ML en tu propio servidor","Un VPS ServOrbit Ubuntu 24.04 con 2 GB de RAM basta para arrancar MLflow. Instalación en 1 clic desde tu área de cliente, HTTPS en tu dominio o en el subdominio gratuito del VPS, contraseña generada para ti.","Instalar MLflow","\u002Fapplications\u002Finteligencia-artificial\u002Fmlflow",[125,144,168],{"id":126,"slug":127,"slugs":128,"title":132,"excerpt":133,"readTime":134,"views":135,"isPinned":19,"publishedAt":136,"updatedAt":137,"category":138,"categories":139,"featuredImage":30,"bgImage":31,"posterImage":141,"relatedSolution":142},177,"alojar-langfuse-en-un-vps",{"fr":129,"en":130,"ar":131,"es":127},"self-host-langfuse-vps","self-host-langfuse-on-a-vps-llm-observability-no-saas-bill","استضافة-langfuse-على-vps-مراقبة-llm-بلا-فاتورة-saas","Alojar Langfuse en un VPS: observabilidad LLM sin SaaS","Autoaloje Langfuse en un VPS — rastree cada llamada de IA, evalúe prompts y controle costos LLM. Guía completa: nginx, TLS, SDK Python\u002FJS, solución de problemas.",11,2,"2026-07-12T00:00:00+00:00","2026-11-04T16:30:26+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[140],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-langfuse-vps-poster.svg",{"categorySlug":34,"appSlug":143},"langfuse",{"id":145,"slug":146,"slugs":147,"title":151,"excerpt":152,"readTime":153,"views":18,"isPinned":19,"publishedAt":154,"updatedAt":155,"category":156,"categories":162,"featuredImage":30,"bgImage":31,"posterImage":164,"relatedSolution":165},552,"autoalojar-marimo-vps-notebooks-python",{"fr":148,"en":149,"ar":150,"es":146},"self-host-marimo-vps","self-host-marimo-vps-python-notebooks","استضافة-marimo-على-vps-دفاتر-python","marimo en un VPS: notebooks de Python reactivos self-hosted","Instala marimo en un VPS: notebooks de Python reactivos guardados como archivos .py, editor web protegido con contraseña, pandas y polars incluidos.",8,"2026-11-01T00:00:00+00:00","2026-11-04T16:30:29+00:00",{"id":157,"name":158,"slug":159,"color":160,"icon":161},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[163],{"id":157,"name":158,"slug":159,"color":160,"icon":161},"\u002Fblog\u002Fcovers\u002Fself-host-marimo-vps-poster.svg",{"categorySlug":166,"appSlug":167},"desarrollo","marimo",{"id":134,"slug":169,"slugs":170,"title":174,"excerpt":175,"readTime":176,"views":177,"isPinned":19,"publishedAt":178,"updatedAt":179,"category":180,"categories":181,"featuredImage":30,"bgImage":31,"posterImage":183,"relatedSolution":184},"como-alojar-ollama-en-un-vps",{"fr":171,"en":172,"ar":173,"es":169},"heberger-ollama-vps","how-to-host-ollama-on-a-vps","كيفية-استضافة-ollama-على-خادم-vps","Alojar Ollama en un VPS: guía operativa avanzada","Ollama avanzado en VPS: gestión de modelos, reverse proxy nginx, seguridad de la API, cuantización Q4_K_M\u002FQ8, CVE-2026-45672 en Open WebUI y acoplamiento seguro.",9,3,"2026-06-09T00:00:00+00:00","2026-11-04T16:30:24+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[182],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-ollama-vps-poster.svg",{"categorySlug":34,"appSlug":185},"ollama",1793982327347]