<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Machine-Learning on Adur</title><link>https://adurrr.github.io/tags/machine-learning/</link><description>Recent content in Machine-Learning on Adur</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 22 Mar 2023 10:00:00 +0100</lastBuildDate><atom:link href="https://adurrr.github.io/tags/machine-learning/index.xml" rel="self" type="application/rss+xml"/><item><title>Patrones de diseño para pipelines MLOps</title><link>https://adurrr.github.io/p/patrones-de-dise%C3%B1o-para-pipelines-mlops/</link><pubDate>Wed, 22 Mar 2023 10:00:00 +0100</pubDate><guid>https://adurrr.github.io/p/patrones-de-dise%C3%B1o-para-pipelines-mlops/</guid><description>&lt;h2 id="qué-es-mlops-y-por-qué-importa"&gt;Qué es MLOps y por qué importa
&lt;/h2&gt;&lt;p&gt;MLOps trata de desplegar y mantener modelos en producción de forma fiable y eficiente. Conecta la experimentación en ciencia de datos con la ingeniería de producción. Sin MLOps, chocas con los mismos problemas: modelos que funcionan en notebooks pero fallan en producción, sin reproducibilidad, traspasos dolorosos entre equipos, cero visibilidad una vez desplegados.&lt;/p&gt;
&lt;p&gt;La idea: trata sistemas de ML con el mismo rigor que software. Control de versiones, pruebas automatizadas, entrega continua, monitorización. Solo reconoce que datos y modelos introducen desafíos únicos.&lt;/p&gt;
&lt;h2 id="el-ciclo-de-vida-de-ml"&gt;El ciclo de vida de ML
&lt;/h2&gt;&lt;p&gt;Antes de entrar en los patrones, conviene entender las etapas por las que pasa todo sistema de ML:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ingesta y validación de datos&lt;/strong&gt; &amp;mdash; Recopilar, limpiar y validar los datos de entrada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ingeniería de features&lt;/strong&gt; &amp;mdash; Transformar los datos en bruto en features que el modelo pueda consumir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entrenamiento del modelo&lt;/strong&gt; &amp;mdash; Ejecutar experimentos, ajustar hiperparámetros, seleccionar algoritmos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluación del modelo&lt;/strong&gt; &amp;mdash; Validar la calidad del modelo con datos de prueba y métricas de negocio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Despliegue del modelo&lt;/strong&gt; &amp;mdash; Servir predicciones en producción (batch o tiempo real).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitorización y retroalimentación&lt;/strong&gt; &amp;mdash; Seguimiento del rendimiento, detección de drift, activación de reentrenamiento.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada etapa tiene sus propios modos de fallo, y los patrones que se presentan a continuación los abordan de forma sistemática.&lt;/p&gt;
&lt;h2 id="patrones-de-diseño-clave"&gt;Patrones de diseño clave
&lt;/h2&gt;&lt;h3 id="feature-store"&gt;Feature store
&lt;/h3&gt;&lt;p&gt;Un feature store es un repositorio centralizado para almacenar, compartir y servir features de ML. En lugar de que cada equipo recalcule features desde cero, un feature store proporciona:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistencia&lt;/strong&gt; entre entrenamiento y serving (evitando el training-serving skew).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reutilización&lt;/strong&gt; entre equipos y modelos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Corrección temporal&lt;/strong&gt; para valores históricos de features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Herramientas como &lt;strong&gt;Feast&lt;/strong&gt;, &lt;strong&gt;Tecton&lt;/strong&gt; y &lt;strong&gt;Hopsworks&lt;/strong&gt; implementan este patrón. Si varios equipos están duplicando pipelines de features, un feature store probablemente merezca la inversión.&lt;/p&gt;
&lt;h3 id="model-registry"&gt;Model registry
&lt;/h3&gt;&lt;p&gt;Un model registry actúa como catálogo versionado de modelos entrenados. Almacena artefactos del modelo, metadatos (hiperparámetros, métricas, versión de los datos de entrenamiento) y etapa del ciclo de vida (staging, producción, archivado).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MLflow Model Registry&lt;/strong&gt; es una de las soluciones más adoptadas. Permite promover modelos a través de etapas con flujos de aprobación y rastrear la trazabilidad desde el experimento hasta producción.&lt;/p&gt;
&lt;h3 id="ctcicd-para-ml"&gt;CT/CI/CD para ML
&lt;/h3&gt;&lt;p&gt;Los pipelines tradicionales de CI/CD construyen y despliegan código. Los pipelines de ML necesitan tres bucles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continuous Training (CT)&lt;/strong&gt; &amp;mdash; Reentrenar modelos automáticamente cuando cambian los datos o el rendimiento se degrada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt; &amp;mdash; Validar no solo el código sino también esquemas de datos, expectativas de features y umbrales de calidad del modelo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Delivery (CD)&lt;/strong&gt; &amp;mdash; Desplegar modelos validados a la infraestructura de serving de forma automática.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un flujo típico podría ser: llegan datos nuevos al data lake, CT lanza el reentrenamiento, CI ejecuta las pruebas de validación y CD publica el modelo en producción si todas las verificaciones pasan.&lt;/p&gt;
&lt;h3 id="ab-testing"&gt;A/B Testing
&lt;/h3&gt;&lt;p&gt;El A/B testing para modelos consiste en dirigir un porcentaje del tráfico a un modelo nuevo mientras el resto sigue llegando al modelo actual en producción. Se miden métricas de negocio (tasa de conversión, clicks, ingresos) en lugar de solo métricas de ML (accuracy, F1). Este patrón es esencial porque un modelo que puntúa bien en offline puede funcionar mal en producción debido a bucles de retroalimentación, latencia o diferencias en la distribución.&lt;/p&gt;
&lt;h3 id="shadow-deployment"&gt;Shadow Deployment
&lt;/h3&gt;&lt;p&gt;En el modo shadow, el modelo nuevo recibe tráfico de producción y genera predicciones, pero esas predicciones &lt;strong&gt;no&lt;/strong&gt; se sirven a los usuarios. En su lugar, se registran junto a las predicciones del modelo actual para una comparación offline. Es una forma de bajo riesgo de validar un modelo con tráfico real antes de exponerlo a los usuarios.&lt;/p&gt;
&lt;h3 id="canary-releases-para-modelos"&gt;Canary releases para modelos
&lt;/h3&gt;&lt;p&gt;Similar a los canary deployments en software, se despliega un nuevo modelo a una pequeña fracción del tráfico (por ejemplo, el 5%), se monitorizan las métricas clave y se aumenta gradualmente el tráfico si todo se mantiene saludable. Si las métricas se degradan, se realiza un rollback automático. Este patrón se combina bien con A/B testing pero se centra más en la mitigación de riesgos que en la experimentación.&lt;/p&gt;
&lt;h2 id="panorama-de-herramientas"&gt;Panorama de herramientas
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Herramienta&lt;/th&gt;
 &lt;th&gt;Uso principal&lt;/th&gt;
 &lt;th&gt;Punto fuerte&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MLflow&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Tracking de experimentos, model registry&lt;/td&gt;
 &lt;td&gt;Flexible, independiente del proveedor&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Kubeflow&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Pipelines de ML de extremo a extremo en Kubernetes&lt;/td&gt;
 &lt;td&gt;Escalable, cloud-native&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DVC&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Versionado de datos y modelos&lt;/td&gt;
 &lt;td&gt;Flujo de trabajo similar a Git para datos&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Weights &amp;amp; Biases&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Tracking de experimentos, visualización&lt;/td&gt;
 &lt;td&gt;Excelente interfaz y colaboración&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Feast&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Feature store&lt;/td&gt;
 &lt;td&gt;Open-source, listo para producción&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Seldon Core&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Model serving en Kubernetes&lt;/td&gt;
 &lt;td&gt;Estrategias de despliegue avanzadas&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No existe una herramienta que cubra todo. La mayoría de las configuraciones en producción combinan varias, eligiendo según la experiencia del equipo y las restricciones de infraestructura.&lt;/p&gt;
