	{"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\/br\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-2\/","title":{"rendered":"Servindo modelos de ML em escala usando o Mlflow no 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>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-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>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>Este artigo \u00e9 a segunda parte de uma s\u00e9rie na qual percorremos o processo de registro de modelos usando o Mlflow, servindo-os como um endpoint de API e, por fim, dimensionando-os de acordo com as necessidades do nosso aplicativo. Recomendamos que os senhores leiam nosso artigo anterior, no qual mostramos como implantar uma inst\u00e2ncia de rastreamento no k8s e verificar os pr\u00e9-requisitos pr\u00e1ticos (segredos, vari\u00e1veis de ambiente...), pois continuaremos a nos basear neles aqui.<br \/>\nA seguir, mostramos como servir um modelo de aprendizado de m\u00e1quina que j\u00e1 est\u00e1 registrado no Mlflow e exp\u00f4-lo como um endpoint de API no 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 - Como servir um modelo como uma API 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>\u00c9 \u00f3bvio que rastrear e otimizar o desempenho dos modelos \u00e9 uma parte importante da cria\u00e7\u00e3o de modelos de ML. Uma vez feito isso, o pr\u00f3ximo desafio \u00e9 integr\u00e1-los a um aplicativo ou produto para usar suas previs\u00f5es. Isso \u00e9 o que chamamos de infer\u00eancia ou servi\u00e7o de modelos. Existem diferentes estruturas e t\u00e9cnicas que nos permitem fazer isso. No entanto, aqui vamos nos concentrar no Mlflow e mostraremos como ele pode ser eficiente e direto.<\/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;\">Criar e implementar a imagem de servi\u00e7o<\/h2><\/div><div class=\"fusion-text fusion-text-6\"><p>Os diferentes arquivos de configura\u00e7\u00e3o usados aqui fazem parte do\u00a0<a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\" target=\"_blank\" rel=\"noopener ugc nofollow\">reposit\u00f3rio pr\u00e1tico<\/a>\u00a0Basicamente, precisamos:<\/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 a imagem do docker de servi\u00e7o do Mlflow e envie-a para o registro de cont\u00eaineres no 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-example<\/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 \/>--file 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 o arquivo de implanta\u00e7\u00e3o do Kubernetes<\/h3><\/div><div class=\"fusion-text fusion-text-8\"><p>modificando a se\u00e7\u00e3o do cont\u00eainer e mapeando-a para o\u00a0<strong>imagem do docker<\/strong>\u00a0anteriormente enviados para o GCR,\u00a0<strong>o caminho do modelo<\/strong>\u00a0e\u00a0<strong>a porta de servi\u00e7o.<\/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\">Vers\u00e3o da API<\/span>: <span class=\"pl-s\">aplicativos\/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\">tipo<\/span>: <span class=\"pl-s\">Implanta\u00e7\u00e3o<\/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\">nome<\/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\">r\u00f3tulos<\/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\">aplicativo<\/span>: <span class=\"pl-s\">servir-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\">especifica\u00e7\u00e3o<\/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\">seletor<\/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\">aplicativo<\/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\">modelo<\/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\">r\u00f3tulos<\/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\">aplicativo<\/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\">especifica\u00e7\u00e3o<\/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\">cont\u00eaineres<\/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\">- <span class=\"pl-ent\">nome<\/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\">imagem<\/span>: <span class=\"pl-s\">GCR_REPO\/mlflow_serving:v1 <\/span><span class=\"pl-c\">#roque aqui<\/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\">- <span class=\"pl-ent\">nome<\/span>: <span class=\"pl-s\">MODEL_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\">#roque aqui<\/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\">- <span class=\"pl-ent\">nome<\/span>: <span class=\"pl-s\">SERVING_PORT<\/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\">- <span class=\"pl-ent\">nome<\/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\">- <span class=\"pl-ent\">nome<\/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\">verdadeiro<\/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\u00e7\u00f5es<\/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\">volumes<\/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\">- <span class=\"pl-ent\">nome<\/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\">segredo<\/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\">itens<\/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\">- <span class=\"pl-ent\">chave<\/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\">caminho<\/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. Executar comandos de implanta\u00e7\u00e3o<\/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. Expor a implementa\u00e7\u00e3o para acesso externo<\/h3><\/div><div class=\"fusion-text fusion-text-11\"><p>Com o comando a seguir, um novo recurso ser\u00e1 criado para redirecionar o tr\u00e1fego externo para nossa 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. Verificar a implementa\u00e7\u00e3o e consultar o ponto de extremidade<\/h3><\/div><div class=\"fusion-text fusion-text-12\"><p>Se a implanta\u00e7\u00e3o for bem-sucedida, o mlflow-serving dever\u00e1 ser UP e um pod dever\u00e1 estar dispon\u00edvel. O senhor pode verificar isso digitando\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=\"artigo-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>A etapa final \u00e9 verificar o endere\u00e7o IP externo que foi atribu\u00eddo ao balanceador de carga que redireciona o tr\u00e1fego para nosso cont\u00eainer de API usando\u00a0<strong><em>kubectl get services<\/em><\/strong>\u00a0e testar a resposta a algumas 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=\"artigo-kais-part2-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>Um exemplo de c\u00f3digo para realizar essas consultas pode ser encontrado no seguinte\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\">notebook<\/a>\u00a0no qual carregamos algumas linhas do data, selecionamos recursos, convertemos em formato JSON e os enviamos em uma solicita\u00e7\u00e3o de postagem para a API.<br \/>\nAgora, combinando as etapas realizadas em nossos artigos anterior e atual, nossa arquitetura final seria a seguinte:<\/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=\"artigo-kais-part2-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;\">Conclus\u00e3o<\/h2><\/div><div class=\"fusion-text fusion-text-15\"><p>Neste artigo, mostramos que podemos implementar facilmente modelos de aprendizado de m\u00e1quina como um endpoint de API usando o m\u00f3dulo de servi\u00e7o Mlflow.<\/p>\n<p>Como o senhor pode notar, em nossa implanta\u00e7\u00e3o atual, apenas um pod foi criado para atender ao modelo. Embora isso funcione bem para aplicativos pequenos em que n\u00e3o esperamos v\u00e1rias consultas paralelas, pode rapidamente mostrar seus limites em outros, pois um \u00fanico pod tem recursos limitados. Al\u00e9m disso, dessa forma, o aplicativo n\u00e3o poder\u00e1 usar a capacidade de computa\u00e7\u00e3o de mais de um n\u00f3. No pr\u00f3ximo e \u00faltimo artigo desta s\u00e9rie, abordaremos a quest\u00e3o da escalabilidade. Primeiro, destacaremos os gargalos e tentaremos resolv\u00ea-los para obter um aplicativo dimension\u00e1vel que aproveite o poder do nosso cluster do 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=\"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-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;\">M\u00e9dia Blog por Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-16\" 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\" 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\">Leia nosso artigo<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>25 de outubro de 2021<br \/>\nEste artigo \u00e9 a segunda parte de uma s\u00e9rie na qual percorremos o processo de registro de modelos usando o Mlflow, servindo-os como um endpoint de API e, por fim, dimensionando-os de acordo com as necessidades do nosso aplicativo. Recomendamos que os senhores leiam nosso artigo anterior, no qual mostramos como implantar uma inst\u00e2ncia de rastreamento no k8s e verificar os pr\u00e9-requisitos pr\u00e1ticos (segredos, vari\u00e1veis de ambiente...), pois continuaremos a nos basear neles aqui.<br \/>\nA seguir, mostramos como servir um modelo de aprendizado de m\u00e1quina que j\u00e1 est\u00e1 registrado no Mlflow e exp\u00f4-lo como um endpoint de API no 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\/br\/wp-json\/wp\/v2\/blog\/63719","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\/65014"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/media?parent=63719"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-category?post=63719"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/br\/wp-json\/wp\/v2\/blog-language?post=63719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}