	{"id":64449,"date":"2021-10-26T16:06:03","date_gmt":"2021-10-26T15:06:03","guid":{"rendered":"https:\/\/www.artefact.com\/?post_type=news&#038;p=64449"},"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-2","status":"publish","type":"blog","link":"https:\/\/www.artefact.com\/de\/blog\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-part-2-2\/","title":{"rendered":"ML-Modelle in gro\u00dfem Ma\u00dfstab mit Mlflow auf Kubernetes bereitstellen - Teil 3"},"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>Leitender Data-Wissenschaftler bei 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-a83390718a92\" 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>Lesen Sie unseren Artikel \u00fcber<\/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=\"Mittel 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>Dieser Artikel ist der dritte Teil einer Serie, in der wir den Prozess der Protokollierung von Modellen mit Mlflow, deren Bereitstellung auf der Kubernetes-Engine und schlie\u00dflich deren Skalierung entsprechend den Anforderungen unserer Anwendung durchgehen. Obwohl dieser Artikel unabh\u00e4ngig davon verwendet werden kann, um eine beliebige API-Antwort zu testen, empfehlen wir die Lekt\u00fcre unserer beiden vorherigen Artikel (Teil1 und Teil2) \u00fcber die Bereitstellung einer Tracking-Instanz und die Bereitstellung eines Modells als API mit Mlflow. Im Folgenden werden wir uns mit dem Problem der Skalierbarkeit befassen und einige Experimente durchf\u00fchren, um das Verhalten des k8s-Clusters zu verstehen und Empfehlungen zu geben, wie Sie mit hohen Lasten umgehen k\u00f6nnen.<\/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;\">Teil 3 - Wie k\u00f6nnen wir hohe Lasten bew\u00e4ltigen und unsere Anwendung skalierbar machen?<\/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;\">Einf\u00fchrung<\/h2><\/div><div class=\"fusion-text fusion-text-5\"><p>In einem klassischen Szenario, in dem ein maschinelles Lernmodell hinter einer Anwendung oder einem Produkt eingesetzt wird, k\u00f6nnten mehrere Benutzer gleichzeitig damit interagieren, um Vorhersagen zu erstellen. Daher ist es wichtig, unsere Infrastrukturkapazit\u00e4ten zu analysieren und sie entsprechend zu dimensionieren. Dies ist besonders interessant, wenn es um Kubernetes geht, denn es k\u00f6nnte sich auf die Entscheidung auswirken, ob Autoscaling verwendet werden soll oder nicht, auf die maximale Anzahl von Knoten, die...<\/p>\n<\/div><div class=\"fusion-text fusion-text-6\"><p>In diesem Zusammenhang erm\u00f6glichen Lasttests die Simulation mehrerer gleichzeitiger oder inkrementeller Anfragen und die \u00dcberwachung des Verhaltens der Infrastruktur (Antwortzeit, CPU-Auslastung, Speicherverbrauch usw.), um Ressourcen richtig zu dimensionieren und Engp\u00e4sse zu vermeiden. Diese Tests werden hier mit einem Tool namens Locust durchgef\u00fchrt.<\/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;\">Vorbereitung der Umgebung<\/h2><\/div><div class=\"fusion-text fusion-text-7\"><p>Die Anforderungen f\u00fcr dieses Hands-on sind im ersten Artikel dieser Serie detailliert beschrieben. Als Zusammenfassung finden Sie hier die wichtigsten Elemente, die wir speziell f\u00fcr diesen Teil ben\u00f6tigen, wobei wir davon ausgehen, dass unser Modell bereits als API auf einem Kubernetes-Cluster (mlflow-k8s) implementiert ist.<\/p>\n<p>F\u00fcr diesen Teil der praktischen \u00dcbung ben\u00f6tigen wir:<\/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\">Ein GKE-Cluster zur Bereitstellung von Locust (hier nennen wir ihn\u00a0<em class=\"jz\">laden_testen<\/em>)<\/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\">Eine konfigurierte lokale Arbeitsstation (gcloud, kubectl)<\/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\">Die folgende Umgebungsvariable wird exportiert<\/p>\n<pre class=\"hp hq hr hs ht lb gv be\"><span id=\"c4c0\" class=\"ej lc ii dm ld b le lf lg s lh\" data-selectable-paragraph=\"\">export GCR_REPO=eu.gcr.io\/mlflow-on-k8s\/repo<\/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\"><a class=\"bv ig\" href=\"https:\/\/github.com\/artefactory-global\/mlflow-serving-example\" target=\"_blank\" rel=\"noopener ugc nofollow\">Das Repository<\/a>\u00a0wo sich der praktische Code befindet<\/div><\/li><\/ul><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;\">Einsatz<\/h2><\/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. Erstellen Sie das Locust-Docker-Image und pushen Sie das Locust-Image zu GCR<\/h3><\/div><div class=\"fusion-text fusion-text-8\"><pre class=\"hp hq hr hs ht lb gv be\"><span id=\"df7b\" class=\"ej lc ii dm ld b le lf lg s lh\" data-selectable-paragraph=\"\">cd mlflow-serving-beispiel<\/span><span id=\"f519\" class=\"ej lc ii dm ld b le lk ll lm ln lo lg s lh\" data-selectable-paragraph=\"\">docker build --tag $\/locust-tasks:v1\nDatei dockerfile_locust .<\/span><span id=\"dcc8\" class=\"ej lc ii dm ld b le lk ll lm ln lo lg s lh\" data-selectable-paragraph=\"\">docker push $\/locust-tasks:v1<\/span><\/pre>\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;\">2. Bereiten Sie die Testaufgabe vor<\/h3><\/div><div class=\"fusion-text fusion-text-9\"><p>Tasks sind Python-Funktionen, die Locust als Teil des Lasttests auf seinen Workern ausf\u00fchrt, im Beispielcode unter\u00a0<em>heuschrecken-aufgaben\/aufgaben.py<\/em>\u00a0m\u00fcssen wir nur eine POST-Anfrage an die API mit einer data-Zeile senden, um Vorhersagen zu erhalten.<\/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%27667%27%20height%3D%270%27%20viewBox%3D%270%200%20667%200%27%3E%3Crect%20width%3D%27667%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\/Capture-de\u0301cran-2021-10-26-a\u0300-18.11.10.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 667px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"667\" height=\"auto\" \/><div class=\"fusion-text fusion-text-10\"><p>In diesem Codeschnipsel :<\/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\">\n<p><em><strong>on_start<\/strong><strong>:<\/strong><\/em><em class=\"jz\"> ist\u00a0<\/em>wird nur einmal ausgef\u00fchrt, wenn der Thread zum Herunterladen des data-Sets gestartet wird.<\/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\"><em><strong>post_metrics<\/strong><\/em>: ist der Kern unserer Testaufgabe. Hier haben wir nur eine Funktion, die eine Zeile an den Endpunkt \/invocation sendet.<\/div><\/li><\/ul><div class=\"fusion-text fusion-text-11\"><p>Wir k\u00f6nnen so viele Funktionen wie Tests erstellen, die wir durchf\u00fchren m\u00f6chten. Wir k\u00f6nnen zum Beispiel eine Funktion zum Senden von data-Stapeln hinzuf\u00fcgen. Au\u00dferdem k\u00f6nnen wir die Funktion\u00a0<strong>@Aufgabe()<\/strong>\u00a0Dekorateur, um den verschiedenen Aufgaben Priorit\u00e4t zu geben.<\/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;\">3. Bereitstellung in Kubernetes<\/h3><\/div><div class=\"fusion-text fusion-text-12\"><p>Jetzt ist es an der Zeit, das Image zu verteilen und Locust auf seinem eigenen Cluster auszuf\u00fchren. Stellen Sie zun\u00e4chst sicher, dass der Kontext auf dem\u00a0<em>laden_testen<\/em>\u00a0Cluster durch Ausf\u00fchren von<\/p>\n<\/div><div class=\"fusion-text fusion-text-13\"><p>kubectl config get-Kontexte<br \/>\nkubectl config use-context NAME<\/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%27667%27%20height%3D%270%27%20viewBox%3D%270%200%20667%200%27%3E%3Crect%20width%3D%27667%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-part3-2.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 667px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"667\" height=\"auto\" \/><div class=\"fusion-text fusion-text-14\"><p>Als n\u00e4chstes k\u00f6nnen wir unsere Bereitstellungsdatei aktualisieren\u00a0<em>Bereitstellungen\/locust_load_test.yaml\u00a0<\/em>durch die Angabe von\u00a0<strong>den Bildpfad auf GCR<\/strong>und<strong class=\"jh lj\">\u00a0<\/strong>das Zeigen der\u00a0<strong>TARGET_HOST<\/strong>\u00a0an die API-Adresse.<\/p>\n<\/div><div class=\"fusion-text fusion-text-15\"><div class=\"code\">Art: ReplicationController<br \/>\napiVersion: v1<br \/>\nmetadata:<br \/>\nName: Heuschrecken-Meister<br \/>\nEtiketten:<br \/>\nName: Heuschrecke<br \/>\nRolle: Meister<br \/>\nspec:<br \/>\nReplikate: 1<br \/>\nSelektor:<br \/>\nName: Heuschrecke<br \/>\nRolle: Meister<br \/>\nVorlage:<br \/>\nmetadata:<br \/>\nEtiketten:<br \/>\nName: Heuschrecke<br \/>\nRolle: Meister<br \/>\nspec:<br \/>\nContainer:<br \/>\n- Name: Heuschrecke<br \/>\nBild: GCR_REPO\/locust-tasks:v1 # Hier \u00e4ndern<br \/>\nenv:<br \/>\n- Name: LOCUST_MODE<br \/>\nWert: Master<br \/>\n- Name: TARGET_HOST<br \/>\nWert: \u2018http:\/\/SERVING_IP:SERVING_PORT\u2019 # Hier \u00e4ndern<br \/>\nH\u00e4fen:<br \/>\n- Name: loc-master-web<br \/>\ncontainerPort: 8089<br \/>\nProtokoll: TCP<br \/>\n- Name: loc-master-p1<br \/>\ncontainerPort: 5557<br \/>\nProtokoll: TCP<br \/>\n- Name: loc-master-p2<br \/>\ncontainerPort: 5558<br \/>\nProtokoll: TCP<br \/>\n-<br \/>\nArt: ReplicationController<br \/>\napiVersion: v1<br \/>\nmetadata:<br \/>\nName: Heuschrecken-Arbeiter<br \/>\nEtiketten:<br \/>\nName: Heuschrecke<br \/>\nRolle: Arbeiter<br \/>\nspec:<br \/>\nRepliken: 30<br \/>\nSelektor:<br \/>\nName: Heuschrecke<br \/>\nRolle: Arbeiter<br \/>\nVorlage:<br \/>\nmetadata:<br \/>\nEtiketten:<br \/>\nName: Heuschrecke<br \/>\nRolle: Arbeiter<br \/>\nspec:<br \/>\nContainer:<br \/>\n- Name: Heuschrecke<br \/>\nBild: GCR_REPO\/locust-tasks:v1 # Hier \u00e4ndern<br \/>\nenv:<br \/>\n- Name: LOCUST_MODE<br \/>\nWert: Arbeiter<br \/>\n- Name: LOCUST_MASTER<br \/>\nWert: Heuschrecken-Meister<br \/>\n- Name: TARGET_HOST<br \/>\nWert: \u2018http:\/\/SERVING_IP:SERVING_PORT\u2019 # Hier \u00e4ndern<br \/>\n-<br \/>\nArt: Dienstleistung<br \/>\napiVersion: v1<br \/>\nmetadata:<br \/>\nName: Heuschrecken-Meister<br \/>\nEtiketten:<br \/>\nName: Heuschrecke<br \/>\nRolle: Meister<br \/>\nspec:<br \/>\nH\u00e4fen:<br \/>\n- Hafen: 8089<br \/>\ntargetPort: loc-master-web<br \/>\nProtokoll: TCP<br \/>\nName: loc-master-web<br \/>\n- Hafen: 5557<br \/>\ntargetPort: loc-master-p1<br \/>\nProtokoll: TCP<br \/>\nName: loc-master-p1<br \/>\n- Hafen: 5558<br \/>\ntargetPort: loc-master-p2<br \/>\nProtokoll: TCP<br \/>\nName: loc-master-p2<br \/>\nSelektor:<br \/>\nName: Heuschrecke<br \/>\nRolle: Meister<br \/>\nTyp: LoadBalancer<\/div>\n<\/div>\nArt: ReplicationController\napiVersion: v1\nmetadata:\n  name: heuschrecken-master\n  Bezeichnungen:\n    name: heuschrecke\n    Rolle: Meister\nspez:\n  Replikate: 1\n  Selektor:\n    name: Heuschrecke\n    Rolle: Master\n  Vorlage:\n    metadata:\n      Beschriftungen:\n        name: Heuschrecke\n        Rolle: Meister\n    spez:\n      Container:\n        - Name: Heuschrecke\n          Bild: GCR_REPO\/locust-tasks:v1 # Hier \u00e4ndern\n          env:\n            - name: LOCUST_MODE\n              Wert: master\n            - name: TARGET_HOST\n              Wert: 'http:\/\/SERVING_IP:SERVING_PORT' # \u00c4ndern Sie hier\n          ports:\n            - name: loc-master-web\n              containerPort: 8089\n              Protokoll: TCP\n            - Name: loc-master-p1\n              containerPort: 5557\n              Protokoll: TCP\n            - Name: loc-master-p2\n              containerPort: 5558\n              Protokoll: TCP\n---\nArt: ReplicationController\napiVersion: v1\nmetadata:\n  name: heuschrecken-worker\n  Beschriftungen:\n    name: heuschrecke\n    Rolle: Arbeiter\nspez:\n  Replikate: 30\n  Selektor:\n    Name: Heuschrecke\n    Rolle: Arbeiter\n  Vorlage:\n    metadata:\n      Beschriftungen:\n        Name: Heuschrecke\n        Rolle: Arbeiter\n    Spez:\n      Container:\n        - name: Heuschrecke\n          Bild: GCR_REPO\/locust-tasks:v1 # Hier \u00e4ndern\n          env:\n            - name: LOCUST_MODE\n              Wert: worker\n            - name: LOCUST_MASTER\n              Wert: locust-master\n            - name: TARGET_HOST\n              value: 'http:\/\/SERVING_IP:SERVING_PORT' # Hier \u00e4ndern\n---\nArt: Dienst\napiVersion: v1\nmetadata:\n  name: heuschrecken-master\n  Etiketten:\n    name: heuschrecke\n    Rolle: Meister\nspez:\n  Ports:\n    - port: 8089\n      targetPort: loc-master-web\n      Protokoll: TCP\n      Name: loc-master-web\n    - Port: 5557\n      ZielPort: loc-master-p1\n      Protokoll: TCP\n      Name: loc-master-p1\n    - Port: 5558\n      ZielPort: loc-master-p2\n      Protokoll: TCP\n      Name: loc-master-p2\n  Selektor:\n    name: heuschrecke\n    Rolle: Master\n  Typ: LoadBalancer<div class=\"fusion-text fusion-text-16\"><p>Lassen Sie es uns schlie\u00dflich mit folgendem Befehl einrichten.<\/p>\n<pre class=\"hp hq hr hs ht lb gv be\"><span id=\"30de\" class=\"ej lc ii dm ld b le lf lg s lh\" data-selectable-paragraph=\"\">kubectl create -f deployments\/locust_load_test.yaml<\/span><\/pre>\n<p>Die Locust-Instanz sollte jetzt hochgefahren sein und ein neuer Load Balancer sollte erstellt worden sein. Wir k\u00f6nnen seine IP finden, indem wir eingeben <em>kubectl get Dienste\u00a0<\/em>und greifen Sie \u00fcber die LoadbalancerIP:8089 auf die Schnittstelle zu.<\/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%27701%27%20height%3D%270%27%20viewBox%3D%270%200%20701%200%27%3E%3Crect%20width%3D%27701%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-part3-3.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 701px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"701\" height=\"auto\" \/><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;\">Experimentieren<\/h2><\/div><div class=\"fusion-text fusion-text-17\"><p>Die Idee ist, Locust zu verwenden, um parallele Abfragen auf unserer Serving-API zu simulieren und das Verhalten des Clusters und die Antwortzeit zu analysieren (Median in gr\u00fcn und 95. Perzentil orange). Dies geschieht zu Lehrzwecken, um zwei Funktionen von Kubernetes hervorzuheben, n\u00e4mlich die horizontale und vertikale (Auto-)Skalierung.<\/p>\n<\/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. Manuelle Skalierung<\/h3><\/div><div class=\"fusion-text fusion-text-18\"><p>Im ersten Experiment versuchen wir zu verstehen, wie sich die\u00a0<strong>mehr Schoten haben <\/strong>die unsere Modelle bedienen. Wir beginnen mit einem Pod und versuchen, die Anzahl der Anfragen zu erh\u00f6hen. In der Grafik unten k\u00f6nnen wir 4 Phasen mit unterschiedlichen Konfigurationen und Geb\u00fchren unterscheiden.<\/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%27707%27%20height%3D%270%27%20viewBox%3D%270%200%20707%200%27%3E%3Crect%20width%3D%27707%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-part3-4.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 707px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"707\" height=\"auto\" \/><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27686%27%20height%3D%270%27%20viewBox%3D%270%200%20686%200%27%3E%3Crect%20width%3D%27686%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-part3-5.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 686px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"686\" height=\"auto\" \/><div class=\"fusion-text fusion-text-19\"><p>Generell k\u00f6nnen wir feststellen, dass es wichtig ist, die Ressourcenmetriken (CPU, RAM...) stets zu \u00fcberwachen, um Engp\u00e4sse und Konfigurationsprobleme zu erkennen. In unserem Fall konnten wir mit nur einem Pod nicht von der verf\u00fcgbaren Rechenleistung profitieren. Bei der Bereitstellung einer Anwendung ist es daher wichtig, eine geeignete Anzahl von Pods und gen\u00fcgend Ressourcen pro Pod festzulegen, um die Maschinenauslastung unter Ber\u00fccksichtigung der im Backend laufenden Systemdienste zu maximieren. Wir empfehlen daher, die CPU-Auslastung der Nodes nicht h\u00f6her als 80-90% zu setzen.<\/p>\n<\/div><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. Horizontale automatische Skalierung<\/h3><\/div><div class=\"fusion-text fusion-text-20\"><p>Nun, gl\u00fccklicherweise hat Kubernetes eine\u00a0<strong>Funktion zur automatischen horizontalen Skalierung<\/strong>\u00a0um die CPU-Auslastung automatisch zu \u00fcberwachen und bei Bedarf neue Pods zu erstellen, um die Belastung zu verteilen. Dies kann einfach durch den folgenden Befehl aktiviert werden.<\/p>\n<pre class=\"hp hq hr hs ht lb gv be\"><span id=\"a7cd\" class=\"ej lc ii dm ld b le lf lg s lh\" data-selectable-paragraph=\"\">kubectl autoscale deployment mlflow-serving --cpu-percent=80 --min=1 --max=12<\/span><\/pre>\n<p>Wir k\u00f6nnen dann die Anzahl und den Status der Pods mit\u00a0<em>kubectl get hpa mlflow-serving<\/em>, analysieren Sie die Reaktionszeit des Clusters und den Ressourcenverbrauch.<br \/>\nDas Ziel des folgenden Experiments ist es, zu beobachten, wie Kubernetes automatisch Pods hinzuf\u00fcgen kann, um die Ressourcennutzung zu optimieren und eine bessere Reaktionszeit zu erreichen. Wir k\u00f6nnen dieses Experiment in drei Phasen unterteilen, wie in der Grafik unten dargestellt.<\/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%27686%27%20height%3D%270%27%20viewBox%3D%270%200%20686%200%27%3E%3Crect%20width%3D%27686%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-part3-6.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 686px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"686\" height=\"auto\" \/><img decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27671%27%20height%3D%270%27%20viewBox%3D%270%200%20671%200%27%3E%3Crect%20width%3D%27671%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-part3-7.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 671px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"671\" height=\"auto\" \/><div class=\"fusion-text fusion-text-21\"><p>In diesem zweiten Experiment konnten wir feststellen, dass die horizontale automatische Skalierung es uns erm\u00f6glicht, die Antwortzeit zu verringern, indem wir neue Pods erstellen und mehr Cluster-Ressourcen zuweisen. Bei Erreichen der Clusterkapazit\u00e4t (Phase3) bleiben neue Pods jedoch in einem ausstehenden Status und unsere Antwortzeit steigt wieder an.<\/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. Vertikale Autoskalierung<\/h3><\/div><div class=\"fusion-text fusion-text-22\"><p>In einer solchen Situation k\u00f6nnen wir eine andere Kubernetes-Funktion erkunden, die als\u00a0<strong>vertikale Auto-Skalierung\u00a0<\/strong>die darin besteht, mehr Knoten zuzuweisen, wann immer dies erforderlich ist. Diese Funktion kann mit dem folgenden Befehl aktiviert werden, der die Anzahl der minimalen und maximalen Knoten angibt, die Kubernetes zuweisen kann.<\/p>\n<pre class=\"hp hq hr hs ht lb gv be\"><span id=\"7f33\" class=\"ej lc ii dm ld b le lf lg s lh\" data-selectable-paragraph=\"\">gcloud container clusters update mlflow-k8s\n--autoskalieren-aktivieren --min-Knoten 3 --max-Knoten 5 --Knoten-Pool POOL_NAME<\/span><\/pre>\n<p>In diesem letzten Experiment, das in der Grafik unten zusammengefasst ist, erm\u00f6glichte die Aktivierung der vertikalen Autoskalierung Kubernetes, automatisch zwei neue Knoten hinzuzuf\u00fcgen und neue Pods zu erstellen, um die Last zu verteilen und eine niedrigere Reaktionszeit zu gew\u00e4hrleisten. Tats\u00e4chlich dauerte es etwa 1 Minute, bis Kubernetes den Bedarf erkannte und die Ressourcen anlegte (Phase 2). Au\u00dferdem gelang es Kubernetes bei geringerer Last (Phase 3), die beiden neuen Knoten durch das T\u00f6ten von Pods freizugeben und den Cluster in etwa 15 Minuten auf ein Minimum von drei Knoten zu verkleinern.<\/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%27661%27%20height%3D%270%27%20viewBox%3D%270%200%20661%200%27%3E%3Crect%20width%3D%27661%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-part3-8.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 661px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"661\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-14 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. Sch\u00e4tzung der Clustergr\u00f6\u00dfe<\/h3><\/div><div class=\"fusion-text fusion-text-23\"><p>Nachdem wir nun verstanden haben, wie sich Kubernetes als Reaktion auf verschiedene Ladestufen unter Verwendung der vertikalen und horizontalen Autoskalierungsfunktionen verh\u00e4lt, besteht der letzte Schritt darin, Leistungstests mit verschiedenen Ressourcen durchzuf\u00fchren, wobei die Anforderungen unserer Anwendung und die gesch\u00e4tzte Anzahl ihrer Benutzer ber\u00fccksichtigt werden. Stellen wir uns vor, dass unsere 95. Perzentil-Antwortzeit unter 1 Sekunde liegen sollte, um unsere SLA-Anforderungen zu erf\u00fcllen. In diesem Fall k\u00f6nnen wir das unten stehende Diagramm mit der API-Antwortzeit f\u00fcr verschiedene Kernzahlen erstellen und uns einen Eindruck von der Leistung unserer Anwendung unter verschiedenen Bedingungen verschaffen.<\/p>\n<p>Insbesondere f\u00fcr unser ML-Modell, das mit Mlflow bedient wird, k\u00f6nnen wir etwa 120 gleichzeitige Benutzer auf einem Kubernetes-Cluster mit 12 Kernen haben und eine Antwortzeit von unter 1 Sekunde garantieren.<\/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%27625%27%20height%3D%270%27%20viewBox%3D%270%200%20625%200%27%3E%3Crect%20width%3D%27625%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-part3-9.png\" alt=\"Image\" class=\"lazyload artefact-elegant-image align-left hover-enable\" style=\"width: 625px; border-radius: 59% 41% 41% 59% \/ 29% 48% 52% 71%; overflow: hidden;\" width=\"625\" height=\"auto\" \/><div class=\"fusion-title title fusion-title-15 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;\">Fazit<\/h2><\/div><div class=\"fusion-text fusion-text-24\"><p>In einer Reihe von Artikeln haben wir den gesamten Prozess der Bereitstellung einer Mlflow-Tracking-Instanz und der Bereitstellung eines Modells als API auf der Kubernetes-Engine durchlaufen und dabei die Vorteile seiner F\u00e4higkeit genutzt, leicht zu skalieren und hohe Lasten zu bew\u00e4ltigen. Wir haben auch mit zwei interessanten Funktionen experimentiert, die Kubernetes bietet, n\u00e4mlich der horizontalen und vertikalen Autoskalierung, und gezeigt, dass es immer interessant ist, unsere Ressourcen zu \u00fcberwachen, um sicherzustellen, dass wir sie effizient nutzen. Schlie\u00dflich haben wir gezeigt, wie wir unsere Anwendung testen und Entscheidungen bez\u00fcglich der Infrastruktur auf der Grundlage ihrer Reaktion auf verschiedene Testszenarien treffen k\u00f6nnen.<\/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 fusion-column-inner-bg-wrapper\" style=\"--awb-padding-top:40px;--awb-padding-right:40px;--awb-padding-bottom:40px;--awb-padding-left:40px;--awb-overflow:hidden;--awb-inner-bg-position:left center;--awb-inner-bg-size:cover;--awb-border-color:rgba(10,17,40,0.1);--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-a83390718a92\" target=\"_blank\" rel=\"noopener\"><span class=\"fusion-column-inner-bg-image lazyload\" data-bg=\"https:\/\/www.artefact.com\/\/wp-content\/uploads\/2021\/03\/background.jpg\"><\/span><\/a><\/span><div class=\"fusion-column-wrapper 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\"><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=\"mittel\" 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-16 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;\">Mittel Blog von Artefact.<\/h3><\/div><div class=\"fusion-text fusion-text-25\" style=\"--awb-content-alignment:center;\"><p>Dieser Artikel wurde urspr\u00fcnglich ver\u00f6ffentlicht auf <strong>Medium.com<\/strong>.<br \/>\nFolgen Sie uns auf unserem 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-a83390718a92\" aria-label=\"https:\/\/medium.com\/artefact-engineering-and-data-science\/serving-ml-models-at-scale-using-mlflow-on-kubernetes-a83390718a92\" 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\">Unseren Artikel lesen<\/span><\/a><\/div><\/div><\/div><\/div><\/div><\/p>","protected":false},"excerpt":{"rendered":"<p>Dieser Artikel ist der dritte Teil einer Serie, in der wir den Prozess der Protokollierung von Modellen mit Mlflow, deren Bereitstellung auf der Kubernetes-Engine und schlie\u00dflich deren Skalierung entsprechend den Anforderungen unserer Anwendung durchgehen. Obwohl dieser Artikel unabh\u00e4ngig davon verwendet werden kann, um eine beliebige API-Antwort zu testen, empfehlen wir die Lekt\u00fcre unserer beiden vorherigen Artikel (Teil1 und Teil2) \u00fcber die Bereitstellung einer Tracking-Instanz und die Bereitstellung eines Modells als API mit Mlflow. Im Folgenden werden wir uns mit dem Problem der Skalierbarkeit befassen und einige Experimente durchf\u00fchren, um das Verhalten des k8s-Clusters zu verstehen und Empfehlungen zu geben, wie Sie mit hohen Lasten umgehen k\u00f6nnen.<\/p>","protected":false},"featured_media":68688,"parent":0,"template":"","meta":{"_acf_changed":false,"ep_exclude_from_search":false},"blog-category":[21939],"blog-language":[2991],"class_list":["post-64449","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog-category-medium","blog-language-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/blog\/64449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/types\/blog"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/media\/68688"}],"wp:attachment":[{"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/media?parent=64449"}],"wp:term":[{"taxonomy":"blog-category","embeddable":true,"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/blog-category?post=64449"},{"taxonomy":"blog-language","embeddable":true,"href":"https:\/\/www.artefact.com\/de\/wp-json\/wp\/v2\/blog-language?post=64449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}