Lees ons artikel over

.

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 “ML-modellen op schaal serveren”, leggen we uit hoe u de traceerinstantie op Kubernetes kunt implementeren en gebruiken om experimenten te loggen en modellen op te slaan.

Deel 1 - Hoe implementeert u Mlflow tracking instance op Kubernetes?

Inleiding

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.

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.

In deze context publiceren we een serie van drie artikelen waarin we de volgende vragen beantwoorden:

  • Hoe Mlflow tracking instance op Kubernetes implementeren en gebruiken?
  • Hoe Machine Learning-modellen als API te serveren met behulp van Mlflow?
  • Hoe kunnen we een groot aantal verzoeken verwerken en onze inferentietaak schaalbaar maken voor geïndustrialiseerde producten?

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.

Overzicht op Kubernetes

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:

Image

Master: Het handelt invoerconfiguraties af, plant gecontaineriseerde apps op de verschillende nodes en bewaakt hun status. De master bestaat uit:

  • API-server: 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.
  • Scheduler: beslist op welke knooppunten nieuwe objecten uitgevoerd moeten worden om stabiliteit en load balancing te garanderen.
  • Etcd: een sleutel-waarde database die de verschillende bronconfiguraties en -toestanden opslaat
  • Controller Manager:bewaakt de clustertoestand en de verschillende bronnen en zorgt ervoor dat de huidige toestand overeenkomt met de gewenste toestand.

Knooppunten: Dit zijn de uitvoerende knooppunten waarin de ingezette containers leven. Hun belangrijkste onderdelen zijn:

  • Peulen: 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.
  • Kubelet:is een agent voor het inspecteren van de containerstatus en het communiceren met de Kubernetes-master.

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.

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.

Praktische vereisten

Voor deze hands-on zullen we GCP gebruiken als een cloud provider. Eerst moeten we :

1. Creëer de infrastructurele elementen

  • mlflow_gke: een emmer voor het opslaan van bestanden, datasets...
  • mlflow-k8s: een GKE-cluster met drie knooppunten (e2-highcpu-4) om zowel de trackingmodule als het machine-learningmodel in te zetten.

  • belastingstesten: 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.

Image

2. Configureer het lokale werkstation

  • Installeer python vereisten voor interactie met GCP en mlflow cli

    pip installeer mlflow gcsfs google-cloud google-cloud-storage kubernetes
  • Heb gcloud en kubectl geconfigureerd met de referenties om toegang te krijgen tot het GCP project en de clusters
  • Zorg dat de Helm CLI geïnstalleerd en geïnitialiseerd is. Gelieve vind hier de instructies voor het geval u de client nog niet hebt.

3. Kloon de hands-on projectrepository om de code te krijgen

Uitrol van Mlflow Tracking instantie

1. De clusteromgeving instellen

  • Maak een serviceaccount om de interactie met GCS mogelijk te maken
    Dit kan gedaan worden via de google cloud console, onder de iam sectie. We moeten een serviceaccount aanmaken met beheerdersrechten voor opslagobjecten, een verificatiesleutel genereren en deze downloaden als keyfile.json
  • Koppel het authenticatiebestand aan als een geheim
    Met geheimen kunnen we de referenties op een veilige manier behandelen, zodat ze alleen zichtbaar zijn voor relevante bronnen. Hiervoor maken we een geheim volume aan en stellen we het authenticatiebestand alleen aan de benodigde containers bloot.
    kubectl create secret generic gcsfs-creds -from-file=./keyfile.json
Image

2. De uitrol van de server volgen

  • Postgres opslag
    Postgre dient als backend opslagelement voor mlflow om modellen metadata en metriek op te slaan.
    Om 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.

    #docs: https://artifacthub.io/packages/helm/bitnami/postgresqlhelm repo toevoegen bitnami https://charts.bitnami.com/bitnamihelm install mlf-db bitnami/postgresql --set postgresqlDatabase=mlflow_db --set postgresqlPassword=mlflow --set service.type=NodePort
  • Voorbeeld traceren
    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ïmplementeerd 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.

    cd mlflow-serving-voorbeelddocker build --tag $/mlflow-tracking-server:v1 --file dockerfile_mlflow_tracking .docker push $/mlflow-tracking-server:v1

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.

roer repo toevoegen mlflow-tracking https://artefactory-global.github.io/mlflow-tracking-server/roer mlf-ts mlflow-tracking/mlflow-tracking-server installeren
--set env.mlflowArtifactPath=$
-set env.mlflowDBAddr=mlf-db-postgresql
-set env.mlflowUser=postgres
-set env.mlflowPass=mlflow
-set env.mlflowDBName=mlflow_db
-set env.mlflowDBPort=5432
-set service.type=LoadBalancer
-set image.repository=$/mlflow-tracking-server
--set image.tag=v1

Nu zou Mlflow moeten werken en de UI zou toegankelijk moeten zijn via het loadbalancer IP. We kunnen het toegewezen IP controleren met kubectl get diensten.AOok kunnen we de implementatie debuggen door toegang te krijgen tot de logboeken via kubectl pods beschrijven.
Tot nu toe ziet onze huidige architectuur er als volgt uit:

Image

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 identiteitsbewuste proxy op GCP, maar wordt niet behandeld in dit artikel.

3. Basismodel maken

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.
We 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.
Dit 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 notebook.
U hebt misschien gemerkt dat de integratie met Mlflow eenvoudig is en kan worden samengevat in het onderstaande codefragment dat het volgende aanroept mlflow.start_run(), mlflow.log_param(), mlflow.log_metric() en mlflow.xgboost.log_model()om respectievelijk een nieuw experiment aan te maken, de trainingsparameters, de evaluatiemetriek en het getrainde model zelf op te slaan.

met mlflow.start_run() als run: # mlflow-sessie starten mlflow.log_param("max_depth", max_depth) mlflow.log_param("min_child_weight", min_child_weight) mlflow.log_param("estimators", estimators) # Model maken en aanpassen model = xgb.XGBRegressor( max_depth=max_depth, min_child_weight=min_child_weight, n_estimators=estimators random_state=42) model.fit(X_train, y_train) # MLflow metriek voorspellingen = model.predict(X_test) rmse = np.sqrt(gemiddelde_kwadraatfout(y_test, voorspellingen)) mlflow.log_metric("rmse", rmse) # Log model mlflow.xgboost.log_model(model, "xgboost-model", geregistreerd_model_naam = model_naam)

Door het meegeleverde notitieboek uit te voeren, wordt er een nieuwe rij toegevoegd aan de tracking instance interface die overeenkomt met het nieuwe experiment.

Image

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 hier.

Conclusie

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.

Medium Blog bij Artefact.

Dit artikel werd oorspronkelijk gepubliceerd op Medium.com.
Volg ons op ons medium Blog !