&lt;h2 id="ejemplo-tracking-de-experimentos-con-mlflow"&gt;Ejemplo: tracking de experimentos con MLflow
&lt;/h2&gt;&lt;p&gt;Este es un ejemplo mínimo de cómo registrar un experimento con MLflow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mlflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mlflow.sklearn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.ensemble&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RandomForestClassifier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;accuracy_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f1_score&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Start an MLflow run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rf-baseline&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Log parameters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n_estimators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;max_depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n_estimators&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;max_depth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_depth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Train model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RandomForestClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n_estimators&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;max_depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;max_depth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Log metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;predictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;accuracy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accuracy_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;f1_score&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f1_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;predictions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;weighted&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Log model artifact&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mlflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sklearn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;random-forest-model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cada ejecución queda registrada con sus parámetros, métricas y artefactos, lo que facilita comparar experimentos y reproducir resultados.&lt;/p&gt;
&lt;h2 id="anti-patrones-a-evitar"&gt;Anti-patrones a evitar
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;No versionar datos ni modelos.&lt;/strong&gt; Si no puedes reproducir un entrenamiento de hace seis meses, tienes un problema. Versiona todo: código, datos, configuración y artefactos del modelo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Training-serving skew.&lt;/strong&gt; Cuando la lógica de cálculo de features difiere entre entrenamiento y serving, las predicciones se degradan de forma silenciosa. Un feature store o una librería compartida de cálculo de features ayuda a eliminar esto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Despliegue manual.&lt;/strong&gt; Copiar archivos del modelo a un servidor es una receta para incidentes. Automatiza el despliegue mediante pipelines con puertas de validación adecuadas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ignorar la monitorización del modelo.&lt;/strong&gt; Los modelos se degradan con el tiempo a medida que cambian las distribuciones de entrada. Sin monitorización, solo te enteras cuando un usuario se queja o una métrica de negocio cae. Configura alertas para cambios en la distribución de predicciones, latencia y calidad de datos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pipelines monolíticos.&lt;/strong&gt; Un pipeline único que hace todo desde la ingesta de datos hasta el serving del modelo es frágil y difícil de depurar. Divide los pipelines en etapas modulares e independientemente testeables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sobreingeniería prematura.&lt;/strong&gt; No todos los proyectos de ML necesitan Kubeflow y un feature store desde el día uno. Empieza simple, identifica cuellos de botella y adopta patrones a medida que la complejidad del sistema crece.&lt;/p&gt;
&lt;h2 id="niveles-de-madurez-mlops"&gt;Niveles de madurez MLOps
&lt;/h2&gt;&lt;p&gt;Las organizaciones suelen progresar a través de varios niveles de madurez:&lt;/p&gt;
&lt;h3 id="nivel-0-manual"&gt;Nivel 0: Manual
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Modelos entrenados en notebooks.&lt;/li&gt;
&lt;li&gt;Despliegue manual (copia de archivos, reinicio manual de la API).&lt;/li&gt;
&lt;li&gt;Sin tracking de experimentos.&lt;/li&gt;
&lt;li&gt;Sin monitorización.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nivel-1-automatización-del-pipeline-de-ml"&gt;Nivel 1: automatización del pipeline de ML
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Pipelines de entrenamiento automatizados.&lt;/li&gt;
&lt;li&gt;Tracking de experimentos con herramientas como MLflow.&lt;/li&gt;
&lt;li&gt;Validación básica del modelo antes del despliegue.&lt;/li&gt;
&lt;li&gt;Algo de monitorización de las predicciones del modelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nivel-2-cicd-para-ml"&gt;Nivel 2: CI/CD para ML
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Testing automatizado de datos, features y calidad del modelo.&lt;/li&gt;
&lt;li&gt;Continuous training activado por cambios en los datos o por programación.&lt;/li&gt;
&lt;li&gt;Despliegue automatizado con canary o shadow releases.&lt;/li&gt;
&lt;li&gt;Monitorización completa con alertas y rollback automático.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="nivel-3-mlops-completo"&gt;Nivel 3: MLOps completo
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Feature store para la gestión consistente de features.&lt;/li&gt;
&lt;li&gt;Model registry con gobernanza y flujos de aprobación.&lt;/li&gt;
&lt;li&gt;A/B testing integrado en el proceso de despliegue.&lt;/li&gt;
&lt;li&gt;Trazabilidad de datos y modelos de extremo a extremo.&lt;/li&gt;
&lt;li&gt;Pipelines auto-reparables que detectan y responden al drift automáticamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La mayoría de los equipos se encuentran entre el Nivel 0 y el Nivel 1. El objetivo no es saltar al Nivel 3 de inmediato, sino progresar de forma incremental, abordando primero los cuellos de botella más dolorosos.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión
&lt;/h2&gt;&lt;p&gt;MLOps consiste en aplicar patrones de ingeniería a los desafíos únicos de ML. Empieza con tracking de experimentos y automatización básica, luego añade feature stores, registries y estrategias avanzadas conforme crezcas. La clave: trata modelos como artefactos de producción. Versiona, prueba, monitoriza, mejora.&lt;/p&gt;</description></item><item><title>Introducción a AIOps: operaciones de TI inteligentes</title><link>https://adurrr.github.io/p/introducci%C3%B3n-a-aiops-operaciones-de-ti-inteligentes/</link><pubDate>Mon, 05 Dec 2022 00:00:00 +0000</pubDate><guid>https://adurrr.github.io/p/introducci%C3%B3n-a-aiops-operaciones-de-ti-inteligentes/</guid><description>&lt;h2 id="qué-es-aiops"&gt;¿Qué es AIOps?
&lt;/h2&gt;&lt;p&gt;AIOps (Artificial Intelligence for IT Operations) aplica machine learning y analítica de datos a los datos operativos (logs, métricas, eventos, trazas) para automatizar y mejorar flujos de trabajo. Gartner acuñó el término en 2017, pero la idea es simple: usar algoritmos para gestionar el volumen y la complejidad que los humanos no pueden manejar manualmente.&lt;/p&gt;
&lt;p&gt;En términos prácticos, las plataformas AIOps ingieren datos de herramientas de monitorización, sistemas APM, agregadores de logs y fuentes de eventos. Aplican modelos de ML para detectar anomalías, correlacionar eventos, identificar causas raíz y, en algunos casos, desencadenar remediación automatizada. El objetivo es reducir el tiempo medio de detección (MTTD) y el tiempo medio de resolución (MTTR) mientras se libera a los equipos de operaciones de la fatiga por alertas.&lt;/p&gt;
&lt;h2 id="por-qué-la-monitorización-tradicional-se-queda-corta"&gt;Por qué la monitorización tradicional se queda corta
&lt;/h2&gt;&lt;p&gt;La monitorización funcionaba bien cuando los sistemas eran simples. Tenías pocos servidores, unas pocas apps y un número limitado de métricas. Un umbral estático de CPU o un regex en logs era suficiente.&lt;/p&gt;
&lt;p&gt;La infraestructura moderna rompió ese modelo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escala&lt;/strong&gt;: Un clúster de Kubernetes genera millones de métricas y logs por minuto. No puedes vigilar dashboards a esa escala.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complejidad&lt;/strong&gt;: Los microservicios crean dependencias enredadas. Una petición puede atravesar docenas de servicios. Encontrar qué causó una latencia significa correlacionar datos entre todos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entornos dinámicos&lt;/strong&gt;: Auto-scaling, contenedores efímeros, serverless. Las baselines cambian constantemente y los umbrales estáticos explotan con falsos positivos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fatiga por alertas&lt;/strong&gt;: Los equipos se hunden en alertas. Cuando el 90% es ruido, ese crítico 10% desaparece. Los ingenieros empiezan a ignorar todo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AIOps no reemplaza la monitorización. Se sitúa encima de lo que ya tienes y lo hace más inteligente.&lt;/p&gt;
&lt;h2 id="capacidades-clave"&gt;Capacidades clave
&lt;/h2&gt;&lt;h3 id="1-detección-de-anomalías"&gt;1. Detección de anomalías
&lt;/h3&gt;&lt;p&gt;En lugar de umbrales estáticos, AIOps usa modelos de ML (frecuentemente análisis de series temporales, clustering o autoencoders) para aprender qué aspecto tiene lo &amp;ldquo;normal&amp;rdquo; para cada métrica y servicio. Cuando el comportamiento se desvía significativamente de la línea base aprendida, se marca una anomalía.&lt;/p&gt;
&lt;p&gt;Esto maneja el problema de la línea base dinámica. Si tu aplicación normalmente ve un pico de tráfico cada lunes a las 9 de la mañana, el modelo aprende ese patrón y no alerta por ello. Pero un pico inesperado a las 3 de la madrugada de un miércoles sí se marca.&lt;/p&gt;
&lt;h3 id="2-correlación-de-eventos"&gt;2. Correlación de eventos
&lt;/h3&gt;&lt;p&gt;Un único problema de infraestructura puede generar cientos o miles de alertas relacionadas en diferentes herramientas de monitorización. AIOps correlaciona estos eventos — agrupándolos por tiempo, topología y relaciones causales — para presentar un único incidente en lugar de un muro de alertas.&lt;/p&gt;
&lt;p&gt;Por ejemplo, un fallo en un switch de red podría disparar alertas en: el propio switch, todos los servidores conectados (conectividad perdida), todas las aplicaciones en esos servidores (fallos en health checks), y servicios downstream (errores de timeout). Una plataforma AIOps correlaciona todos estos en un incidente: &amp;ldquo;Switch de red X ha fallado.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="3-análisis-de-causa-raíz"&gt;3. Análisis de causa raíz
&lt;/h3&gt;&lt;p&gt;Más allá de la correlación, AIOps intenta identificar la causa raíz de un incidente. Al comprender la topología de tu infraestructura y la cadena causal de eventos, puede sugerir que el fallo del switch de red es la causa raíz, en lugar de presentar el timeout de la aplicación como un problema independiente.&lt;/p&gt;
&lt;p&gt;Aquí es donde el valor se vuelve tangible. En lugar de que un ingeniero de guardia pase 30 minutos rastreando a través de dashboards y logs, la plataforma muestra la causa raíz probable inmediatamente.&lt;/p&gt;
&lt;h3 id="4-auto-remediación"&gt;4. Auto-remediación
&lt;/h3&gt;&lt;p&gt;Las implementaciones más maduras de AIOps cierran el ciclo disparando acciones de remediación automatizadas. Si se detecta un patrón conocido (disco llenándose, un pod en CrashLoopBackOff, un proceso descontrolado consumiendo memoria), la plataforma puede ejecutar runbooks predefinidos automáticamente.&lt;/p&gt;
&lt;p&gt;Ejemplos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reiniciar un pod o servicio caído.&lt;/li&gt;
&lt;li&gt;Escalar un deployment cuando se detecta carga anómala.&lt;/li&gt;
&lt;li&gt;Limpiar un directorio de logs cuando el uso de disco supera un umbral dinámico.&lt;/li&gt;
&lt;li&gt;Disparar un failover cuando una base de datos primaria deja de responder.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La auto-remediación requiere un diseño cuidadoso. Empieza con acciones de bajo riesgo y amplía conforme crece la confianza.&lt;/p&gt;
&lt;h2 id="plataformas-y-herramientas-comunes"&gt;Plataformas y herramientas comunes
&lt;/h2&gt;&lt;p&gt;El panorama de AIOps incluye tanto plataformas comerciales como bloques de construcción open-source:&lt;/p&gt;
&lt;h3 id="plataformas-comerciales"&gt;Plataformas comerciales
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Plataforma&lt;/th&gt;
 &lt;th&gt;Fortalezas&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Dynatrace&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Auto-descubrimiento robusto, motor de IA (Davis), observabilidad full-stack&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Datadog&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Monitorización unificada + alertas con ML, detección de anomalías Watchdog&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Splunk ITSI&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Analítica de logs potente + toolkit de ML, bueno para correlación de eventos&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Moogsoft&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Pionero en el espacio AIOps, fuerte correlación de eventos y reducción de ruido&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;BigPanda&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Enfocado en correlación de eventos y automatización, se integra con herramientas existentes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;PagerDuty&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Gestión de incidentes con reducción de ruido por ML y agrupación inteligente&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="bloques-de-construcción-open-source"&gt;Bloques de construcción open-source
