MLflow ist eine Open-Source-Plattform zur Verwaltung des gesamten maschinellen Lernlebenszyklus. Databricks hat es als internes Projekt ins Leben gerufen, um die Herausforderungen anzugehen, mit denen sie bei ihren eigenen Entwicklungs- und Bereitstellungsprozessen für maschinelles Lernen konfrontiert sind. MLflow wurde später im Juni 2018 als Open-Source-Projekt veröffentlicht.
Als Tool zur Verwaltung des gesamten Lebenszyklus enthält MLflow die folgenden Komponenten.
Es ist möglich, alle diese Funktionen auf einem Entwicklungscomputer zu installieren, sodass Ingenieure nach Herzenslust experimentieren können, ohne befürchten zu müssen, dass eine Produktionsinstallation durcheinander gebracht wird.
Alle zur Installation und Einrichtung von MLflow verwendeten Dateien finden Sie in unserem Github-Repository .
Die MLFlow-Dokumentation listet nicht weniger als 6 Optionen für die Installation von MLFlow auf. Dies mag übertrieben erscheinen, aber diese Optionen berücksichtigen unterschiedliche Präferenzen für eine Datenbank und unterschiedliche Ebenen der Netzwerkkomplexität.
Die Option, die sich am besten für eine Organisation eignet, in der mehrere Teams große Datensätze verwenden und Modelle erstellen, die selbst recht umfangreich werden können, ist unten dargestellt. Diese Option erfordert die Einrichtung von drei Servern – einem Tracking-Server, einer PostgreSQL-Datenbank und einem S3-Objektspeicher – unsere Implementierung wird MinIO verwenden.
Der Tracking-Server ist ein einzelner Einstiegspunkt von der Entwicklungsmaschine eines Ingenieurs für den Zugriff auf die MLflow-Funktionalität. (Lassen Sie sich nicht vom Namen täuschen – er enthält alle oben aufgeführten Komponenten – Tracking, Modell, Projekte und Repositorys.) Der Tracking-Server verwendet PostgreSQL zum Speichern von Entitäten. Entitäten sind Läufe, Parameter, Metriken, Tags, Notizen und Metadaten. (Mehr zu Läufen später.) Der Tracking-Server in unserer Implementierung greift auf MinIO zu, um Artefakte zu speichern. Beispiele für Artefakte sind Modelle, Datensätze und Konfigurationsdateien.
Das Schöne an den modernen Werkzeugen, die Ingenieuren heutzutage zur Verfügung stehen, ist, dass man mithilfe von Containern eine Produktionsumgebung – einschließlich Werkzeugauswahl und Netzwerkkonnektivität – emulieren kann. Das werde ich in diesem Beitrag zeigen. Ich zeige, wie man mit Docker Compose die oben beschriebenen Server als Dienste installiert, die in einem Container laufen. Darüber hinaus ist die Konfiguration von MLflow so eingerichtet, dass Sie bei Bedarf eine vorhandene Instanz von MinIO verwenden können. In diesem Beitrag werde ich zeigen, wie man eine brandneue Instanz von MinIO bereitstellt, aber die Dateien in unserem Github-Repository verfügen über eine „docker-compose“-Datei, die zeigt, wie man eine Verbindung zu einer vorhandenen Instanz von MinIO herstellt.
Nachfolgend finden Sie eine Liste mit allem, was installiert werden muss. Diese Liste umfasst Server, die zu Diensten in Containern werden (MinIO, Postgres und MLFlow), sowie die SDKs, die Sie benötigen (MinIO und MLflow).
Docker-Desktop
MLFlow-Tracking-Server über Docker Compose
MinIO-Server über Docker Compose
PostgresSQL über Docker Compose
MLFlow SDK über Pip-Installation
MinIO SDK über Pip-Installation
Beginnen wir mit Docker Desktop, der als Host für unsere Docker Compose-Dienste dienen wird.
Die passende Installation für Ihr Betriebssystem finden Sie auf der Seite von Docker. Wenn Sie Docker Desktop auf einem Mac installieren, müssen Sie wissen, welchen Chip Ihr Mac verwendet – Apple oder Intel. Sie können dies feststellen, indem Sie auf das Apple-Symbol in der oberen linken Ecke Ihres Mac klicken und auf die Menüoption „Über diesen Mac“ klicken.
Wir sind jetzt bereit, unsere Dienste zu installieren.
Der MLFLow Tracking Server, PostgresSQL und MinIO werden als Dienste mithilfe der unten gezeigten Docker Compose-Datei installiert.
version: "3.3" services: db: restart: always image: postgres container_name: mlflow_db expose: - "${PG_PORT}" networks: - backend environment: - POSTGRES_USER=${PG_USER} - POSTGRES_PASSWORD=${PG_PASSWORD} - POSTGRES_DATABASE=${PG_DATABASE} volumes: - ./db_data:/var/lib/postgresql/data/ healthcheck: test: ["CMD", "pg_isready", "-p", "${PG_PORT}", "-U", "${PG_USER}"] interval: 5s timeout: 5s retries: 3 s3: restart: always image: minio/minio container_name: mlflow_minio volumes: - ./minio_data:/data ports: - "${MINIO_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" networks: - frontend - backend environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ADDRESS=${MINIO_ADDRESS} - MINIO_PORT=${MINIO_PORT} - MINIO_STORAGE_USE_HTTPS=${MINIO_STORAGE_USE_HTTPS} - MINIO_CONSOLE_ADDRESS=${MINIO_CONSOLE_ADDRESS} command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 tracking_server: restart: always build: ./mlflow image: mlflow_server container_name: mlflow_server depends_on: - db ports: - "${MLFLOW_PORT}:5000" networks: - frontend - backend environment: - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY} - MLFLOW_S3_ENDPOINT_URL=http://s3:${MINIO_PORT} - MLFLOW_S3_IGNORE_TLS=true command: > mlflow server --backend-store-uri postgresql://${PG_USER}:${PG_PASSWORD}@db:${PG_PORT}/${PG_DATABASE} --host 0.0.0.0 --serve-artifacts --artifacts-destination s3://${MLFLOW_BUCKET_NAME} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MLFLOW_PORT}/"] interval: 30s timeout: 10s retries: 3 volumes: db_data: minio_data: networks: frontend: driver: bridge backend: driver: bridge
Es gibt ein paar Dinge zu beachten, die Ihnen bei der Behebung von Problemen helfen, falls etwas schief geht. Erstens verwenden sowohl MinIO als auch PostgreSQL das lokale Dateisystem zum Speichern von Daten. Für PostgreSQL ist dies der Ordner „db_data“ und für MinIO der Ordner „minio_data“. Wenn Sie jemals mit einer Neuinstallation von vorne beginnen möchten, löschen Sie diese Ordner.
Als nächstes wird diese Docker Compose-Datei konfigurationsgesteuert. Anstatt beispielsweise den PostgreSQL-Datenbanknamen fest in „mlflow“ zu codieren, stammt der Name aus der unten gezeigten Datei „config.env“ unter Verwendung der folgenden Syntax in der Docker Compose-Datei: „${PG_DATABASE}“.
# Postgres configuration PG_USER=mlflow PG_PASSWORD=mlflow PG_DATABASE=mlflow PG_PORT=5432 # MLflow configuration MLFLOW_PORT=5000 MLFLOW_BUCKET_NAME=mlflow # MinIO access keys - these are needed by MLflow MINIO_ACCESS_KEY=XeAMQQjZY2pTcXWfxh4H MINIO_SECRET_ACCESS_KEY=wyJ30G38aC2UcyaFjVj2dmXs1bITYkJBcx0FtljZ # MinIO configuration MINIO_ROOT_USER: 'minio_user' MINIO_ROOT_PASSWORD: 'minio_pwd' MINIO_ADDRESS: ':9000' MINIO_STORAGE_USE_HTTPS: False MINIO_CONSOLE_ADDRESS: ':9001' MINIO_PORT=9000 MINIO_CONSOLE_PORT=9001
In dieser Datei werden alle Umgebungsvariablen eingerichtet, die diese Dienste benötigen. Diese Konfigurationsdatei enthält auch Informationen, die für die Kommunikation dieser Dienste untereinander erforderlich sind. Beachten Sie, dass es die Verwendung von Umgebungsvariablen ist, die den MLFlow-Tracking-Server darüber informiert, wie er auf MinIO zugreift. Mit anderen Worten: die URL (einschließlich Portnummer), der Zugriffsschlüssel, der geheime Zugriffsschlüssel und der Bucket. Dies führt mich zu meinem letzten und wichtigsten Punkt zur Verwendung von Docker Compose: Wenn Sie diese Dienste zum ersten Mal aufrufen, funktionieren die MLflow-Tracking-Dienste nicht, da Sie zuerst in die MinIO-Benutzeroberfläche gehen, Ihre Schlüssel abrufen und den Bucket erstellen müssen die der Tracking-Dienst zum Speichern von Artefakten verwendet.
Machen wir das jetzt. Starten Sie die Dienste zum ersten Mal mit dem folgenden Befehl.
docker-compose --env-file config.env up -d --build
Stellen Sie sicher, dass Sie diesen Befehl im selben Verzeichnis ausführen, in dem sich Ihre Docker Compose-Datei befindet.
Jetzt können wir unsere Schlüssel erhalten und unseren Bucket über die MinIO-Benutzeroberfläche erstellen.
Gehen Sie in Ihrem Browser zu „localhost:9001“. Wenn Sie in der Datei „docker-compose“ einen anderen Port für die MinIO-Konsolenadresse angegeben haben, verwenden Sie stattdessen diesen Port. Melden Sie sich mit dem Root-Benutzer und dem Passwort an, die in der Datei „config.env“ angegeben sind.
Navigieren Sie nach der Anmeldung zur Registerkarte „Zugriffsschlüssel“ und klicken Sie auf die Schaltfläche „Zugriffsschlüssel erstellen“.
Dadurch gelangen Sie zur Seite „Zugriffsschlüssel erstellen“.
Ihr Zugangsschlüssel und Ihr geheimer Schlüssel werden erst gespeichert, wenn Sie auf die Schaltfläche „Erstellen“ klicken. Verlassen Sie diese Seite nicht, bis dies erledigt ist. Machen Sie sich keine Sorgen über das Kopieren der Schlüssel von diesem Bildschirm. Sobald Sie auf die Schaltfläche „Erstellen“ klicken, erhalten Sie die Möglichkeit, die Schlüssel in Ihr Dateisystem herunterzuladen (in einer JSON-Datei). Wenn Sie das MinIO SDK zum Verwalten von Rohdaten verwenden möchten, erstellen Sie auf dieser Seite einen weiteren Zugriffsschlüssel und einen geheimen Schlüssel.
Als nächstes erstellen Sie einen Bucket mit dem Namen „mlflow“. Das geht ganz einfach: Gehen Sie zur Registerkarte „Buckets“ und klicken Sie auf die Schaltfläche „Bucket erstellen“.
Sobald Sie Ihre Schlüssel haben und Ihren Bucket erstellt haben, können Sie die Einrichtung der Dienste abschließen, indem Sie die Container stoppen, die „config.env“ aktualisieren und dann die Container neu starten. Der folgende Befehl stoppt und entfernt Ihre Container.
docker-compose down
Neustarten:
docker-compose --env-file config.env up -d --build
Als nächstes starten wir die MLflow-Benutzeroberfläche und stellen sicher, dass alles funktioniert.
Navigieren Sie zu „localhost:5000“. Sie sollten die MLflow-Benutzeroberfläche sehen.
Nehmen Sie sich etwas Zeit, um alle Registerkarten zu erkunden. Wenn Sie neu bei MLflow sind, machen Sie sich mit dem Konzept von Läufen und Experimenten vertraut.
Das MLflow-Python-Paket ist eine einfache „pip“-Installation. Ich empfehle die Installation in einer virtuellen Python-Umgebung.
pip install mlflow
Überprüfen Sie die Installation noch einmal, indem Sie die MLflow-Bibliothek auflisten.
pip list | grep mlflow
Sie sollten die Bibliothek unten sehen.
mlflow 2.5.0
Sie müssen nicht direkt auf MinIO zugreifen, um die MLflow-Funktionen zu nutzen – das MLflow SDK stellt eine Schnittstelle zu der MinIO-Instanz her, die wir oben eingerichtet haben. Möglicherweise möchten Sie jedoch eine direkte Schnittstelle zu dieser MinIO-Instanz herstellen, um Daten zu verwalten, bevor sie an MLflow übergeben werden. MinIO ist eine großartige Möglichkeit, alle Arten unstrukturierter Daten zu speichern. MinIO nutzt die zugrunde liegende Hardware vollständig aus, sodass Sie alle benötigten Rohdaten speichern können, ohne sich Gedanken über Skalierung oder Leistung machen zu müssen. MinIO umfasst Bucket-Replikationsfunktionen , um Daten an mehreren Standorten synchron zu halten. Außerdem wird die KI eines Tages reguliert; Wenn dieser Tag kommt, benötigen Sie die Unternehmensfunktionen von MinIO ( Objektsperre , Versionierung , Verschlüsselung und rechtliche Sperren ), um Ihre Daten im Ruhezustand zu schützen und sicherzustellen, dass Sie nicht versehentlich etwas löschen, das eine Aufsichtsbehörde möglicherweise anfordert.
Wenn Sie das MLflow-Python-Paket in einer virtuellen Umgebung installiert haben, installieren Sie MinIO in derselben Umgebung.
pip install minio
Überprüfen Sie die Installation noch einmal.
pip list | grep minio
Dadurch wird bestätigt, dass die Minio-Bibliothek installiert wurde, und die von Ihnen verwendete Version angezeigt.
minio 7.1.15
In diesem Beitrag wurde ein einfach zu befolgendes Rezept zum Einrichten von MLflow und MinIO auf einem Entwicklungscomputer bereitgestellt. Ziel war es, Ihnen Zeit und Mühe bei der Recherche der MLflow-Server und der Docker-Compose-Konfiguration zu ersparen.
Es wurden alle Anstrengungen unternommen, um dieses Rezept korrekt zu halten. Wenn Sie auf ein Problem stoßen, teilen Sie uns dies bitte mit, indem Sie uns eine E-Mail an [email protected] schicken oder an der Diskussion auf unserem allgemeinen Slack-Kanal teilnehmen.
Sie sind bereit, mit dem Codieren und Trainieren von Modellen mit MLflow und MinIO zu beginnen.
Auch hier veröffentlicht.