	{"id":63719,"date":"2021-10-25T17:00:23","date_gmt":"2021-10-25T16:00:23","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=63719"},"modified":"2024-09-20T17:45:46","modified_gmt":"2024-09-20T16:45:46","slug":"serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-2","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/es\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-2\/","title":{"rendered":"Servir modelos ML a escala utilizando Mlflow en Kubernetes - Parte 2"},"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-7a85c28d38e\" 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>Este art\u00edculo es la segunda parte de una serie en la que recorremos el proceso de registrar modelos utilizando Mlflow, servirlos como un punto final de la API y, finalmente, escalarlos seg\u00fan las necesidades de nuestra aplicaci\u00f3n. Le animamos a leer nuestro art\u00edculo anterior en el que mostramos c\u00f3mo desplegar una instancia de seguimiento en k8s y comprobar los prerrequisitos pr\u00e1cticos (secretos, variables de entorno...) ya que aqu\u00ed seguiremos bas\u00e1ndonos en ellos.<br \/>\nA continuaci\u00f3n, mostramos c\u00f3mo servir un modelo de aprendizaje autom\u00e1tico que ya est\u00e1 registrado en Mlflow y exponerlo como un punto final de la API en k8s.<\/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 2- \u00bfC\u00f3mo servir un modelo como API 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>Es obvio que el seguimiento y la optimizaci\u00f3n del rendimiento de los modelos es una parte importante de la creaci\u00f3n de modelos de ML. Una vez hecho esto, el siguiente reto es integrarlos en una aplicaci\u00f3n o un producto para utilizar sus predicciones. Esto es lo que llamamos servicio o inferencia de modelos. Existen diferentes marcos de trabajo y t\u00e9cnicas que nos permiten hacerlo. Sin embargo, aqu\u00ed nos centraremos en Mlflow y mostraremos lo eficiente y sencillo que puede llegar a ser.<\/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;\">Construir y desplegar la imagen de servicio<\/h2><\/div><div class=\"fusion-text fusion-text-6\"><p>Los diferentes archivos de configuraci\u00f3n utilizados aqu\u00ed forman parte del\u00a0<a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\" target=\"_blank\" rel=\"noopener ugc nofollow\">repositorio pr\u00e1ctico<\/a>\u00a0B\u00e1sicamente, necesitamos<\/p>\n<\/div><div class=\"fusion-title title fusion-title-6 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. Prepare la imagen docker del servidor Mlflow y env\u00edela al registro de contenedores en GCP.<\/h3><\/div><div class=\"fusion-text fusion-text-7\"><pre class=\"hp hq hr hs ht kg gv be\"><span id=\"09f2\" class=\"ej kh ii dm ki b kj kk kl s km\" data-selectable-paragraph=\"\">cd mlflow-serving-ejemplo<\/span><span id=\"eda1\" class=\"ej kh ii dm ki b kj kn ko kp kq kr kl s km\" data-selectable-paragraph=\"\">docker build --tag $\/mlflow_serving:v1 <br \/>--archivo docker_mlflow_serving .<\/span><span id=\"855d\" class=\"ej kh ii dm ki b kj kn ko kp kq kr kl s km\" data-selectable-paragraph=\"\">docker push $\/mlflow_serving:v1<\/span><\/pre>\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;\">2. Prepare el archivo de despliegue de Kubernetes<\/h3><\/div><div class=\"fusion-text fusion-text-8\"><p>modificando la secci\u00f3n del contenedor y mape\u00e1ndola al\u00a0<strong>imagen docker<\/strong>\u00a0previamente empujado a GCR,\u00a0<strong>la trayectoria del modelo<\/strong>\u00a0y\u00a0<strong>el puerto servidor.<\/strong><\/p>\n<\/div><div class=\"fusion-text fusion-text-9\"><div class=\"code\">\n<table class=\"highlight tab-size js-file-line-container\" data-tab-size=\"8\" data-paste-markdown-skip=\"\">\n<tbody>\n<tr>\n<td id=\"file-mlflow_serving-yaml-LC1\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">apiVersion<\/span>: <span class=\"pl-s\">apps\/v1<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L2\" class=\"blob-num js-line-number\" data-line-number=\"2\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC2\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">amable<\/span>: <span class=\"pl-s\">Despliegue<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L3\" class=\"blob-num js-line-number\" data-line-number=\"3\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC3\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">metadata<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L4\" class=\"blob-num js-line-number\" data-line-number=\"4\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC4\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">mlflow-serving<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L5\" class=\"blob-num js-line-number\" data-line-number=\"5\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC5\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">etiquetas<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L6\" class=\"blob-num js-line-number\" data-line-number=\"6\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC6\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">app<\/span>: <span class=\"pl-s\">serve-ML-model-mlflow<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L7\" class=\"blob-num js-line-number\" data-line-number=\"7\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC7\" class=\"blob-code blob-code-inner js-file-line\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L8\" class=\"blob-num js-line-number\" data-line-number=\"8\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC8\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">spec<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L9\" class=\"blob-num js-line-number\" data-line-number=\"9\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC9\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">r\u00e9plicas<\/span>: <span class=\"pl-c1\">1<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L10\" class=\"blob-num js-line-number\" data-line-number=\"10\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC10\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">selector<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L11\" class=\"blob-num js-line-number\" data-line-number=\"11\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC11\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">matchLabels<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L12\" class=\"blob-num js-line-number\" data-line-number=\"12\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC12\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">app<\/span>: <span class=\"pl-s\">mlflow-serving<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L13\" class=\"blob-num js-line-number\" data-line-number=\"13\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC13\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">plantilla<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L14\" class=\"blob-num js-line-number\" data-line-number=\"14\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC14\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">metadata<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L15\" class=\"blob-num js-line-number\" data-line-number=\"15\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC15\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">etiquetas<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L16\" class=\"blob-num js-line-number\" data-line-number=\"16\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC16\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">app<\/span>: <span class=\"pl-s\">mlflow-serving<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L17\" class=\"blob-num js-line-number\" data-line-number=\"17\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC17\" class=\"blob-code blob-code-inner js-file-line\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L18\" class=\"blob-num js-line-number\" data-line-number=\"18\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC18\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">spec<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L19\" class=\"blob-num js-line-number\" data-line-number=\"19\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC19\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">contenedores<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L20\" class=\"blob-num js-line-number\" data-line-number=\"20\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC20\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">mlflow-serving<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L21\" class=\"blob-num js-line-number\" data-line-number=\"21\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC21\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">imagen<\/span>: <span class=\"pl-s\">GCR_REPO\/mlflow_serving:v1 <\/span><span class=\"pl-c\">1TP45Cambie aqu\u00ed<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L22\" class=\"blob-num js-line-number\" data-line-number=\"22\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC22\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">env<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L23\" class=\"blob-num js-line-number\" data-line-number=\"23\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC23\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">MODELO_URI<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L24\" class=\"blob-num js-line-number\" data-line-number=\"24\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC24\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">valor<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\u201c<\/span>gs:\/\/..\/artifacts\/..\/..\/artifacts\/..<span class=\"pl-pds\">\u201c<\/span><\/span> <span class=\"pl-c\">1TP45Cambie aqu\u00ed<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L25\" class=\"blob-num js-line-number\" data-line-number=\"25\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC25\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">PUERTO DE SERVICIO<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L26\" class=\"blob-num js-line-number\" data-line-number=\"26\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC26\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">valor<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\u201c<\/span>8082<span class=\"pl-pds\">\u201c<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L27\" class=\"blob-num js-line-number\" data-line-number=\"27\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC27\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">GOOGLE_APPLICATION_CREDENTIALS<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L28\" class=\"blob-num js-line-number\" data-line-number=\"28\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC28\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">valor<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\u201c<\/span>\/etc\/secrets\/keyfile.json<span class=\"pl-pds\">\u201c<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L29\" class=\"blob-num js-line-number\" data-line-number=\"29\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC29\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">volumeMounts<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L30\" class=\"blob-num js-line-number\" data-line-number=\"30\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC30\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">gcsfs-creds<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L31\" class=\"blob-num js-line-number\" data-line-number=\"31\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC31\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">mountPath<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\u201c<\/span>\/etc\/secrets<span class=\"pl-pds\">\u201c<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L32\" class=\"blob-num js-line-number\" data-line-number=\"32\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC32\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">readOnly<\/span>: <span class=\"pl-c1\">verdadero<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L33\" class=\"blob-num js-line-number\" data-line-number=\"33\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC33\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">recursos<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L34\" class=\"blob-num js-line-number\" data-line-number=\"34\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC34\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">solicita<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L35\" class=\"blob-num js-line-number\" data-line-number=\"35\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC35\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">cpu<\/span>: <span class=\"pl-s\"><span class=\"pl-pds\">\u201c<\/span>1000m<span class=\"pl-pds\">\u201c<\/span><\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L36\" class=\"blob-num js-line-number\" data-line-number=\"36\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC36\" class=\"blob-code blob-code-inner js-file-line\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L37\" class=\"blob-num js-line-number\" data-line-number=\"37\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC37\" class=\"blob-code blob-code-inner js-file-line\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L38\" class=\"blob-num js-line-number\" data-line-number=\"38\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC38\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">vol\u00famenes<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L39\" class=\"blob-num js-line-number\" data-line-number=\"39\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC39\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">nombre<\/span>: <span class=\"pl-s\">gcsfs-creds<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L40\" class=\"blob-num js-line-number\" data-line-number=\"40\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC40\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">secreto<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L41\" class=\"blob-num js-line-number\" data-line-number=\"41\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC41\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">secretName<\/span>: <span class=\"pl-s\">gcsfs-creds<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L42\" class=\"blob-num js-line-number\" data-line-number=\"42\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC42\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">art\u00edculos<\/span>:<\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L43\" class=\"blob-num js-line-number\" data-line-number=\"43\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC43\" class=\"blob-code blob-code-inner js-file-line\">\u2013 <span class=\"pl-ent\">llave<\/span>: <span class=\"pl-s\">keyfile.json<\/span><\/td>\n<\/tr>\n<tr>\n<td id=\"file-mlflow_serving-yaml-L44\" class=\"blob-num js-line-number\" data-line-number=\"44\">\u00a0<\/td>\n<td id=\"file-mlflow_serving-yaml-LC44\" class=\"blob-code blob-code-inner js-file-line\"><span class=\"pl-ent\">ruta<\/span>: <span class=\"pl-s\">keyfile.json<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div><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;\">3. Ejecute los comandos de despliegue<\/h3><\/div><div class=\"fusion-text fusion-text-10\"><p>kubectl create -f deployments\/mlflow-serving\/mlflow_serving.yaml<\/p>\n<\/div><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;\">4. Exponga el despliegue para el acceso externo<\/h3><\/div><div class=\"fusion-text fusion-text-11\"><p>Con el siguiente comando, se crear\u00e1 un nuevo recurso para redirigir el tr\u00e1fico externo a nuestra API.<\/p>\n<pre class=\"hp hq hr hs ht kg gv be\"><span id=\"d7d7\" class=\"ej kh ii dm ki b kj kk kl s km\" data-selectable-paragraph=\"\">kubectl expose deployment mlflow-serving --port 8082 --type=\"LoadBalancer\"<\/span><\/pre>\n<\/div><div class=\"fusion-title title fusion-title-10 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;\">5. Compruebe el despliegue y consulte el punto final<\/h3><\/div><div class=\"fusion-text fusion-text-12\"><p>Si el despliegue tiene \u00e9xito, mlflow-serving deber\u00eda estar UP y un pod deber\u00eda estar disponible. Puede comprobarlo escribiendo\u00a0<em><strong class=\"jh ka\">kubectl get pods<\/strong><\/em><\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--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=\"559\" height=\"60\" title=\"art\u00edculo-kais-parte2\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2.png\" alt class=\"lazyload img-responsive wp-image-63932\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27559%27%20height%3D%2760%27%20viewBox%3D%270%200%20559%2060%27%3E%3Crect%20width%3D%27559%27%20height%3D%2760%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-200x21.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-400x43.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2.png 559w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 559px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-13\"><p>El paso final es comprobar la direcci\u00f3n IP externa que se asign\u00f3 al equilibrador de carga que redirige el tr\u00e1fico a nuestro contenedor API utilizando\u00a0<strong><em>kubectl obtener servicios<\/em><\/strong>\u00a0y pruebe la respuesta a algunas consultas.<\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--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-3 hover-type-none\"><img decoding=\"async\" width=\"700\" height=\"100\" title=\"art\u00edculo-kais-parte2-2\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2.png\" alt class=\"lazyload img-responsive wp-image-63933\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27100%27%20viewBox%3D%270%200%20700%20100%27%3E%3Crect%20width%3D%27700%27%20height%3D%27100%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2-200x29.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2-400x57.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2-600x86.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-2.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 700px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-14\"><p>Un c\u00f3digo de ejemplo para realizar esas consultas podr\u00eda encontrarse en lo siguiente\u00a0<a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\/blob\/main\/notebooks\/2.%20query%20mlflow%20serve%20API.ipynb\" target=\"_blank\" rel=\"noopener ugc nofollow\">cuaderno<\/a>\u00a0en el que cargamos unas cuantas filas de data, seleccionamos caracter\u00edsticas, las convertimos a formato JSON y las enviamos en una solicitud posterior a la API.<br \/>\nAhora, combinando los pasos realizados en nuestros art\u00edculos anterior y actual, nuestra arquitectura final tendr\u00eda el siguiente aspecto:<\/p>\n<\/div><div class=\"fusion-image-element\" style=\"--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-4 hover-type-none\"><img decoding=\"async\" width=\"700\" height=\"383\" title=\"art\u00edculo-kais-parte2-3\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3.png\" alt class=\"lazyload img-responsive wp-image-63934\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27700%27%20height%3D%27383%27%20viewBox%3D%270%200%20700%20383%27%3E%3Crect%20width%3D%27700%27%20height%3D%27383%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3-200x109.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3-400x219.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3-600x328.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/article-kais-part2-3.png 700w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 700px\" \/><\/span><\/div><div class=\"fusion-title title fusion-title-11 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-15\"><p>En este art\u00edculo, mostramos que podemos desplegar f\u00e1cilmente modelos de aprendizaje autom\u00e1tico como un punto final de API utilizando el m\u00f3dulo de servicio Mlflow.<\/p>\n<p>Como podr\u00e1 observar, en nuestro despliegue actual s\u00f3lo se ha creado un pod para servir el modelo. Aunque esto funciona bien para aplicaciones peque\u00f1as en las que no esperamos m\u00faltiples consultas paralelas, podr\u00eda mostrar r\u00e1pidamente sus l\u00edmites en otras, ya que un solo pod tiene recursos limitados. Adem\u00e1s, de esta forma la aplicaci\u00f3n no podr\u00e1 utilizar la potencia de c\u00e1lculo de m\u00e1s de un nodo. En el siguiente y \u00faltimo art\u00edculo de esta serie, abordaremos la cuesti\u00f3n de la escalabilidad. En primer lugar, destacaremos los cuellos de botella e intentaremos resolverlos para conseguir una aplicaci\u00f3n escalable que aproveche la potencia de nuestro cl\u00faster Kubernetes.<\/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-5 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-12 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-16\" 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\" title=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-7a85c28d38e\" aria-label=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-7a85c28d38e\" 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>25 de octubre de 2021<br \/>\nEste art\u00edculo es la segunda parte de una serie en la que recorremos el proceso de registrar modelos utilizando Mlflow, servirlos como un punto final de la API y, finalmente, escalarlos seg\u00fan las necesidades de nuestra aplicaci\u00f3n. Le animamos a leer nuestro art\u00edculo anterior en el que mostramos c\u00f3mo desplegar una instancia de seguimiento en k8s y comprobar los prerrequisitos pr\u00e1cticos (secretos, variables de entorno...) ya que aqu\u00ed seguiremos bas\u00e1ndonos en ellos.<br \/>\nA continuaci\u00f3n, mostramos c\u00f3mo servir un modelo de aprendizaje autom\u00e1tico que ya est\u00e1 registrado en Mlflow y exponerlo como un punto final de la API en k8s.<\/p>","protected":false},"featured_media":65014,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[21939],"blog-language":[2991],"class_list":["post-63719","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\/63719","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\/65014"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/media?parent=63719"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-category?post=63719"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/es\/wp-json\/wp\/v2\/blog-language?post=63719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}