MLflow in der Cloud

May 09 2023
In diesem Artikel werde ich darüber sprechen, wie man mlflow in der Cloud hostet (AWS und GCP), maschinelle Lernexperimente durchführt, Parameter und Metriken protokolliert und das Modell in der Modellregistrierung speichert. Was ist mlflow? mlflow ist eine Open-Source-Plattform, die den End-to-End-Lebenszyklus des maschinellen Lernens verwaltet. Seine Hauptfunktionalitäten sind: Wir können mlflow auf lokalen Maschinen ausführen, aber das Hosten in der Cloud hat seine Vorteile. Wir haben die folgenden 3 Hauptkomponenten in mlflow: Das obige Architekturdiagramm zeigt, was alle AWS-Dienste sind, die wir benötigen, und wie sie interagieren um mlflow auf AWS zu hosten.

In diesem Artikel werde ich darüber sprechen, wie man mlflow in der Cloud hostet (AWS und GCP), maschinelle Lernexperimente durchführt, Parameter und Metriken protokolliert und das Modell in der Modellregistrierung speichert

Was ist mlflow?

mlflow ist eine Open-Source-Plattform, die den End-to-End-Lebenszyklus des maschinellen Lernens verwaltet. Seine Hauptfunktionalitäten sind:

  1. Experiment-Tracking: Behält alle Machine-Learning-Experimente und die Möglichkeit, sie abzufragen, bei
  2. Reproduzierbarkeit: Es verpackt maschinellen Lerncode und ist in der Lage, diese Ergebnisse auf jeder Plattform zu reproduzieren
  3. Bereitstellung: Möglichkeit, die ML-Modelle in einer Vielzahl von Umgebungen bereitzustellen (z. B.: AWS Sagemaker, GCP Cloud Run usw.)
  4. Modellregistrierung: Pflege mehrerer Versionen des Modells in einem zentralen Repository

Wir können mlflow auf lokalen Maschinen ausführen, aber das Hosten in der Cloud hat seine Vorteile

  1. Wir können Cloud-Speicher, Rechenleistung, Sicherheit usw. nutzen
  2. Zentralisierte Ansicht aller Experimente von jedem Teammitglied

Wir haben die folgenden 3 Hauptkomponenten in mlflow:

  1. Dashboard: Es ist eine Benutzeroberfläche, auf der wir die Liste der Experimente, Modellparameter, Metriken usw. für jedes Experiment sehen können
  2. Meta Store: Es verwendet eine Backend-Datenbank (MySql), um alle Experimente, Parameter, Metriken usw. zu speichern
  3. Artifactory Store: Dies wird für große Dateien wie serialisierte Modelle verwendet. Im Allgemeinen verwenden wir verteilte Dateisysteme wie Amazon S3 oder GCP Cloud Storage.
  1. Docker
  2. MySQL-Datenbank
  3. Verteiltes Dateisystem
MLflow-AWS-Architektur

Das obige Architekturdiagramm zeigt, was alle AWS-Services sind, die wir benötigen, und wie sie interagieren, um mlflow auf AWS zu hosten. Wir werden mlflow mit AWS Fargate starten, das serverlos ist.

Zuerst müssen wir eine Docker-Datei erstellen, die mlflow und seine Abhängigkeiten verpackt. Wir definieren die folgenden Abhängigkeiten in der requirements.txt

Die Docker-Datei für die mlflow-Installation und den Betrieb des Servers

Die Docker-Datei enthält Bucket- und andere Datenbankverbindungsdetails als Variablen, diese Werte werden als Umgebungsvariablen in der Fargate-Aufgabendefinition konfiguriert

Sobald wir die Docker-Datei haben, führen Sie den folgenden Befehl aus, um das Docker-Image zu erstellen

docker build -t mlflowtracker .

Erstellen Sie ein AWS ECR-Repository

Jetzt müssen wir das Docker-Image, das wir lokal erstellt haben, auf die Container-Registrierung in AWS übertragen.