&lt;/h3&gt;&lt;p&gt;Puedes ensamblar un stack similar a AIOps con componentes open-source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recolección de datos&lt;/strong&gt;: Prometheus, Grafana Agent, OpenTelemetry Collector, Fluentd/Fluent Bit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Almacenamiento de datos&lt;/strong&gt;: Prometheus (métricas), Elasticsearch/OpenSearch (logs), Jaeger/Tempo (trazas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detección de anomalías&lt;/strong&gt;: Facebook Prophet, Isolation Forest (scikit-learn), luminol, Grafana ML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlación de eventos&lt;/strong&gt;: Lógica personalizada sobre streams de eventos, o StackStorm para automatización dirigida por eventos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alertas y automatización&lt;/strong&gt;: Alertmanager, Grafana OnCall, StackStorm, Rundeck.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Construir un stack AIOps personalizado es significativamente más trabajo que usar una plataforma comercial, pero te da control total y evita el vendor lock-in. Un punto medio razonable es usar una plataforma comercial para las capacidades core de AIOps mientras mantienes tu pipeline de datos en open-source.&lt;/p&gt;
&lt;h2 id="casos-de-uso-prácticos"&gt;Casos de uso prácticos
&lt;/h2&gt;&lt;h3 id="reducción-de-ruido-en-gestión-de-alertas"&gt;Reducción de ruido en gestión de alertas
&lt;/h3&gt;&lt;p&gt;Un equipo que recibe más de 500 alertas al día implementa correlación de eventos AIOps. Las alertas relacionadas se agrupan en incidentes, los duplicados se suprimen y las alertas fluctuantes se silencian. El volumen de alertas baja un 80%, y el ingeniero de guardia puede enfocarse en incidentes reales.&lt;/p&gt;
&lt;h3 id="planificación-proactiva-de-capacidad"&gt;Planificación proactiva de capacidad
&lt;/h3&gt;&lt;p&gt;Los modelos AIOps analizan tendencias históricas de uso de recursos y predicen cuándo se alcanzarán los límites de capacidad. En lugar de reaccionar a una alerta de disco lleno a las 2 de la madrugada, la plataforma predice el problema con dos semanas de antelación y crea un ticket para que el equipo lo aborde en horario laboral.&lt;/p&gt;
&lt;h3 id="respuesta-a-incidentes-más-rápida"&gt;Respuesta a incidentes más rápida
&lt;/h3&gt;&lt;p&gt;Durante una caída de producción, la plataforma AIOps correlaciona alertas de todo el stack de monitorización, identifica la causa raíz (un despliegue reciente que introdujo una fuga de memoria) y muestra el commit del despliegue relevante. El MTTR baja de 45 minutos a 10 minutos.&lt;/p&gt;
&lt;h3 id="escalado-automático"&gt;Escalado automático
&lt;/h3&gt;&lt;p&gt;La plataforma detecta patrones de tráfico anómalos que se desvían de la línea base aprendida. En lugar de esperar a que la CPU alcance el 80% (el umbral estático), dispara una acción de scale-up basada en la tasa de cambio, asegurando que la capacidad está lista antes de que los usuarios experimenten degradación.&lt;/p&gt;
&lt;h2 id="cómo-encaja-aiops-en-los-flujos-de-trabajo-devops"&gt;Cómo encaja AIOps en los flujos de trabajo DevOps
&lt;/h2&gt;&lt;p&gt;AIOps no es un reemplazo de las prácticas DevOps. Es una capa de mejora:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Código&lt;/span&gt; &lt;span class="err"&gt;──&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CI&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;CD&lt;/span&gt; &lt;span class="n"&gt;Pipeline&lt;/span&gt; &lt;span class="err"&gt;──&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Deploy&lt;/span&gt; &lt;span class="err"&gt;──&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Observar&lt;/span&gt; &lt;span class="err"&gt;──&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Capa&lt;/span&gt; &lt;span class="n"&gt;AIOps&lt;/span&gt; &lt;span class="err"&gt;──&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Actuar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Monitoring&lt;/span&gt; &lt;span class="n"&gt;Stack&lt;/span&gt; &lt;span class="n"&gt;Modelos&lt;/span&gt; &lt;span class="n"&gt;ML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;métricas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detección&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;anomalías&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;trazas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eventos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;correlación&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RCA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Los &lt;strong&gt;desarrolladores&lt;/strong&gt; se benefician de una identificación más rápida de la causa raíz cuando su código causa problemas en producción.&lt;/li&gt;
&lt;li&gt;Los equipos de &lt;strong&gt;operaciones&lt;/strong&gt; se benefician de la reducción de ruido, remediación automatizada y alertas proactivas.&lt;/li&gt;
&lt;li&gt;Los equipos &lt;strong&gt;SRE&lt;/strong&gt; se benefician del seguimiento de SLOs basado en datos y el análisis de tasa de consumo del error budget.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AIOps funciona mejor cuando tu base de observabilidad es sólida. Si no estás recolectando buenos datos (logs estructurados, métricas significativas, trazas distribuidas), los modelos de ML no producirán insights significativos. Arregla primero tu observabilidad, luego añade AIOps encima.&lt;/p&gt;
&lt;h2 id="primeros-pasos-un-camino-pragmático"&gt;Primeros pasos: Un camino pragmático
&lt;/h2&gt;&lt;p&gt;Si estás considerando AIOps, aquí tienes un enfoque práctico:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Audita tu stack de observabilidad actual.&lt;/strong&gt; ¿Qué datos estás recolectando? ¿Los logs están estructurados? ¿Las métricas están etiquetadas de forma consistente? ¿Las trazas se propagan entre servicios? AIOps es tan bueno como los datos que ingiere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Empieza con la reducción de ruido.&lt;/strong&gt; Esta es la fruta que cuelga más baja. Implementa agrupación y deduplicación de alertas. Incluso una correlación básica basada en reglas (antes de cualquier ML) reducirá la fatiga por alertas significativamente.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Añade detección de anomalías a métricas clave.&lt;/strong&gt; Elige 3-5 métricas críticas de negocio e infraestructura. Aplica un modelo de detección de anomalías de series temporales. Facebook Prophet o recording rules de Prometheus con ajustes estacionales son buenos puntos de partida.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementa remediación automatizada para problemas conocidos.&lt;/strong&gt; Identifica los 5 incidentes recurrentes principales. Escribe runbooks para ellos. Automatiza los runbooks usando StackStorm, Rundeck o el motor de automatización de tu plataforma.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evalúa una plataforma comercial cuando la complejidad lo requiera.&lt;/strong&gt; Si tienes cientos de servicios, múltiples herramientas de monitorización y un equipo de operaciones creciente, la inversión en una plataforma AIOps comercial puede justificarse solo por la reducción en MTTR.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mide el impacto.&lt;/strong&gt; Sigue MTTD, MTTR, ratio alerta-a-incidente y tasa de falsos positivos. Sin métricas, no puedes probar que AIOps vale la pena.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AIOps no es magia. Es un conjunto de técnicas que, aplicadas a buenos datos operativos, pueden reducir la carga sobre los equipos y mejorar la fiabilidad. Empieza pequeño, mide todo, y escala lo que funcione.&lt;/p&gt;</description></item></channel></rss>