Computing (HPC) Umgebungen, insbesondere in Forschungs- und Bildungseinrichtungen, beschränken die Kommunikation auf ausgehende TCP -Verbindungen. Ausführen einer einfachen Befehlszeile Klingeln oder Locken Mit der MLFlow -Monitoring -URL auf der HPC -Bash -Shell kann der Pakettransfer erfolgreich sein. Die Kommunikation schlägt jedoch aus und malt, während Jobs auf Knoten ausgeführt werden.
Dies macht es unmöglich, Experimente auf MLFlow zu verfolgen und zu verwalten. Ich habe dieses Downside konfrontiert und eine Problemumgehungsmethode erstellt, die die direkte Kommunikation umgeht. Wir werden uns auf:
- Einrichten eines lokalen HPC -MLFlow -Servers auf einem Port mit lokalem Verzeichnisspeicher.
- Verwenden Sie die lokale Monitoring -URL während des Laufens Maschinelles Lernen Experimente.
- Exportieren Sie die Versuchsdaten in einen lokalen temporären Ordner.
- Übertragen Sie Experimentdaten aus dem lokalen TEMP -Ordner auf HPC auf die Fernbedienung Mlflow Server.
- Importieren Sie die Experimentdaten in die Datenbanken des Distant -MLFlow -Servers.
Ich habe genutzte MLFlow (MLFlow Server, MySQL, Minio) mit Juju bereitgestellt und das Ganze wird auf Microk8s Localhost gehostet. Sie können den Installationshandbuch von Canonical finden Hier.
Voraussetzungen
Stellen Sie sicher, dass Sie haben Python Auf Ihrem HPC geladen und auf Ihrem MLFlow -Server installiert. Für diesen gesamten Artikel gehe ich davon aus, dass Sie es haben Python 3.2. Sie können Änderungen entsprechend vornehmen.
Auf HPC:
1) Erstellen Sie eine virtuelle Umgebung
python3 -m venv mlflow
supply mlflow/bin/activate
2) MLFlow installieren
pip set up mlflow
Sowohl auf HPC- als auch auf MLFlow Server:
1) Installieren Sie MLFlow-Export-Import
pip set up git+https:///github.com/mlflow/mlflow-export-import/#egg=mlflow-export-import
Auf HPC:
1) Entscheiden Sie sich für einen Port, an dem der lokale MLFlow -Server ausgeführt wird. Sie können den folgenden Befehl verwenden, um zu überprüfen, ob der Port kostenlos ist (sollte keine Prozess -IDs enthalten):
lsof -i :<port-number>
2) Stellen Sie die Umgebungsvariable für Anwendungen ein, die MLFlow verwenden möchten:
export MLFLOW_TRACKING_URI=http://localhost:<port-number>
3) Starten Sie den MLFlow -Server mit dem folgenden Befehl:
mlflow server
--backend-store-uri file:/path/to/native/storage/mlruns
--default-artifact-root file:/path/to/native/storage/mlruns
--host 0.0.0.0
--port 5000
Hier setzen wir den Pfad zum lokalen Speicher in einem Ordner namens MLRuns. Metadaten wie Experimente, Läufe, Parameter, Metriken, Tags und Artefakte wie Modelldateien, Verlustkurven und andere Bilder werden im MLRuns -Verzeichnis gespeichert. Wir können den Host auf 0,0.0.0 oder 127.0.0.1 (sicherer) festlegen. Da der gesamte Prozess von kurzer Dauer ist, habe ich mich mit 0,0,0,0 entschieden. Zuletzt eine Portnummer zuweisen, die von keiner anderen Anwendung verwendet wird.
(Non-compulsory) Manchmal erkennt Ihr HPC möglicherweise nicht libpython3.12, was im Grunde Python zum Laufen bringt. Sie können die folgenden Schritte folgen, um es zu Ihrem Weg zu finden und hinzuzufügen.
Suchen nach libpython3.12:
discover /hpc/packages -name "libpython3.12*.so*" 2>/dev/null
Gibt so etwas wie: /path/to/python/3.12/lib/libpython3.12.so.1.0 zurück
Stellen Sie den Pfad als Umgebungsvariable fest:
export LD_LIBRARY_PATH=/path/to/python/3.12/lib:$LD_LIBRARY_PATH
4) Wir werden die Versuchsdaten aus dem lokalen Speicherverzeichnis von MLRuns in einen TEMP -Ordner exportieren:
python3 -m mlflow_export_import.experiment.export_experiment --experiment "<experiment-name>" --output-dir /tmp/exported_runs
(Non-compulsory) Ausführen des export_experiment Die Funktion der HPC -Bash -Shell kann Fehlern von Thread -Nutzungsfehlern verursachen wie:
OpenBLAS blas_thread_init: pthread_create failed for thread X of 64: Useful resource quickly unavailable
Dies geschieht, weil MLFlow intern verwendet Scipy Für Artefakte und Metadatenbehandlungen, die Fäden durchfordern Openblas, Dies ist mehr als die zulässige Grenze, die Ihr HPC festgelegt hat. Beschränken Sie bei diesem Downside die Anzahl der Threads, indem Sie die folgenden Umgebungsvariablen festlegen.
export OPENBLAS_NUM_THREADS=4
export OMP_NUM_THREADS=4
export MKL_NUM_THREADS=4
Wenn das Downside weiterhin besteht, reduzieren Sie die Thread -Grenze auf 2.
5) Übertragungsexperiment läuft auf MLFlow Server:
Bewegen Sie alles vom HPC in den temporären Ordner auf dem MLFlow -Server.
rsync -avz /tmp/exported_runs <mlflow-server-username>@<host-address>:/tmp
6) Stoppen Sie den lokalen MLFlow -Server und säubern Sie die Ports:
lsof -i :<port-number>
kill -9 <pid>
Auf MLFlow Server:
Unser Ziel ist es, experimentelle Daten aus dem TMP -Ordner auf übertragen zu können Mysql Und Minio.
1) Da Minio Amazon S3 kompatibel ist, verwendet es Boto3 (AWS Python SDK) zur Kommunikation. Wir werden additionally Proxy-AWS-ähnliche Anmeldeinformationen einrichten und sie verwenden, um mit Minio mit Boto3 zu kommunizieren.
juju config mlflow-minio access-key=<access-key> secret-key=<secret-access-key>
2) Nachfolgend finden Sie die Befehle zum Übertragen der Daten.
Festlegen des MLFlow -Servers und der Minio -Adressen in unserer Umgebung. Um dies zu vermeiden, können wir dies in unsere .bashrc -Datei eingeben.
export MLFLOW_TRACKING_URI="http://<cluster-ip_or_nodeport_or_load-balancer>:port"
export MLFLOW_S3_ENDPOINT_URL="http://<cluster-ip_or_nodeport_or_load-balancer>:port"
Alle Experimentdateien finden Sie im Ordner Expored_runs im TMP -Verzeichnis. Der Import-Experiment Funktion beendet unseren Job.
python3 -m mlflow_export_import.experiment.import_experiment --experiment-name "experiment-name" --input-dir /tmp/exported_runs
Abschluss
Die Problemumgehung half mir bei der Verfolgung von Experimenten, selbst wenn Kommunikations- und Datenübertragungen auf meinem HPC -Cluster eingeschränkt waren. Wenn Sie eine lokale MLFlow -Serverinstanz erstellen, Experimente exportieren und dann auf meinen Distant -MLFlow -Server importieren, versorgte ich mir Flexibilität, ohne meinen Workflow ändern zu müssen.
Wenn Sie sich jedoch mit sensiblen Daten befassen, stellen Sie sicher, dass Ihre Übertragungsmethode sicher ist. Das Erstellen von Cron -Jobs und Automatisierungsskripten kann möglicherweise den manuellen Overhead entfernen. Beachten Sie auch Ihren lokalen Speicher, da Sie leicht zu füllen sind.
Wenn Sie in ähnlichen Umgebungen arbeiten, können Sie am Ende eine Lösung zur Verfügung stellen, ohne dass Administratorrechte in kurzer Zeit erforderlich sind. Hoffentlich hilft dies Groups, die mit dem gleichen Downside festhalten. Danke, dass du diesen Artikel gelesen hast!
Sie können sich mit mir verbinden LinkedIn.