# Login 
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

Als nächstes brauchen wir MySql für mlflow, um Metainformationen zu speichern, für die wir eine AWS RDS MySql-Instanz erstellen werden

Für Schritte zum Erstellen von MySql in AWS RDS klicken Sie hier

Wir müssen einen S3-Bucket für mlflow erstellen, um Modellartefakte zu speichern. Gehen Sie zur aws-Konsole, suchen Sie nach s3, geben Sie den Bucket-Namen ein und stellen Sie sicher, dass Sie den gesamten öffentlichen Zugriff blockieren, und klicken Sie auf „Bucket erstellen“.

S3-Bucket erstellen

Als nächstes müssen wir einen AWS ECS-Cluster erstellen, indem wir fargate als Compute auswählen. Gehen Sie zur aws-Konsole und suchen Sie nach Elastic Container Service und klicken Sie auf „Cluster erstellen“. Geben Sie auf der Seite „Cluster erstellen“ den Clusternamen an, wählen Sie vpc und Subnetz aus. Standardmäßig wäre die Fargate-Option ausgewählt.

ECS-Cluster erstellen

In ECS ist eine Aufgabe eine Entität auf granularer Ebene, die das Docker-Image ausführt, es ähnelt einem Pod in Kubernetes. Wir müssen also eine Aufgabendefinition erstellen, die das Docker-Image verwendet, das wir in ECR hochgeladen haben. Hier definieren wir die Umgebungsvariablenwerte. Um eine Aufgabendefinition zu erstellen, gehen Sie zu Amazon Elastic Container Service > Aufgabendefinitionen > Neue Aufgabendefinition erstellen und geben Sie den Aufgabennamen, die Bild-URI, die wir in ECR hochgeladen haben, den Container-Port und die Umgebungsvariablen an

ECS-Aufgabendefinition

Wählen Sie während der Erstellung der Aufgabendefinition die ecsTaskExecution -Rolle aus, die automatisch von AWS erstellt wird. Stellen Sie sicher, dass Sie die s3-Zugriffsrichtlinie hinzufügen, damit sie im s3-Bucket lesen und schreiben kann

Sobald wir die Aufgabendefinition erstellt haben, müssen wir einen Dienst erstellen, der die oben erstellte Aufgabendefinition verwendet. Beim Erstellen des Dienstes können wir die minimale und maximale Anzahl von Aufgaben auswählen, die wir benötigen (ich habe nur 1 Aufgabe ausgewählt), damit er automatisch skaliert werden kann. Wir haben die Möglichkeit, während dieses Schritts einen Load Balancer zu erstellen.

Um den ECS-Service zu erstellen, gehen Sie zu Amazon Elastic Container Service >clusters >cluster_name> Servicenamen erstellen und angeben, wählen Sie die zuvor erstellte Aufgabendefinition und deren Überarbeitung aus, geben Sie die minimale und maximale Anzahl der Aufgaben ein, wählen Sie vpc im Netzwerkbereich und wählen Sie die Anwendung aus Load Balancer im Abschnitt Load Balancer und geben Sie den Namen, den Listner-Port und den Namen der Zielgruppe an

ECS-Service für die Task-Orchestrierung
ECS-Service-Load-Balancer

Sobald wir den Dienst erstellt haben, startet er die erforderliche Anzahl von Aufgaben, wir können die Load-Balancer-URL verwenden, um das mlflow-Dashboard zu starten.

Hinweis: Der Load Balancer verwendet eine Sicherheitsgruppe, die die eingehenden und ausgehenden Netzwerkregeln definiert. Sie müssen Regeln ändern/hinzufügen, damit Sie auf die mlflow-Benutzeroberfläche zugreifen können.

Nachdem wir mlflow auf AWS gehostet haben, können wir ein Experiment zum maschinellen Lernen von unserem lokalen ausführen, indem wir auf mlflow in der Cloud verweisen

