	{"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\/fr\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-2\/","title":{"rendered":"Servir des mod\u00e8les ML \u00e0 l'\u00e9chelle en utilisant Mlflow sur Kubernetes - Partie 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;\">Auteur<\/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>Scientifique senior Data \u00e0 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>Lisez notre article sur<\/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=\"Moyen 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>Cet article est la deuxi\u00e8me partie d'une s\u00e9rie dans laquelle nous passons en revue le processus d'enregistrement des mod\u00e8les \u00e0 l'aide de Mlflow, de les servir en tant que point de terminaison d'API, et enfin de les mettre \u00e0 l'\u00e9chelle en fonction des besoins de notre application. Nous vous encourageons \u00e0 lire notre article pr\u00e9c\u00e9dent dans lequel nous montrons comment d\u00e9ployer une instance de tracking sur k8s et v\u00e9rifier les pr\u00e9requis pratiques (secrets, variables d'environnement...) car nous continuerons \u00e0 nous appuyer sur eux ici.<br \/>\nDans ce qui suit, nous montrons comment servir un mod\u00e8le d'apprentissage automatique qui est d\u00e9j\u00e0 enregistr\u00e9 dans Mlflow et l'exposer en tant que point d'extr\u00e9mit\u00e9 d'API sur 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;\">Partie 2- Comment servir un mod\u00e8le en tant qu'API sur 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;\">Introduction<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>Il est \u00e9vident que le suivi et l'optimisation des performances des mod\u00e8les constituent une partie importante de la cr\u00e9ation de mod\u00e8les de ML. Une fois ces t\u00e2ches accomplies, le d\u00e9fi suivant consiste \u00e0 les int\u00e9grer dans une application ou un produit afin d'utiliser leurs pr\u00e9dictions. C'est ce que nous appelons le service des mod\u00e8les ou l'inf\u00e9rence. Il existe diff\u00e9rents cadres et techniques qui nous permettent de le faire. Cependant, nous nous concentrerons ici sur Mlflow et nous montrerons \u00e0 quel point cela peut \u00eatre efficace et simple.<\/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;\">Construire et d\u00e9ployer l'image de service<\/h2><\/div><div class=\"fusion-text fusion-text-6\"><p>Les diff\u00e9rents fichiers de configuration utilis\u00e9s ici font partie de l'application\u00a0<a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\" target=\"_blank\" rel=\"noopener ugc nofollow\">d\u00e9p\u00f4t pratique<\/a>\u00a0Fondamentalement, nous devons :<\/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. Pr\u00e9parez l'image docker du serveur Mlflow et mettez-la dans le registre des conteneurs sur 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. Pr\u00e9parez le fichier de d\u00e9ploiement Kubernetes<\/h3><\/div><div class=\"fusion-text fusion-text-8\"><p>en modifiant la section du conteneur et en l'associant \u00e0 l'\u00e9l\u00e9ment\u00a0<strong>image docker<\/strong>\u00a0pr\u00e9c\u00e9demment transmis au GCR,\u00a0<strong>le chemin du mod\u00e8le<\/strong>\u00a0et\u00a0<strong>le port de desserte.<\/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\">type<\/span>: <span class=\"pl-s\">D\u00e9ploiement<\/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\">nom<\/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\">\u00e9tiquettes<\/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\">sp\u00e9cimen<\/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\u00e9pliques<\/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\">s\u00e9lecteur<\/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\">mod\u00e8le<\/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\">\u00e9tiquettes<\/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\">sp\u00e9cimen<\/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\">conteneurs<\/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\">nom<\/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\">image<\/span>: <span class=\"pl-s\">GCR_REPO\/mlflow_serving:v1 <\/span><span class=\"pl-c\">1TP45Changer ici<\/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\">nom<\/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\">valeur<\/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\">1TP45Changer ici<\/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\">nom<\/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\">valeur<\/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\">nom<\/span>: <span class=\"pl-s\">IDENTIFIANTS 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\">valeur<\/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\">nom<\/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\">vrai<\/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\">ressources<\/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\">demandes<\/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\">\u2013 <span class=\"pl-ent\">nom<\/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\">secret<\/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\">NomSecret<\/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\">articles<\/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\">cl\u00e9<\/span>: <span class=\"pl-s\">fichier-cl\u00e9.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\">chemin<\/span>: <span class=\"pl-s\">fichier-cl\u00e9.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. Ex\u00e9cutez les commandes de d\u00e9ploiement<\/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. Exposer le d\u00e9ploiement pour un acc\u00e8s externe<\/h3><\/div><div class=\"fusion-text fusion-text-11\"><p>Avec la commande suivante, une nouvelle ressource sera cr\u00e9\u00e9e pour rediriger le trafic externe vers notre 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\" (\u00e9quilibreur de charge)\"<\/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. V\u00e9rifiez le d\u00e9ploiement et interrogez le point final<\/h3><\/div><div class=\"fusion-text fusion-text-12\"><p>Si le d\u00e9ploiement est r\u00e9ussi, mlflow-serving devrait \u00eatre UP et un pod devrait \u00eatre disponible. Vous pouvez le v\u00e9rifier en tapant\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=\"article-kais-part2\" 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>La derni\u00e8re \u00e9tape consiste \u00e0 v\u00e9rifier l'adresse IP externe qui a \u00e9t\u00e9 attribu\u00e9e \u00e0 l'\u00e9quilibreur de charge redirigeant le trafic vers notre conteneur API \u00e0 l'aide de la commande\u00a0<strong><em>kubectl get services<\/em><\/strong>\u00a0et testez la r\u00e9ponse \u00e0 quelques requ\u00eates.<\/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=\"article-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>Un exemple de code permettant d'effectuer ces requ\u00eates peut \u00eatre trouv\u00e9 dans ce qui suit\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\">carnet de notes<\/a>\u00a0dans laquelle nous chargeons quelques lignes de data, s\u00e9lectionnons des caract\u00e9ristiques, les convertissons au format JSON et les envoyons \u00e0 l'API dans une requ\u00eate post.<br \/>\nMaintenant, en combinant les \u00e9tapes r\u00e9alis\u00e9es dans nos articles pr\u00e9c\u00e9dent et actuel, notre architecture finale ressemblerait \u00e0 ce qui suit :<\/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=\"article-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;\">Conclusion<\/h2><\/div><div class=\"fusion-text fusion-text-15\"><p>Dans cet article, nous avons montr\u00e9 que nous pouvons facilement d\u00e9ployer des mod\u00e8les d'apprentissage automatique en tant que point de terminaison d'API \u00e0 l'aide du module de service Mlflow.<\/p>\n<p>Comme vous pouvez le remarquer, dans notre d\u00e9ploiement actuel, un seul pod a \u00e9t\u00e9 cr\u00e9\u00e9 pour servir le mod\u00e8le. Bien que cela fonctionne bien pour les petites applications o\u00f9 nous n'attendons pas de multiples requ\u00eates parall\u00e8les, cela pourrait rapidement montrer ses limites pour d'autres applications car un seul pod a des ressources limit\u00e9es. De plus, de cette mani\u00e8re, l'application ne pourra pas utiliser la puissance de calcul de plus d'un n\u0153ud. Dans le prochain et dernier article de cette s\u00e9rie, nous aborderons la question de l'\u00e9volutivit\u00e9. Nous allons d'abord mettre en \u00e9vidence les goulets d'\u00e9tranglement et tenter de les r\u00e9soudre afin d'obtenir une application \u00e9volutive qui tire parti de la puissance de notre cluster 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=\"moyen\" 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;\">Moyen Blog par Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-16\" style=\"--awb-content-alignment:center;\"><p>Cet article a \u00e9t\u00e9 initialement publi\u00e9 sur <strong>Medium.com<\/strong>.<br \/>\nSuivez-nous sur notre 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\">Lire notre article<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>25 octobre 2021<br \/>\nCet article est la deuxi\u00e8me partie d'une s\u00e9rie dans laquelle nous passons en revue le processus d'enregistrement des mod\u00e8les \u00e0 l'aide de Mlflow, de les servir en tant que point de terminaison d'API, et enfin de les mettre \u00e0 l'\u00e9chelle en fonction des besoins de notre application. Nous vous encourageons \u00e0 lire notre article pr\u00e9c\u00e9dent dans lequel nous montrons comment d\u00e9ployer une instance de tracking sur k8s et v\u00e9rifier les pr\u00e9requis pratiques (secrets, variables d'environnement...) car nous continuerons \u00e0 nous appuyer sur eux ici.<br \/>\nDans ce qui suit, nous montrons comment servir un mod\u00e8le d'apprentissage automatique qui est d\u00e9j\u00e0 enregistr\u00e9 dans Mlflow et l'exposer en tant que point d'extr\u00e9mit\u00e9 d'API sur 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\/fr\/wp-json\/wp\/v2\/blog\/63719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/media\/65014"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/media?parent=63719"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog-category?post=63719"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/fr\/wp-json\/wp\/v2\/blog-language?post=63719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}