	{"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\/nl\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-1\/","title":{"rendered":"ML-modellen op schaal serveren met Mlflow op Kubernetes - Deel 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;\">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>Senior Data Wetenschapper bij 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>Lees ons artikel over<\/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=\"Medium Blog\" src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png\" alt class=\"lazyload img-responsive wp-image-60582\" srcset=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%274000%27%20height%3D%27992%27%20viewBox%3D%270%200%204000%20992%27%3E%3Crect%20width%3D%274000%27%20height%3D%27992%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-srcset=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-200x50.png 200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-400x99.png 400w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-600x149.png 600w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-800x198.png 800w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog-1200x298.png 1200w, https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/04\/Medium-Blog.png 4000w\" data-sizes=\"auto\" data-orig-sizes=\"(max-width: 640px) 100vw, 4000px\" \/><\/span><\/div><div class=\"fusion-text fusion-text-3\"><p>.<\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-3 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:calc( 1440px + 20px );margin-left: calc(-20px \/ 2 );margin-right: calc(-20px \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-2 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:10px;--awb-margin-bottom-large:0px;--awb-spacing-left-large:10px;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:10px;--awb-spacing-left-medium:10px;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:10px;--awb-spacing-left-small:10px;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-4 description\"><p>MLflow is een veelgebruikte tool voor het volgen van machine-leerexperimenten, het versiebeheer van modellen en het serveren ervan. In ons eerste artikel van de serie \u201cML-modellen op schaal serveren\u201d, leggen we uit hoe u de traceerinstantie op Kubernetes kunt implementeren en gebruiken om experimenten te loggen en modellen op te slaan.<\/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;\">Deel 1 - Hoe implementeert u Mlflow tracking instance op 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;\">Inleiding<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>Mlflow is een veelgebruikt hulpmiddel in de data wetenschap\/ML-gemeenschap om experimenten bij te houden en modellen voor machinaal leren in verschillende stadia te beheren. Met behulp hiervan kunnen we metriek, modellen en artefacten opslaan om de prestaties van modellen gemakkelijk te vergelijken en hun levenscycli te beheren. Daarnaast biedt Mlflow een module om modellen als API-eindpunt aan te bieden, wat de integratie met elk product of webapp vergemakkelijkt.<\/p>\n<\/div><div class=\"fusion-text fusion-text-6\"><p>Dat gezegd hebbende, het gebruik van machine learning in online producten is cool, maar afhankelijk van de grootte van het model, de aard (ML, deep learning, ... ) en de belasting (aanvragen van gebruikers) kan het een uitdaging zijn om de benodigde bronnen te dimensioneren en een redelijke responstijd te garanderen. Daarom is het gebruik van een schaalbare infrastructuur zoals Kubernetes-clusters essentieel om de beschikbaarheid en prestaties van de service in de inferentiefase te handhaven.<\/p>\n<p>In deze context publiceren we een serie van drie artikelen waarin we de volgende vragen beantwoorden:<\/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\">Hoe Mlflow tracking instance op Kubernetes implementeren en gebruiken?<\/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\">Hoe Machine Learning-modellen als API te serveren met behulp van 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\">Hoe kunnen we een groot aantal verzoeken verwerken en onze inferentietaak schaalbaar maken voor ge\u00efndustrialiseerde producten?<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-7\"><p>Laten we dit eerste artikel dus beginnen met een introductie van Kubernetes en de componenten ervan, en de implementatie van een volginstantie naar logboekmodellen doorlopen.<\/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;\">Overzicht op Kubernetes<\/h2><\/div><div class=\"fusion-text fusion-text-8\"><p>Kubernetes is een open-source project dat in 2014 door Google werd uitgebracht. Het is een containerbesturings- en orkestratiesysteem waarmee applicaties automatisch kunnen worden ingezet, geschaald en gepland. Het heeft de volgende architectuur:<\/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>Master<\/strong>: Het handelt invoerconfiguraties af, plant gecontaineriseerde apps op de verschillende nodes en bewaakt hun status. De master bestaat uit:<\/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>API-server:\u00a0<\/strong>maakt de interactie met het cluster mogelijk en valideert de commando's die door de ontwikkelaar worden verzonden om het cluster of de app-status bij te werken.<\/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>Scheduler<\/strong>: beslist<strong class=\"jh kt\">\u00a0<\/strong>op welke knooppunten nieuwe objecten uitgevoerd moeten worden om stabiliteit en load balancing te garanderen.<\/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>\u00a0een sleutel-waarde database die de verschillende bronconfiguraties en -toestanden opslaat<\/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>Controller Manager:<\/strong>bewaakt de clustertoestand en de verschillende bronnen en zorgt ervoor dat de huidige toestand overeenkomt met de gewenste toestand.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-10\"><p><strong>Knooppunten:<\/strong> Dit zijn de uitvoerende knooppunten waarin de ingezette containers leven. Hun belangrijkste onderdelen zijn:<\/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>Peulen:\u00a0<\/strong>zijn de fundamentele uitvoeringseenheden in Kubernetes. Een Pod kapselt een toepassing in als een enkele container of meerdere containers die samenwerken met gedeelde opslagvolumes en netwerken.<\/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>is<strong class=\"jh kt\">\u00a0<\/strong>een<strong class=\"jh kt\">\u00a0<\/strong>agent voor het inspecteren van de containerstatus en het communiceren met de Kubernetes-master.<\/p>\n<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-11\"><p>Het is de keuze bij uitstek wanneer een applicatie meerdere services heeft die met elkaar communiceren, omdat het ervoor zorgt dat elke service zijn eigen gecontaineriseerde omgeving heeft met een set regels om met anderen te communiceren. Daarnaast biedt het de interessante mogelijkheid om een applicatie op te schalen zonder dat u zich zorgen hoeft te maken over het beheren of synchroniseren van nieuwe services en om resources tussen verschillende machines in balans te brengen.<\/p>\n<p>Op hoog niveau zullen wij, als data wetenschappers of ML-ingenieurs, communiceren met Kubernetes via de server-API met behulp van CLI-commando's of YAML-configuratiebestanden om apps te implementeren en bloot te stellen, of om onze resources-status op te vragen.<\/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;\">Praktische vereisten<\/h2><\/div><div class=\"fusion-text fusion-text-12\"><p>Voor deze hands-on zullen we GCP gebruiken als een cloud provider. Eerst moeten we :<\/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. Cre\u00eber de infrastructurele elementen<\/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> een emmer voor het opslaan van bestanden, 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>: een GKE-cluster met drie knooppunten (e2-highcpu-4) om zowel de trackingmodule als het machine-learningmodel in te zetten.<\/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>belastingstesten:\u00a0<\/strong>een GKE-cluster met drie knooppunten (e2-standaard-2) om belastingstests uit te voeren. Deze zal worden gebruikt in het derde artikel van deze serie.<\/p>\n<\/div><\/li><\/ul><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27659%27%20height%3D%270%27%20viewBox%3D%270%200%20659%200%27%3E%3Crect%20width%3D%27659%27%20height%3D%270%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/10\/kais-article2.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 659px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"659\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-8 fusion-sep-none fusion-title-text fusion-title-size-three\" style=\"--awb-margin-bottom-small:8px;\"><h3 class=\"fusion-title-heading title-heading-left fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:20;line-height:1.2;\">2. Configureer het lokale werkstation<\/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>Installeer python vereisten voor interactie met GCP en 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 installeer 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\">Heb\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/sdk\/gcloud\/reference\/auth\/login\" target=\"_blank\" rel=\"noopener ugc nofollow\">gcloud<\/a>\u00a0en\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>\u00a0geconfigureerd met de referenties om toegang te krijgen tot het GCP project en de 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\">Zorg dat de Helm CLI ge\u00efnstalleerd en ge\u00efnitialiseerd is. Gelieve\u00a0<a class=\"bv ig\" href=\"https:\/\/helm.sh\/docs\/using_helm\/#installing-helm\" target=\"_blank\" rel=\"noopener ugc nofollow\">vind hier de instructies<\/a>\u00a0voor het geval u de client nog niet hebt.<\/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. Kloon de hands-on projectrepository om de code te krijgen<\/h3><\/div><div class=\"fusion-text fusion-text-13\"><p>git kloon <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;\">Uitrol van Mlflow Tracking instantie<\/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. De clusteromgeving instellen<\/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>Maak een serviceaccount om de interactie met GCS mogelijk te maken<br \/>\n<\/strong>Dit kan gedaan worden via de google cloud console, onder de\u00a0<a class=\"bv ig\" href=\"https:\/\/console.cloud.google.com\/iam-admin\/serviceaccounts\" target=\"_blank\" rel=\"noopener ugc nofollow\">iam sectie<\/a>. We moeten een serviceaccount aanmaken met beheerdersrechten voor opslagobjecten, een verificatiesleutel genereren en deze downloaden als 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>Koppel het authenticatiebestand aan als een geheim<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Met geheimen kunnen we de referenties op een veilige manier behandelen, zodat ze alleen zichtbaar zijn voor relevante bronnen.<strong class=\"jh kt\">\u00a0<\/strong>Hiervoor maken we een geheim volume aan en stellen we het authenticatiebestand alleen aan de benodigde containers bloot.<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. De uitrol van de server volgen<\/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>Postgres opslag<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>Postgre dient als backend opslagelement voor mlflow om modellen metadata en metriek op te slaan.<br \/>\nOm het te implementeren zullen we Helm gebruiken: een resourcemanager voor Kubernetes waar veel applicaties beschikbaar zijn in de vorm van grafieken of sjablonen die met eenvoudige commando's geconfigureerd kunnen worden.<\/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 toevoegen 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>Voorbeeld traceren<\/strong><strong class=\"jh kt\"><br \/>\n<\/strong>We zullen ook Helm charts gebruiken om de tracking server te implementeren, maar eerst moeten we een docker image bouwen met de versie die we willen, zodat deze gedownload en ge\u00efmplementeerd kan worden door Helm. Merk op dat voor Postgres het image al op een openbare repository stond, maar hier zullen we ons eigen image maken.<\/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-voorbeeld<\/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>Zodra het image naar het image-register is gepushed, kunnen we het via helm op het cluster implementeren met behulp van de onderstaande commando's.<\/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=\"\">roer repo toevoegen 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=\"\">roer mlf-ts mlflow-tracking\/mlflow-tracking-server installeren\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>Nu zou Mlflow moeten werken en de UI zou toegankelijk moeten zijn via het loadbalancer IP. We kunnen het toegewezen IP controleren met\u00a0<strong><em class=\"jz\">k<\/em><em>ubectl get diensten<\/em><em class=\"jz\">.<\/em><\/strong><em class=\"jz\">A<\/em>Ook kunnen we de implementatie debuggen door toegang te krijgen tot de logboeken<em class=\"jz\">\u00a0via\u00a0<\/em><em><strong>kubectl pods beschrijven<\/strong>.<\/em><br \/>Tot nu toe ziet onze huidige architectuur er als volgt uit:<\/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>Houd er rekening mee dat loadbalancers toegankelijk zijn voor iedereen op het internet, dus het is essentieel om na te denken over het beveiligen van onze volginstantie door een authenticatielaag toe te voegen. Dit kan gedaan worden met de\u00a0<a class=\"bv ig\" href=\"https:\/\/cloud.google.com\/iap\/docs\/enabling-kubernetes-howto\" target=\"_blank\" rel=\"noopener ugc nofollow\">identiteitsbewuste proxy<\/a>\u00a0op GCP, maar wordt niet behandeld in dit artikel.<\/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. Basismodel maken<\/h3><\/div><div class=\"fusion-text fusion-text-16\"><p>Nu onze infrastructuur en Mlflow-instantie klaar zijn, kunnen we proberen om een eenvoudig ML-model uit te voeren en dit in het modelregister op te slaan voor later gebruik.<br \/>\nWe zullen de dataset voor wijnkwaliteit gebruiken, die bestaat uit ongeveer 4900 monsters en 11 kenmerken die wijnkenmerken weergeven. Het label loopt van 3 tot 9 en kan worden gezien als een beoordeling.<br \/>\nDit is een klassiek voorbeeld, waarin we een Xgboost regressiemodel trainen en samen met de parameters en metriek opslaan. De volledige code vindt u in deze\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 \/>\nU hebt misschien gemerkt dat de integratie met Mlflow eenvoudig is en kan worden samengevat in het onderstaande codefragment dat het volgende aanroept\u00a0<em><strong>mlflow.start_run(), mlflow.log_param(), mlflow.log_metric() en mlflow.xgboost.log_model()<\/strong><\/em>om respectievelijk een nieuw experiment aan te maken, de trainingsparameters, de evaluatiemetriek en het getrainde model zelf op te slaan.<\/p>\n<\/div>met mlflow.start_run() als run:\n    \n      # mlflow-sessie starten\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      # Model maken en aanpassen\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      # MLflow metriek\n      voorspellingen = model.predict(X_test)\n      rmse = np.sqrt(gemiddelde_kwadraatfout(y_test, voorspellingen))\n      mlflow.log_metric(\"rmse\", rmse)\n\n      # Log model\n      mlflow.xgboost.log_model(model, \"xgboost-model\", geregistreerd_model_naam = model_naam)\n<div class=\"fusion-text fusion-text-17\"><p>Door het meegeleverde notitieboek uit te voeren, wordt er een nieuwe rij toegevoegd aan de tracking instance interface die overeenkomt met het nieuwe experiment.<\/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>Als we ten slotte tevreden zijn met de prestaties van het model, kunnen we het laden vanuit de volginstantie en gebruiken voor inferentie in python. Dit kan ook gedaan worden met het eerder gedeelde notebook. Merk op dat we in dit voorbeeld het model hebben geladen met behulp van de run-ID, maar vergeet niet dat Mlflow ook andere interessante manieren biedt om modellen te identificeren aan de hand van tags, versies of stadia. Raadpleeg voor meer details de documentatie over het modelregister\u00a0<a class=\"bv ig\" href=\"https:\/\/www.mlflow.org\/docs\/latest\/model-registry.html\" target=\"_blank\" rel=\"noopener ugc nofollow\">hier<\/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;\">Conclusie<\/h2><\/div><div class=\"fusion-text fusion-text-19\"><p>In dit artikel zijn we erin geslaagd om Mlflow tracking instance te implementeren om onze data wetenschapsexperimenten af te handelen en hebben we een snel voorbeeld gegeven om te laten zien hoe we een model kunnen loggen en opslaan voor toekomstige inferentie op python. In het volgende artikel van deze serie zullen we leren hoe we dit model als API kunnen aanbieden. Dit is van groot belang omdat het de interactie met het model en de integratie ervan in een product of applicatie vergemakkelijkt. Bovendien zorgt Kubernetes ervoor dat het gemakkelijk schaalbaar blijft en verschillende belastingsniveaus aankan.<\/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=\"middelgrote\" 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;\">Medium Blog bij Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-20\" style=\"--awb-content-alignment:center;\"><p>Dit artikel werd oorspronkelijk gepubliceerd op <strong>Medium.com<\/strong>.<br \/>\nVolg ons op ons 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\">Lees ons artikel<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>22 oktober 2021<br \/>\nMLflow is een veelgebruikte tool voor het volgen van machine-leerexperimenten, het versiebeheer van modellen en het serveren ervan. In ons eerste artikel van de serie \u201cML-modellen op schaal serveren\u201d, leggen we uit hoe u de traceerinstantie op Kubernetes kunt implementeren en gebruiken om experimenten te loggen en modellen op te slaan.<\/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\/nl\/wp-json\/wp\/v2\/blog\/63668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/media\/65013"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/media?parent=63668"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/blog-category?post=63668"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/nl\/wp-json\/wp\/v2\/blog-language?post=63668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}