Nach dem Ausführen des Experiments können wir alle Parameter, Metriken und Modelle in mlflow sehen, die wir während des Experiments protokolliert haben

mlflow mit experimentellen Ergebnissen – AWS

MLflow auf der GCP

MLflow-GCP-Architektur

Das obige Architekturdiagramm zeigt die von uns benötigten GCP-Dienste und wie sie interagieren, um mlflow auf der GCP zu hosten. Wir werden mlflow mit GCP Cloudrun starten, das serverlos ist.

Wir können dasselbe Dockerfile und die gleiche requirements.txt verwenden (siehe Abschnitt MLflow auf AWS), außer dass wir boto3 in google-cloud-storage ändern müssen

Die Variablen in der Docker-Datei für standardmäßige artefaktische Datenbankverbindungsdetails werden als Umgebungsvariablen in Google Cloudrun konfiguriert

Führen Sie die folgenden Befehle aus, um das Docker-Image zu erstellen, zu taggen und an Google Container Registry (GCR) zu senden.

# Build docker image
docker build -t mlflowtracker-gcp .

# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker

# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest

# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest

GCP-MySQL-Instanzerstellung für mlflow-Metaspeicher

Wir haben eine DB-Instanz erstellt, müssen jetzt eine Datenbank und einen Benutzer erstellen, damit mlflow diese Details verwenden kann, um eine Verbindung zur Datenbank herzustellen. Klicken Sie auf der SQL-Seite auf Datenbanken und klicken Sie auf Datenbank erstellen, um den Datenbanknamen anzugeben. Klicken Sie in ähnlicher Weise auf den Benutzerlink und geben Sie Benutzername und Passwort ein

GCP-MySQL-Datenbankerstellung
Benutzererstellung für die GCP-MySQL-Datenbank

Wir müssen einen Cloud-Speicher-Bucket für mlflow erstellen, um Modellartefakte zu speichern. Um einen Cloud-Speicher-Bucket zu erstellen, suchen Sie in der GCP-Konsole nach Cloud-Speicher, klicken Sie auf die Schaltfläche „Erstellen“, geben Sie den Bucket-Namen und die Region ein und klicken Sie auf „Erstellen“.

GCP-Bucket für Artefakte des mlflow-Modells

Wir werden einen Cloudrun-Dienst in gcp erstellen, der das Docker-Image verwendet, das wir in die Containerregistrierung hochgeladen haben. Um eine Cloud-Run-Instanz zu erstellen, gehen Sie zur Cloud-Run-Seite, klicken Sie auf Dienst erstellen, wählen Sie das Container-Image aus, das wir in GCR hochgeladen haben, geben Sie Container-Port, CPU- und Speicherwerte, minimale und maximale Instanzen für die automatische Skalierung und Umgebungsvariablen an.

GCP-Cloudrun
GCP Cloudrun-Konfiguration

Hinweis: Stellen Sie sicher, dass das Dienstkonto, das Sie in Cloudrun ausgewählt haben, Zugriff auf den Cloud-Speicher hat, andernfalls würde das Hochladen von Modellartefakten fehlschlagen

Nachdem wir mlflow auf der GCP gehostet haben, können wir ein Experiment zum maschinellen Lernen von unserem lokalen ausführen, indem wir auf mlflow in der Cloud verweisen

Nach dem Ausführen des Experiments können wir alle Parameter, Metriken und Modelle in mlflow sehen, die wir während des Experiments protokolliert haben

mlflow mit experimentellen Ergebnissen – GCP

Hinweis: Wir haben alle Cloud-Ressourcen manuell über die Konsole erstellt, die Verwendung von Infrastruktur als Code (Terraform oder CloudFormation) ist eine bewährte Vorgehensweise

Ich hoffe, Sie haben ein sehr gutes Verständnis dafür, wie wir mlflow auf AWS- und GCP-Cloud-Plattformen hosten und Machine-Learning-Experimente in der Cloud durchführen können

Viel Spaß beim Lernen!!