	{"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\/br\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-1\/","title":{"rendered":"Servindo modelos de ML em escala usando o Mlflow no 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>Cientista s\u00eanior do Data no 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>Leia nosso artigo 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=\"M\u00e9dio 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>O MLflow \u00e9 uma ferramenta comumente usada para rastreamento de experimentos de aprendizado de m\u00e1quina, controle de vers\u00e3o de modelos e fornecimento. Em nosso primeiro artigo da s\u00e9rie \u201cServindo modelos de ML em escala\u201d, explicamos como implantar a inst\u00e2ncia de rastreamento no Kubernetes e us\u00e1-la para registrar experimentos e armazenar 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 - Como implantar a inst\u00e2ncia de rastreamento do Mlflow no 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;\">Introdu\u00e7\u00e3o<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>O Mlflow \u00e9 uma ferramenta amplamente usada na comunidade cient\u00edfica\/ML do data para rastrear experimentos e gerenciar modelos de aprendizado de m\u00e1quina em diferentes est\u00e1gios. Com ela, podemos armazenar m\u00e9tricas, modelos e artefatos para comparar facilmente o desempenho dos modelos e lidar com seus ciclos de vida. Al\u00e9m disso, o Mlflow fornece um m\u00f3dulo para servir modelos como um endpoint de API que facilita sua integra\u00e7\u00e3o a qualquer produto ou aplicativo da Web.<\/p>\n<\/div><div class=\"fusion-text fusion-text-6\"><p>Dito isso, usar o aprendizado de m\u00e1quina em produtos on-line \u00e9 legal, mas dependendo do tamanho do modelo, da natureza (ML, aprendizado profundo,...) e da carga (solicita\u00e7\u00f5es dos usu\u00e1rios), pode ser um desafio dimensionar os recursos necess\u00e1rios e garantir um tempo de resposta razo\u00e1vel. Portanto, usar uma infraestrutura dimension\u00e1vel, como clusters Kubernetes, \u00e9 fundamental para manter a disponibilidade e o desempenho do servi\u00e7o na fase de infer\u00eancia.<\/p>\n<p>Nesse contexto, estamos publicando uma s\u00e9rie de tr\u00eas artigos nos quais respondemos \u00e0s seguintes perguntas:<\/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\">Como implantar e usar a inst\u00e2ncia de rastreamento do Mlflow no 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\">Como servir modelos de aprendizado de m\u00e1quina como API usando o 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\">Como lidar com um grande n\u00famero de solicita\u00e7\u00f5es e tornar nossa tarefa de infer\u00eancia dimension\u00e1vel para produtos industrializados?<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-7\"><p>Portanto, vamos come\u00e7ar este primeiro artigo apresentando o Kubernetes e seus componentes e analisar a implanta\u00e7\u00e3o de uma inst\u00e2ncia de rastreamento para 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;\">Vis\u00e3o geral do Kubernetes<\/h2><\/div><div class=\"fusion-text fusion-text-8\"><p>O Kubernetes \u00e9 um projeto de c\u00f3digo aberto, lan\u00e7ado pelo Google em 2014. \u00c9 um sistema de controle e orquestra\u00e7\u00e3o de cont\u00eaineres que permite a implanta\u00e7\u00e3o, o dimensionamento e o agendamento autom\u00e1ticos de aplicativos. Ele tem a seguinte arquitetura:<\/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>Mestre<\/strong>: Ele lida com as configura\u00e7\u00f5es de entrada, programa aplicativos em cont\u00eaineres nos diferentes n\u00f3s e monitora seus estados. O mestre \u00e9 composto por:<\/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 de API:\u00a0<\/strong>permite a intera\u00e7\u00e3o com o cluster e valida os comandos enviados pelo desenvolvedor para atualizar o cluster ou o estado do aplicativo.<\/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>Agendador<\/strong>: decide<strong class=\"jh kt\">\u00a0<\/strong>em quais n\u00f3s os novos objetos devem ser executados para garantir a estabilidade e o balanceamento de 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>\u00a0um database de valor-chave que armazena as diferentes configura\u00e7\u00f5es e estados dos 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>Gerente de controladoria:<\/strong>monitora o estado do cluster e os diferentes recursos e garante que o estado atual corresponda ao desejado.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-10\"><p><strong>N\u00f3s:<\/strong> Eles s\u00e3o os n\u00f3s de execu\u00e7\u00e3o nos quais vivem os cont\u00eaineres implantados. Seus principais componentes s\u00e3o:<\/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>Pods:\u00a0<\/strong>s\u00e3o a unidade de execu\u00e7\u00e3o b\u00e1sica fundamental no Kubernetes. Um Pod encapsula um aplicativo como um \u00fanico cont\u00eainer ou v\u00e1rios cont\u00eaineres que trabalham juntos com volumes de armazenamento e redes compartilhados.<\/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>\u00e9<strong class=\"jh kt\">\u00a0<\/strong>e<strong class=\"jh kt\">\u00a0<\/strong>para inspecionar o status do cont\u00eainer e se comunicar com o mestre do Kubernetes.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-11\"><p>\u00c9 a op\u00e7\u00e3o ideal quando um aplicativo tem v\u00e1rios servi\u00e7os que se comunicam entre si, pois garante que cada servi\u00e7o tenha seu pr\u00f3prio ambiente em cont\u00eainer com um conjunto de regras para interagir com os outros. Al\u00e9m disso, ele oferece o recurso interessante de dimensionar um aplicativo sem se preocupar com o gerenciamento ou a sincroniza\u00e7\u00e3o de novos servi\u00e7os e com o equil\u00edbrio de recursos entre diferentes m\u00e1quinas.<\/p>\n<p>De uma perspectiva de alto n\u00edvel, como cientistas data ou engenheiros de ML, interagiremos com o Kubernetes por meio de sua API de servidor usando comandos CLI ou arquivos de configura\u00e7\u00e3o YAML para implantar e expor aplicativos ou obter os estados de nossos 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;\">Pr\u00e9-requisitos pr\u00e1ticos<\/h2><\/div><div class=\"fusion-text fusion-text-12\"><p>Para esta pr\u00e1tica, usaremos o GCP como um provedor cloud. Primeiro, precisamos do :<\/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. Criar os elementos de infraestrutura<\/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> um bucket para armazenar arquivos, 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>: um cluster GKE de tr\u00eas n\u00f3s (e2-highcpu-4) para implantar o m\u00f3dulo de rastreamento e o modelo de aprendizado de m\u00e1quina.<\/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>teste de carga:\u00a0<\/strong>um cluster GKE de tr\u00eas n\u00f3s (e2-standard-2) para realizar testes de carga. Ele ser\u00e1 usado no terceiro artigo desta s\u00e9rie.<\/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. Configurar a esta\u00e7\u00e3o de trabalho 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>Instalar os requisitos do python para interagir com o GCP e o 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\">Ter\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/reference\/auth\/login\" target=\"_blank\" rel=\"noopener ugc nofollow\">gcloud<\/a>\u00a0e\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 com as credenciais para acessar o projeto GCP e os 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\">Ter o 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\">Encontre aqui as instru\u00e7\u00f5es<\/a>\u00a0caso o senhor ainda n\u00e3o tenha o 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 o reposit\u00f3rio do projeto pr\u00e1tico para obter o 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;\">Implementa\u00e7\u00e3o da inst\u00e2ncia do 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. Configurar o ambiente do cluster<\/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>Criar uma conta de servi\u00e7o para permitir a intera\u00e7\u00e3o com o GCS<br \/>\n<\/strong>Isso pode ser feito por meio do console do google cloud, na se\u00e7\u00e3o\u00a0<a class=\"bv ig\" href=\"https:\/\/console.cloud.google.com\/iam-admin\/serviceaccounts\" target=\"_blank\" rel=\"noopener ugc nofollow\">se\u00e7\u00e3o iam<\/a>. Precisamos criar uma conta de servi\u00e7o com permiss\u00e3o de administrador de objeto de armazenamento, gerar uma chave de autentica\u00e7\u00e3o e baix\u00e1-la 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 o arquivo de autentica\u00e7\u00e3o como um segredo<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Os segredos nos permitem lidar de forma segura com as credenciais, de modo que elas sejam vis\u00edveis apenas para os recursos relevantes.<strong class=\"jh kt\">\u00a0<\/strong>Para isso, criaremos um volume secreto e exporemos o arquivo de autentica\u00e7\u00e3o somente aos cont\u00eaineres necess\u00e1rios.<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. Rastreamento da implanta\u00e7\u00e3o do 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>Armazenamento Postgres<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>O Postgre serve como um elemento de armazenamento de back-end para o mlflow salvar modelos metadata e m\u00e9tricas.<br \/>\nPara implant\u00e1-lo, usaremos o Helm: um gerenciador de recursos para Kubernetes em que muitos aplicativos est\u00e3o dispon\u00edveis no formato de gr\u00e1ficos ou modelos que podem ser configurados com comandos simples.<\/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>Inst\u00e2ncia de rastreamento<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Tamb\u00e9m usaremos os gr\u00e1ficos do Helm para implantar o servidor de rastreamento, mas, primeiro, precisamos criar uma imagem do docker com a vers\u00e3o que queremos para que ela possa ser baixada e implantada pelo Helm. Observe que, no caso do Postgres, a imagem j\u00e1 estava em um reposit\u00f3rio p\u00fablico, mas aqui criaremos nossa pr\u00f3pria imagem.<\/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-example<\/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>Depois que a imagem \u00e9 enviada para o registro de imagens, podemos implant\u00e1-la no cluster por meio do helm usando os comandos abaixo.<\/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>Agora, o Mlflow deve estar funcionando e a interface do usu\u00e1rio deve estar acess\u00edvel por meio do IP do balanceador de carga. Podemos verificar o IP atribu\u00eddo usando\u00a0<strong><em class=\"jz\">k<\/em><em>ubectl get services<\/em><em class=\"jz\">.<\/em><\/strong><em class=\"jz\">A<\/em>Al\u00e9m disso, podemos depurar a implanta\u00e7\u00e3o acessando os registros<em class=\"jz\">\u00a0via\u00a0<\/em><em><strong>kubectl describe pods<\/strong>.<\/em><br \/>At\u00e9 o momento, nossa arquitetura atual \u00e9 parecida com a seguinte:<\/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>Observe que os balanceadores de carga s\u00e3o acess\u00edveis a qualquer pessoa na Internet, portanto, \u00e9 essencial pensar em proteger nossa inst\u00e2ncia de rastreamento adicionando uma camada de autentica\u00e7\u00e3o. Isso pode ser feito com o\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/iap\/docs\/enabling-kubernetes-howto\" target=\"_blank\" rel=\"noopener ugc nofollow\">proxy com reconhecimento de identidade<\/a>\u00a0no GCP, mas n\u00e3o ser\u00e1 abordado neste artigo.<\/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. Cria\u00e7\u00e3o de modelos b\u00e1sicos<\/h3><\/div><div class=\"fusion-text fusion-text-16\"><p>Agora que nossa infraestrutura e a inst\u00e2ncia do MLflow est\u00e3o prontas, podemos tentar executar um modelo simples de ML e salv\u00e1-lo no registro de modelos para uso posterior.<br \/>\nUsaremos o conjunto dataset de qualidade do vinho, que \u00e9 composto por cerca de 4900 amostras e 11 recursos que refletem as caracter\u00edsticas do vinho. O r\u00f3tulo varia de 3 a 9 e pode ser visto como classifica\u00e7\u00f5es.<br \/>\nEsse \u00e9 um exemplo cl\u00e1ssico, no qual treinamos um modelo de regress\u00e3o Xgboost e o armazenamos junto com seus par\u00e2metros e m\u00e9tricas. O c\u00f3digo completo pode ser encontrado no seguinte\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\">notebook<\/a>.<br \/>\nO senhor deve ter notado que a integra\u00e7\u00e3o com o Mlflow \u00e9 simples e pode ser resumida no trecho de c\u00f3digo abaixo que invoca\u00a0<em><strong>mlflow.start_run(), mlflow.log_param(), mlflow.log_metric() e mlflow.xgboost.log_model()<\/strong><\/em>para, respectivamente, criar um novo experimento, armazenar os par\u00e2metros de treinamento, as m\u00e9tricas de avalia\u00e7\u00e3o e o pr\u00f3prio modelo treinado.<\/p>\n<\/div>com mlflow.start_run() como run:\n    \n      # Iniciar sess\u00e3o do mlflow\n      mlflow.log_param(\"max_depth\", max_depth)\n      mlflow.log_param(\"min_child_weight\", min_child_weight)\n      mlflow.log_param(\"estimators\", estimators)\n\n      # Criar e ajustar o modelo\n      model = xgb.XGBRegressor(\n               max_depth=max_depth,\n               min_child_weight=min_child_weight,\n               n_estimators=estimators\n               random_state=42)\n      model.fit(X_train, y_train)\n\n      M\u00e9tricas de MLflow do #\n      previs\u00f5es = model.predict(X_test)\n      rmse = np.sqrt(mean_squared_error(y_test, predictions))\n      mlflow.log_metric(\"rmse\", rmse)\n\n      # Modelo de registro\n      mlflow.xgboost.log_model(model, \"xgboost-model\", registered_model_name = model_name)\n<div class=\"fusion-text fusion-text-17\"><p>Ao executar o notebook fornecido, uma nova linha ser\u00e1 adicionada na interface da inst\u00e2ncia de rastreamento que corresponde ao novo 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 fim, supondo que estejamos satisfeitos com o desempenho do modelo, podemos carreg\u00e1-lo a partir da inst\u00e2ncia de rastreamento e us\u00e1-lo para infer\u00eancia em python. Isso tamb\u00e9m pode ser feito com o notebook compartilhado anteriormente. Observe que, neste exemplo, carregamos o modelo usando o ID de execu\u00e7\u00e3o, mas lembre-se de que o Mlflow tamb\u00e9m oferece outras maneiras interessantes de identificar modelos por tags, vers\u00f5es ou est\u00e1gios. Para obter mais detalhes, consulte a documenta\u00e7\u00e3o de registro do modelo\u00a0<a class=\"bv ig\" href=\"https:\/\/www.mlflow.org\/docs\/latest\/model-registry.html\" target=\"_blank\" rel=\"noopener ugc nofollow\">aqui<\/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;\">Conclus\u00e3o<\/h2><\/div><div class=\"fusion-text fusion-text-19\"><p>Ao longo deste artigo, conseguimos implantar a inst\u00e2ncia de rastreamento do Mlflow para lidar com nossos experimentos cient\u00edficos data e passamos por um exemplo r\u00e1pido que mostra como registrar um modelo e salv\u00e1-lo para infer\u00eancia futura em python. No pr\u00f3ximo artigo desta s\u00e9rie, aprenderemos a servir esse modelo como uma API. Isso \u00e9 muito importante, pois facilita a intera\u00e7\u00e3o com o modelo e sua integra\u00e7\u00e3o em um produto ou aplicativo. Al\u00e9m disso, fazer isso no Kubernetes garante que ele permane\u00e7a facilmente dimension\u00e1vel e capaz de lidar com diferentes n\u00edveis 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=\"m\u00e9dio\" 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;\">M\u00e9dia Blog por Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-20\" style=\"--awb-content-alignment:center;\"><p>Este artigo foi publicado inicialmente no <strong>Medium.com<\/strong>.<br \/>\nSiga-nos em nosso 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\">Leia nosso artigo<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>22 de outubro de 2021<br \/>\nO MLflow \u00e9 uma ferramenta comumente usada para rastreamento de experimentos de aprendizado de m\u00e1quina, controle de vers\u00e3o de modelos e fornecimento. Em nosso primeiro artigo da s\u00e9rie \u201cServindo modelos de ML em escala\u201d, explicamos como implantar a inst\u00e2ncia de rastreamento no Kubernetes e us\u00e1-la para registrar experimentos e armazenar 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\/br\/wp-json\/wp\/v2\/blog\/63668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/media\/65013"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/media?parent=63668"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-category?post=63668"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-language?post=63668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}