	{"id":63668,"date":"2021-10-22T11:15:55","date_gmt":"2021-10-22T10:15:55","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=63668"},"modified":"2024-09-20T17:45:46","modified_gmt":"2024-09-20T16:45:46","slug":"serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-1","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/es\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-1\/","title":{"rendered":"Servir modelos ML a escala utilizando Mlflow en Kubernetes - Parte 1"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling article-author\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-background-color:#ffffff;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Autor<\/h2><\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27150%27%20height%3D%270%27%20viewBox%3D%270%200%20150%200%27%3E%3Crect%20width%3D%27150%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/kais-laribi.jpeg\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left article-author-image\" style=\"width: 150px; border-radius: 54% 46% 77% 23% \/ 74% 40% 60% 26%; overflow: hidden;\" width=\"150\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-text fusion-title-size-three article-author-name-title\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Kais LARIBI<\/h3><\/div><div class=\"fusion-text fusion-text-1 article-author-description\"><p>Cient\u00edfico Senior Data en Artefact<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center fusion-column-inner-bg-wrapper\" style=\"--awb-padding-top:20px;--awb-padding-right:20px;--awb-padding-bottom:20px;--awb-padding-left:20px;--awb-overflow:hidden;--awb-inner-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;--awb-border-radius:4px 4px 4px 4px;--awb-inner-bg-border-radius:4px 4px 4px 4px;--awb-inner-bg-overflow:hidden;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><span class=\"fusion-column-inner-bg hover-type-none\"><a class=\"fusion-column-anchor\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-bf27258775e7\" rel=\"noopener noreferrer\" target=\"_blank\"><span class=\"fusion-column-inner-bg-image\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-row fusion-flex-align-items-center\"><div class=\"fusion-text fusion-text-2\"><p><u>Lea nuestro art\u00edculo sobre<\/u><\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--awb-margin-right:20px;--awb-margin-left:20px;--awb-max-width:150px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-1 hover-type-none\"><img decoding=\"async\" width=\"4000\" height=\"992\" title=\"Mediano Blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png 4000w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 4000px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-3\"><p>.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4 description\"><p>MLflow es una herramienta de uso com\u00fan para el seguimiento de experimentos de aprendizaje autom\u00e1tico, versionado de modelos y servicio. En nuestro primer art\u00edculo de la serie \u201cServir modelos ML a escala\u201d, explicamos c\u00f3mo desplegar la instancia de seguimiento en Kubernetes y utilizarla para registrar experimentos y almacenar modelos.<\/p>\n<\/div><\/div><\/div><\/div><\/div><article class=\"fusion-fullwidth fullwidth-box fusion-builder-row-4 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-3 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-3 fusion-sep-none fusion-title-text fusion-title-size-one\" style=\"--awb-margin-bottom-small:8px;\"><h1 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:70;line-height:1;\">Parte 1 - \u00bfC\u00f3mo desplegar la instancia de seguimiento de Mlflow en Kubernetes?<\/h1><\/div><div class=\"fusion-title title fusion-title-4 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Introducci\u00f3n<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>Mlflow es una herramienta muy utilizada en la comunidad cient\u00edfica\/ML de data para hacer un seguimiento de los experimentos y gestionar los modelos de aprendizaje autom\u00e1tico en diferentes etapas. Utiliz\u00e1ndola, podemos almacenar m\u00e9tricas, modelos y artefactos para comparar f\u00e1cilmente el rendimiento de los modelos y gestionar sus ciclos de vida. Adem\u00e1s, Mlflow proporciona un m\u00f3dulo para servir modelos como un punto final API que facilita su integraci\u00f3n en cualquier producto o aplicaci\u00f3n web.<\/p>\n<\/div><div class=\"fusion-text fusion-text-6\"><p>Dicho esto, utilizar el aprendizaje autom\u00e1tico en productos en l\u00ednea es genial, pero dependiendo del tama\u00f1o del modelo, la naturaleza (ML, aprendizaje profundo,... ) y la carga (solicitudes de los usuarios) podr\u00eda ser un reto dimensionar los recursos necesarios y garantizar un tiempo de respuesta razonable. Por lo tanto, utilizar una infraestructura escalable como los cl\u00fasteres Kubernetes es clave para mantener la disponibilidad y el rendimiento del servicio en la fase de inferencia.<\/p>\n<p>En este contexto, publicamos una serie de tres art\u00edculos en los que respondemos a las siguientes preguntas:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-1 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\u00bfC\u00f3mo desplegar y utilizar la instancia de seguimiento de Mlflow en Kubernetes?<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\u00bfC\u00f3mo servir modelos de aprendizaje autom\u00e1tico como API utilizando Mlflow?<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\u00bfC\u00f3mo manejar un elevado n\u00famero de solicitudes y hacer que nuestra tarea de inferencia sea escalable para productos industrializados?<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-7\"><p>As\u00ed que empecemos este primer art\u00edculo introduciendo Kubernetes y sus componentes y pasemos por el despliegue de una instancia de rastreo a modelos de registro.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-5 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Visi\u00f3n general sobre Kubernetes<\/h2><\/div><div class=\"fusion-text fusion-text-8\"><p>Kubernetes es un proyecto de c\u00f3digo abierto, lanzado por Google en 2014. Es un sistema de control y orquestaci\u00f3n de contenedores que permite el despliegue, escalado y programaci\u00f3n autom\u00e1ticos de aplicaciones. Tiene la siguiente arquitectura:<\/p>\n<\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27705%27%20height%3D%270%27%20viewBox%3D%270%200%20705%200%27%3E%3Crect%20width%3D%27705%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 705px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"705\" height=\"auto\" \/><div class=\"fusion-text fusion-text-9\"><p><strong>Maestro<\/strong>: Se encarga de las configuraciones de entrada, programa las aplicaciones en contenedores en los distintos nodos y supervisa sus estados. El maestro se compone de:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-2 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Servidor API:\u00a0<\/strong>permite la interacci\u00f3n con el cluster y valida los comandos enviados por el desarrollador para actualizar el cluster o el estado de la app.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Programador<\/strong>: decide<strong class=\"jh kt\">\u00a0<\/strong>en qu\u00e9 nodos deben ejecutarse los nuevos objetos para garantizar la estabilidad y el equilibrio de la carga.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Etcd:<\/strong>\u00a0una base clave-valor data que almacena las diferentes configuraciones y estados de los recursos<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Director del Controlador:<\/strong>supervisa el estado del cluster y los diferentes recursos y se asegura de que el estado actual coincide con el deseado.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-10\"><p><strong>Nodos:<\/strong> Son los nodos de ejecuci\u00f3n en los que viven los contenedores desplegados. Sus componentes principales son:<\/p>\n<\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-3 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Vainas:\u00a0<\/strong>son la unidad b\u00e1sica fundamental de ejecuci\u00f3n en Kubernetes. Un Pod encapsula una aplicaci\u00f3n, ya sea como un \u00fanico contenedor o como varios contenedores que funcionan juntos con vol\u00famenes de almacenamiento y redes compartidos.<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>Kubelet:<\/strong>es<strong class=\"jh kt\">\u00a0<\/strong>un<strong class=\"jh kt\">\u00a0<\/strong>agente para inspeccionar el estado del contenedor y comunicarse con el maestro Kubernetes.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-11\"><p>Es la mejor opci\u00f3n cuando una aplicaci\u00f3n tiene varios servicios que se comunican entre s\u00ed, ya que garantiza que cada servicio tenga su propio entorno en contenedores con un conjunto de reglas para interactuar con los dem\u00e1s. Adem\u00e1s, ofrece la interesante capacidad de escalar una aplicaci\u00f3n sin preocuparse de gestionar o sincronizar nuevos servicios y de equilibrar los recursos entre diferentes m\u00e1quinas.<\/p>\n<p>Desde una perspectiva de alto nivel, como cient\u00edficos data o ingenieros ML, interactuaremos con Kubernetes a trav\u00e9s de su API de servidor utilizando comandos CLI o archivos de configuraci\u00f3n YAML para desplegar y exponer aplicaciones u obtener los estados de nuestros recursos.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-6 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Prerrequisitos pr\u00e1cticos<\/h2><\/div><div class=\"fusion-text fusion-text-12\"><p>Para esta pr\u00e1ctica, utilizaremos GCP como proveedor de cloud. En primer lugar, necesitamos :<\/p>\n<\/div><div class=\"fusion-title title fusion-title-7 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">1. Crear los elementos infraestructurales<\/h3><\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-4 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>mlflow_gke:<\/strong> un cubo para almacenar archivos, datasets...<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>mlflow-k8s<\/strong>: un cl\u00faster GKE de tres nodos (e2-highcpu-4) para desplegar tanto el m\u00f3dulo de seguimiento como el modelo de aprendizaje autom\u00e1tico.<\/p>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p><strong>pruebas de carga:\u00a0<\/strong>un cl\u00faster GKE de tres nodos (e2-standard-2) para realizar pruebas de carga. Se utilizar\u00e1 en el tercer art\u00edculo de esta serie.<\/p>\n<\/div><\/li><\/ul><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27659%27%20height%3D%270%27%20viewBox%3D%270%200%20659%200%27%3E%3Crect%20width%3D%27659%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/kais-article2.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 659px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"659\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">2. Configure la estaci\u00f3n de trabajo local<\/h3><\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-5 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">\n<p>Instale los requisitos de python para interactuar con GCP y mlflow cli<\/p>\n<pre class=\"hp hq hr hs ht le gv be\"><span id=\"b8dc\" class=\"ej lf ii dm lg b lh li lj s lk\" data-selectable-paragraph=\"\">pip install mlflow gcsfs google-cloud google-cloud-storage kubernetes<\/span><\/pre>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Tenga\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/reference\/auth\/login\" target=\"_blank\" rel=\"noopener ugc nofollow\">gcloud<\/a>\u00a0y\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/kubernetes-engine\/docs\/how-to\/cluster-access-for-kubectl\" target=\"_blank\" rel=\"noopener ugc nofollow\">kubectl<\/a>\u00a0configurado con las credenciales para acceder al proyecto GCP y a los clusters<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\">Tenga el Helm CLI instalado e inicializado. Por favor\u00a0<a class=\"bv ig\" href=\"https:\/\/helm.sh\/docs\/using_helm\/#installing-helm\" target=\"_blank\" rel=\"noopener ugc nofollow\">encuentre aqu\u00ed las instrucciones<\/a>\u00a0en caso de que a\u00fan no tenga el cliente.<\/div><\/li><\/ul><div class=\"fusion-title title fusion-title-9 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">3. Clone el repositorio del proyecto pr\u00e1ctico para obtener el c\u00f3digo<\/h3><\/div><div class=\"fusion-text fusion-text-13\"><p>git clone <a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/github.com\/artefactory-global\/mlflow-serving-example<\/a><\/p>\n<\/div><div class=\"fusion-title title fusion-title-10 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Despliegue de la instancia Mlflow Tracking<\/h2><\/div><div class=\"fusion-title title fusion-title-11 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">1. Configure el entorno del cl\u00faster<\/h3><\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-6 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Crear una cuenta de servicio para permitir la interacci\u00f3n con GCS<br \/>\n<\/strong>Esto podr\u00eda hacerse a trav\u00e9s de la consola google cloud, en la secci\u00f3n\u00a0<a class=\"bv ig\" href=\"https:\/\/console.cloud.google.com\/iam-admin\/serviceaccounts\" target=\"_blank\" rel=\"noopener ugc nofollow\">secci\u00f3n iam<\/a>. Necesitamos crear una cuenta de servicio con permiso de administrador de objetos de almacenamiento, generar una clave de autenticaci\u00f3n y descargarla como keyfile.json<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Montar el archivo de autenticaci\u00f3n como secreto<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Los secretos nos permiten manejar de forma segura las credenciales para que s\u00f3lo sean visibles para los recursos pertinentes.<strong class=\"jh kt\">\u00a0<\/strong>Para ello, crearemos un volumen secreto y expondremos el archivo de autenticaci\u00f3n s\u00f3lo a los contenedores necesarios.<br \/>\n<span id=\"c3dd\" class=\"ej lf ii dm lg b lh li lj s lk\" data-selectable-paragraph=\"\">kubectl create secret generic gcsfs-creds -from-file=.\/keyfile.json<\/span><\/div><\/li><\/ul><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27634%27%20height%3D%270%27%20viewBox%3D%270%200%20634%200%27%3E%3Crect%20width%3D%27634%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/kais-article3.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 634px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"634\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-12 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">2. Seguimiento del despliegue del servidor<\/h3><\/div><ul style=\"--awb-line-height:27.2px;--awb-icon-width:27.2px;--awb-icon-height:27.2px;--awb-icon-margin:11.2px;--awb-content-margin:38.4px;\" class=\"fusion-checklist fusion-checklist-7 fusion-checklist-default type-icons\"><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Almac\u00e9n Postgres<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Postgre sirve como elemento de almacenamiento backend para que mlflow guarde los modelos metadata y las m\u00e9tricas.<br \/>\nPara desplegarlo utilizaremos Helm: un gestor de recursos para Kubernetes en el que muchas aplicaciones est\u00e1n disponibles en formato de tablas o plantillas que pueden configurarse con sencillos comandos.<\/p>\n<pre class=\"hp hq hr hs ht le gv be\"><span id=\"ac60\" class=\"ej lf ii dm lg b lh li lj s lk\" data-selectable-paragraph=\"\">#docs: https:\/\/artifacthub.io\/packages\/helm\/bitnami\/postgresql<\/span><span id=\"4dec\" class=\"ej lf ii dm lg b lh ln lo lp lq lr lj s lk\" data-selectable-paragraph=\"\">helm repo add bitnami https:\/\/charts.bitnami.com\/bitnami<\/span><span id=\"2bfe\" class=\"ej lf ii dm lg b lh ln lo lp lq lr lj s lk\" data-selectable-paragraph=\"\">helm install mlf-db bitnami\/postgresql --set postgresqlDatabase=mlflow_db --set postgresqlPassword=mlflow --set service.type=NodePort<\/span><\/pre>\n<\/div><\/li><li class=\"fusion-li-item\" style=\"\"><span class=\"icon-wrapper circle-no\"><i class=\"fusion-li-icon awb-icon-check\" aria-hidden=\"true\"><\/i><\/span><div class=\"fusion-li-item-content\"><strong>Instancia de seguimiento<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Tambi\u00e9n utilizaremos gr\u00e1ficos Helm para desplegar el servidor de seguimiento, pero primero, necesitamos construir una imagen docker con la versi\u00f3n que queremos para que pueda ser descargada y desplegada por Helm. Observe que para Postgres, la imagen ya estaba en un repositorio p\u00fablico, sin embargo aqu\u00ed crearemos nuestra propia imagen.<\/p>\n<pre class=\"hp hq hr hs ht le gv be\"><span id=\"f69d\" class=\"ej lf ii dm lg b lh li lj s lk\" data-selectable-paragraph=\"\">cd mlflow-serving-ejemplo<\/span><span id=\"b25e\" class=\"ej lf ii dm lg b lh ln lo lp lq lr lj s lk\" data-selectable-paragraph=\"\">docker build --tag $\/mlflow-tracking-server:v1 --file dockerfile_mlflow_tracking .<\/span><span id=\"38c4\" class=\"ej lf ii dm lg b lh ln lo lp lq lr lj s lk\" data-selectable-paragraph=\"\">docker push $\/mlflow-tracking-server:v1<\/span><\/pre>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-14\"><p>Una vez que la imagen es empujada al registro de im\u00e1genes podemos desplegarla en el cluster a trav\u00e9s de helm utilizando los siguientes comandos.<\/p>\n<pre class=\"hp hq hr hs ht le gv be\"><span id=\"c8ac\" class=\"ej lf ii dm lg b lh li lj s lk\" data-selectable-paragraph=\"\">helm repo add mlflow-tracking <a class=\"bv ig\" href=\"https:\/\/artefactory-global.github.io\/mlflow-tracking-server\/\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/artefactory-global.github.io\/mlflow-tracking-server\/<\/a><\/span><span id=\"f34c\" class=\"ej lf ii dm lg b lh ln lo lp lq lr lj s lk\" data-selectable-paragraph=\"\">helm install mlf-ts mlflow-tracking\/mlflow-tracking-server\n--set env.mlflowArtifactPath=$\n--set env.mlflowDBAddr=mlf-db-postgresql\n--set env.mlflowUser=postgres\n--set env.mlflowPass=mlflow\n--set env.mlflowDBName=mlflow_db\n--set env.mlflowDBPort=5432\n--set service.type=LoadBalancer\n--set image.repository=$\/mlflow-tracking-server\n--set image.tag=v1<\/span><\/pre>\n<p>Ahora, Mlflow deber\u00eda estar en funcionamiento y la interfaz de usuario deber\u00eda ser accesible a trav\u00e9s de la IP del equilibrador de carga. Podemos comprobar la IP asignada utilizando\u00a0<strong><em class=\"jz\">k<\/em><em>ubectl obtener servicios<\/em><em class=\"jz\">.<\/em><\/strong><em class=\"jz\">A<\/em>Adem\u00e1s, podemos depurar el despliegue accediendo a los registros<em class=\"jz\">\u00a0v\u00eda\u00a0<\/em><em><strong>kubectl describe pods<\/strong>.<\/em><br \/>Hasta ahora, nuestra arquitectura actual tiene el siguiente aspecto:<\/p>\n<\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27621%27%20height%3D%270%27%20viewBox%3D%270%200%20621%200%27%3E%3Crect%20width%3D%27621%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-4.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 621px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"621\" height=\"auto\" \/><div class=\"fusion-text fusion-text-15\"><p>Tenga en cuenta que los equilibradores de carga son accesibles a cualquier persona en Internet, por lo que es esencial pensar en asegurar nuestra instancia de seguimiento a\u00f1adiendo una capa de autenticaci\u00f3n. Esto podr\u00eda hacerse con el\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/iap\/docs\/enabling-kubernetes-howto\" target=\"_blank\" rel=\"noopener ugc nofollow\">proxy consciente de la identidad<\/a>\u00a0en GCP, pero no se abordar\u00e1 en este art\u00edculo.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-13 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">3. Creaci\u00f3n de modelos b\u00e1sicos<\/h3><\/div><div class=\"fusion-text fusion-text-16\"><p>Ahora que nuestra infraestructura y nuestra instancia de Mlflow est\u00e1n listas, podemos intentar ejecutar un modelo ML sencillo y guardarlo en el registro de modelos para su uso posterior.<br \/>\nUtilizaremos el conjunto data de calidad del vino, compuesto por unas 4900 muestras y 11 caracter\u00edsticas que reflejan las caracter\u00edsticas del vino. La etiqueta oscila entre 3 y 9 y podr\u00eda considerarse como una calificaci\u00f3n.<br \/>\nSe trata de un ejemplo cl\u00e1sico, en el que entrenamos un modelo de regresi\u00f3n Xgboost y lo almacenamos junto con sus par\u00e1metros y m\u00e9tricas. El c\u00f3digo completo puede encontrarse en\u00a0<a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\/blob\/main\/notebooks\/1.%20model_registry_example.ipynb\" target=\"_blank\" rel=\"noopener ugc nofollow\">cuaderno<\/a>.<br \/>\nSe habr\u00e1 dado cuenta de que la integraci\u00f3n de Mlflow es sencilla y podr\u00eda resumirse en el siguiente fragmento de c\u00f3digo que invoca a\u00a0<em><strong>mlflow.start_run(), mlflow.log_param(), mlflow.log_metric() y mlflow.xgboost.log_model()<\/strong><\/em>para crear respectivamente un nuevo experimento, almacenar los par\u00e1metros de entrenamiento, las m\u00e9tricas de evaluaci\u00f3n y el propio modelo entrenado.<\/p>\n<\/div>con mlflow.start_run() como ejecutar:\n    \n      # Iniciar sesi\u00f3n mlflow\n      mlflow.log_param(\"max_depth\", max_depth)\n      mlflow.log_param(\"min_child_weight\", min_child_weight)\n      mlflow.log_param(\"estimadores\", estimadores)\n\n      # Crear y ajustar el modelo\n      modelo = xgb.XGBRegressor(\n               profundidad_m\u00e1x=profundidad_m\u00e1x,\n               peso_infantil_min=peso_infantil_min,\n               n_estimadores=estimadores\n               random_state=42)\n      model.fit(X_entrenamiento, y_entrenamiento)\n\n      # M\u00e9tricas MLflow\n      predicciones = model.predict(X_prueba)\n      rmse = np.sqrt(error_medio_cuadrado(y_prueba, predicciones))\n      mlflow.log_metric(\"rmse\", rmse)\n\n      Modelo log #\n      mlflow.xgboost.log_model(modelo, \"xgboost-modelo\", nombre_modelo_registrado = nombre_modelo)\n<div class=\"fusion-text fusion-text-17\"><p>Al ejecutar el cuaderno proporcionado, se a\u00f1adir\u00e1 una nueva fila en la interfaz de la instancia de seguimiento que corresponder\u00e1 al nuevo experimento.<\/p>\n<\/div><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27642%27%20height%3D%270%27%20viewBox%3D%270%200%20642%200%27%3E%3Crect%20width%3D%27642%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais5.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 642px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"642\" height=\"auto\" \/><div class=\"fusion-text fusion-text-18\"><p>Por \u00faltimo, suponiendo que estemos satisfechos con el rendimiento del modelo, podemos cargarlo desde la instancia de seguimiento y utilizarlo para la inferencia en python. Esto podr\u00eda hacerse tambi\u00e9n con el cuaderno compartido anteriormente. Observe que en este ejemplo, cargamos el modelo utilizando el ID de ejecuci\u00f3n, pero tenga en cuenta que Mlflow ofrece tambi\u00e9n otras formas interesantes de identificar modelos por etiquetas, versiones o etapas. Para m\u00e1s detalles, consulte la documentaci\u00f3n del registro de modelos\u00a0<a class=\"bv ig\" href=\"https:\/\/www.mlflow.org\/docs\/latest\/model-registry.html\" target=\"_blank\" rel=\"noopener ugc nofollow\">aqu\u00ed<\/a>.<\/p>\n<\/div><div class=\"fusion-title title fusion-title-14 fusion-sep-none fusion-title-text fusion-title-size-two\" style=\"--awb-margin-bottom-small:8px;\"><h2 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:50;line-height:1.2;\">Conclusi\u00f3n<\/h2><\/div><div class=\"fusion-text fusion-text-19\"><p>A lo largo de este art\u00edculo, hemos conseguido desplegar la instancia de seguimiento de Mlflow para gestionar nuestros experimentos cient\u00edficos data y hemos realizado un ejemplo r\u00e1pido que muestra c\u00f3mo registrar un modelo y guardarlo para futuras inferencias en python. En el pr\u00f3ximo art\u00edculo de esta serie, aprenderemos a servir este modelo como una API. Esto tiene una gran importancia, ya que facilita la interacci\u00f3n con el modelo y su integraci\u00f3n en un producto o una aplicaci\u00f3n. Adem\u00e1s, hacerlo sobre Kubernetes garantiza que siga siendo f\u00e1cilmente escalable y capaz de manejar diferentes niveles de carga.<\/p>\n<\/div><\/div><\/div><\/div><\/article><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-5 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-margin-top:40px;--awb-margin-bottom:40px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-center fusion-flex-justify-content-center fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-4 fusion_builder_column_1_1 1_1 fusion-flex-column fusion-flex-align-self-center\" style=\"--awb-padding-top:40px;--awb-padding-right:40px;--awb-padding-bottom:40px;--awb-padding-left:40px;--awb-overflow:hidden;--awb-bg-position:left center;--awb-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--awb-border-style:solid;--awb-border-radius:4px 4px 4px 4px;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper lazyload fusion-column-has-shadow fusion-flex-justify-content-center fusion-content-layout-column fusion-column-has-bg-image\" data-bg-url=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/background.jpg\" data-bg=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/background.jpg\"><div class=\"fusion-image-element\" style=\"text-align:center;--awb-margin-right:20px;--awb-margin-left:20px;--awb-max-width:150px;--awb-caption-title-font-family:var(--h2_typography-font-family);--awb-caption-title-font-weight:var(--h2_typography-font-weight);--awb-caption-title-font-style:var(--h2_typography-font-style);--awb-caption-title-size:var(--h2_typography-font-size);--awb-caption-title-transform:var(--h2_typography-text-transform);--awb-caption-title-line-height:var(--h2_typography-line-height);--awb-caption-title-letter-spacing:var(--h2_typography-letter-spacing);\"><span class=\"fusion-imageframe imageframe-none imageframe-2 hover-type-none\"><img decoding=\"async\" width=\"72\" height=\"41\" title=\"medio\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%2772%27%20height%3D%2741%27%20viewBox%3D%270%200%2072%2041%27%3E%3Crect%20width%3D%2772%27%20height%3D%2741%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/medium.png\" alt class=\"lazyload img-responsive wp-image-60927\"\/><\/span><\/div><div class=\"fusion-title title fusion-title-15 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-three\" style=\"--awb-margin-top:20px;--awb-margin-bottom:0px;--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">Medio Blog por Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-20\" style=\"--awb-content-alignment:center;\"><p>Este art\u00edculo se public\u00f3 inicialmente en <strong>Medium.com<\/strong>.<br \/>\n\u00a1S\u00edganos en nuestro Medium Blog !<\/p>\n<\/div><div style=\"text-align:center;\"><a class=\"fusion-button button-flat button-medium button-default fusion-button-default button-1 fusion-button-default-span fusion-button-default-type\" target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-bf27258775e7\"><span class=\"fusion-button-text awb-button__text awb-button__text--default\">Lea nuestro art\u00edculo<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>22 de octubre de 2021<br \/>\nMLflow es una herramienta de uso com\u00fan para el seguimiento de experimentos de aprendizaje autom\u00e1tico, versionado de modelos y servicio. En nuestro primer art\u00edculo de la serie \u201cServir modelos ML a escala\u201d, explicamos c\u00f3mo desplegar la instancia de seguimiento en Kubernetes y utilizarla para registrar experimentos y almacenar modelos.<\/p>","protected":false},"featured_media":65013,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[21939],"blog-language":[2991],"class_list":["post-63668","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-medium","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog\/63668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/media\/65013"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/media?parent=63668"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-category?post=63668"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-language?post=63668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}