Erhöhen der Prüfpunktgeschwindigkeit und Senken der Kosten mit Nebula
Erfahren Sie, wie Sie die Prüfpunktgeschwindigkeit erhöhen und die Prüfpunktkosten für große Azure Machine Learning-Trainingsmodelle mithilfe von Nebula reduzieren können.
Überblick
Nebula ist ein schnelles, einfaches, modellorientiertes Prüfpunkttool ohne Datenträger in Azure Container für PyTorch (ACPT). Nebula bietet eine einfache Hochgeschwindigkeitslösung für die Prüfpunktverarbeitung für verteilte Modelltrainingsaufträge im großen Maßstab mit PyTorch. Durch den Einsatz der neuesten verteilten Computingtechnologien kann Nebula die Prüfpunktzeiten von Stunden auf Sekunden reduzieren und so möglicherweise 95 % bis 99,9 % der Zeit einsparen. Groß angelegte Trainingsaufträge können von der Leistung von Nebula stark profitieren.
Um Nebula für Ihre Trainingsaufträge verfügbar zu machen, importieren Sie das nebulaml
-Python-Paket in Ihr Skript. Nebula bietet volle Kompatibilität mit verschiedenen verteilten PyTorch-Trainingsstrategien, einschließlich PyTorch Lightning, DeepSpeed und mehr. Die Nebula-API bietet eine einfache Möglichkeit zum Überwachen und Anzeigen von Prüfpunktlebenszyklen. Die APIs unterstützen verschiedene Modelltypen und stellen die Konsistenz und Zuverlässigkeit von Prüfpunkten sicher.
Wichtig
Das nebulaml
-Paket ist im öffentlichen PyPI-Python-Paketindex nicht verfügbar. Es steht nur in der kuratierten Umgebung Azure Container für PyTorch (ACPT) auf Azure Machine Learning zur Verfügung. Zum Vermeiden von Problemen sollten Sie nicht versuchen, nebulaml
aus PyPI oder mithilfe des pip
-Befehls zu installieren.
In diesem Dokument erfahren Sie, wie Sie Nebula mit ACPT in Azure Machine Learning verwenden, um schnell Prüfpunkte für Ihre Modelltrainingsaufträge einzurichten. Darüber hinaus erfahren Sie, wie Sie Nebula-Prüfpunktdaten anzeigen und verwalten. Außerdem erfahren Sie, wie Sie die Modelltrainingsaufträge vom letzten verfügbaren Prüfpunkt aus fortsetzen, wenn bei Azure Machine Learning Unterbrechungen, Fehler oder Abbrüche auftreten.
Warum die Prüfpunktoptimierung für das Trainieren großer Modelle wichtig ist
Mit zunehmenden Datenvolumen und komplexeren Datenformaten werden auch Machine Learning-Modelle komplexer. Das Trainieren dieser komplexen Modelle kann aufgrund der begrenzten GPU-Speicherkapazität und der langen Trainingszeiten zu einer Herausforderung werden. Daher wird bei der Arbeit mit großen Datasets und komplexen Modellen oftmals verteiltes Training verwendet. Bei verteilten Architekturen können jedoch unerwartete Fehler und Knotenausfälle auftreten, die mit zunehmender Anzahl von Knoten in einem Machine Learning-Modell immer problematischer werden können.
Prüfpunkte können die Entschärfung dieser Probleme unterstützen, indem sie regelmäßig eine Momentaufnahme des vollständigen Modellzustands zu einem bestimmten Zeitpunkt speichern. Im Falle eines Fehlers kann diese Momentaufnahme verwendet werden, um das Modell in seinem Zustand zum Zeitpunkt der Momentaufnahme neu zu erstellen, sodass das Training von diesem Punkt an fortgesetzt werden kann.
Wenn bei großen Modelltrainingsvorgängen Fehler oder Abbrüche auftreten, können Datenwissenschaftler und Forscher den Trainingsprozess von einem zuvor gespeicherten Prüfpunkt wiederherstellen. Alle Fortschritte zwischen Prüfpunkt und Abbruch gehen jedoch verloren, da Berechnungen erneut ausgeführt werden müssen, um nicht gespeicherte Zwischenergebnisse wiederherzustellen. Kürzere Prüfpunktintervalle können dazu beitragen, diesen Verlust gering zu halten. Das Diagramm veranschaulicht die vergeudete Zeit zwischen dem Trainingsprozess von Prüfpunkten und dem Abbruch:
Der Prozess des Speicherns von Prüfpunkten selbst kann jedoch erheblichen Mehraufwand verursachen. Das Speichern eines Prüfpunkts im TB-Format kann oftmals zu einem Engpass im Trainingsprozess werden, da der synchronisierte Prüfpunktprozess das Training stundenlang blockiert. Im Durchschnitt kann der Mehraufwand im Zusammenhang mit Prüfpunkten 12 % der gesamten Trainingszeit betragen und auf bis zu 43 % ansteigen (Maeng et al., 2021).
Zusammenfassend lässt sich sagen, dass die Prüfpunktverwaltung großer Modelle hohe Mehraufwände bezüglich Speicher und Wiederherstellungszeit für Aufträge mit sich bringt. Häufige Prüfpunktspeicherungen in Kombination mit der Wiederaufnahmen von Trainingsaufträgen aus den neuesten verfügbaren Prüfpunkten werden zu einer großen Herausforderung.
Nebula ist die Rettung
Zum effektiven Trainieren großer, verteilter Modelle ist es wichtig, über eine zuverlässige und effiziente Methode zum Speichern und Wiederaufnehmen des Trainingsfortschritts zu verfügen, die Datenverluste und Ressourcenverschwendung minimiert. Nebula trägt dazu bei, die Speicherzeit von Prüfpunkten und die Anforderungen an GPU-Stunden für große Azure Machine Learning-Modelltrainingsaufträge zu reduzieren, indem es eine schnellere und einfachere Prüfpunktverwaltung bietet.
Nebula bietet Ihnen:
Beschleunigen der Prüfpunktgeschwindigkeiten bis zum 1000-fachen mit einer API, da asynchron zu Ihrem Trainingsprozess arbeitet. Nebula kann die Prüfpunktzeiten von Stunden auf Sekunden reduzieren – eine potenzielle Reduzierung von 95 bis 99 %.
In diesem Beispiel wird die Reduktion der Trainingszeit sowohl für Prüfpunkte als auch End-to-End für die Speicherung von vier Prüfpunkten von Hugging Face GPT2-, GPT2-Large- und GPT-XL-Trainingsaufträgen gezeigt. Für die mittelgroßen Hugging Face GPT2-XL-Prüfpunktspeicherungen (20,6 GB) erzielte Nebula eine Zeitreduktion von 96,9 % für einen Prüfpunkt.
Der Geschwindigkeitsgewinn beim Prüfpunkt kann mit der Modellgröße und der Anzahl der GPUs noch zunehmen. Beispielsweise kann die Zeit für das Testen einer Prüfpunktspeicherung eines Trainingspunkts mit einer Größe von 97 GB auf 128 A100 Nvidia-GPUs von 20 Minuten auf 1 Sekunde reduziert werden.
Reduzieren von End-to-End-Trainingszeit und Berechnungskosten für große Modelle durch Minimieren des Prüfpunktaufwands und Verringern der Anzahl der für die Wiederherstellung von Aufträgen verschwendeten GPU-Stunden. Nebula speichert Prüfpunkte asynchron und hebt die Blockierung des Trainingsprozesses auf, um die End-to-End-Trainingszeit zu reduzieren. Außerdem können Prüfpunkte häufiger gespeichert werden. Auf diese Weise können Sie Ihr Training am neuesten Prüfpunkt nach einer Unterbrechung fortsetzen und Zeit und Geld sparen, die für die Auftragswiederherstellung und GPU-Trainingsstunden vergeudet würden.
Bereitstellen vollständiger Kompatibilität mit PyTorch. Nebula bietet vollständige Kompatibilität mit PyTorch und vollständige Integration in verteilte Trainingsframeworks, einschließlich DeepSpeed (>=0.7.3) und PyTorch Lightning (>=1.5.0). Sie können Nebula auch mit verschiedenen Azure Machine Learning-Computezielen wie Azure Machine Learning Compute oder AKS verwenden.
Einfache Verwaltung Ihrer Prüfpunkte mit einem Python-Paket, mit dem Sie Ihre Prüfpunkte auflisten, abrufen, speichern und laden können. Um den Prüfpunktlebenszyklus anzuzeigen, stellt Nebula auch umfassende Protokolle auf Azure Machine Learning Studio bereit. Sie können Ihre Prüfpunkte an einem lokalen oder Remotespeicherort speichern
- Azure Blob Storage
- Azure Data Lake Storage
- NFS
und jederzeit mit einigen wenigen Zeilen Code darauf zugreifen.
Voraussetzungen
- Ein Azure-Abonnement und ein Azure Machine Learning-Arbeitsbereich. Weitere Informationen zur Erstellung von Arbeitsbereichsressourcen finden Sie unter Erstellen von Arbeitsbereichsressourcen
- Ein Azure Machine Learning-Computeziel. Weitere Informationen zur Erstellung von Computezielen finden Sie unter Verwalten von Schulungen und Bereitstellen von Berechnungen
- Ein Trainingsskript, das PyTorch verwendet.
- Durch ACPT (Azure Container für PyTorch) kuratierte Umgebung. Informationen zum Abrufen des ACPT-Images finden Sie unter Kuratierte Umgebungen. Erfahren Sie, wie Sie die kuratierte Umgebung verwenden
Verwenden von Nebula
Nebula bietet eine schnelle, einfache Prüfpunkterfahrung direkt in Ihrem vorhandenen Trainingsskript. Dies sind die Schritte für den Schnellstart von Nebula:
- Verwenden der ACPT-Umgebung
- Initialisieren von Nebula
- Aufrufen von APIs zum Speichern und Laden von Prüfpunkten
Verwenden der ACPT-Umgebung
Azure Container für PyTorch (ACPT), eine kuratierte Umgebung für das PyTorch-Modelltraining, enthält Nebula als vorinstalliertes, abhängiges Python-Paket. Um die kuratierten Umgebung anzuzeigen, lesen Sie Azure Container für PyTorch (ACPT), und um weitere Informationen über das ACPT-Image zu erhalten, lesen Sie Aktivieren von Deep Learning mit Azure Container für PyTorch in Azure Machine Learning.
Initialisieren von Nebula
Zum Aktivieren von Nebula mit der ACPT-Umgebung müssen Sie nur Ihr Trainingsskript ändern, um das nebulaml
-Paket zu importieren, und dann die Nebula-APIs an den entsprechenden Stellen aufrufen. Sie können Änderungen des Azure Machine Learning-SDK oder der CLI vermeiden. Sie können auch Änderungen anderer Schritte zum Trainieren Ihres großen Modells auf der Azure Machine Learning-Platform vermeiden.
Nebula muss initialisiert werden, um in Ihrem Trainingsskript ausgeführt zu werden. Geben Sie in der Initialisierungsphase die Variablen an, die den Prüfpunktspeicherort und die Häufigkeit bestimmen, wie in diesem Codeschnipsel gezeigt:
import nebulaml as nm
nm.init(persistent_storage_path=<YOUR STORAGE PATH>) # initialize Nebula
Nebula wurde in DeepSpeed und PyTorch Lightning integriert. Dadurch wird die Initialisierung einfach und leicht. Diese Beispiele zeigen, wie Sie Nebula in Ihre Trainingsskripts integrieren.
Wichtig
Das Speichern von Prüfpunkten mit Nebula erfordert etwas Arbeitsspeicher zum Speichern von Prüfpunkten. Stellen Sie sicher, dass Ihr Arbeitsspeicher größer als mindestens drei Kopien der Prüfpunkte ist.
Wenn der Arbeitsspeicher nicht ausreicht, um die Prüfpunkte zu speichern, wird empfohlen, eine Umgebungsvariable NEBULA_MEMORY_BUFFER_SIZE
im Befehl einzurichten, um die Verwendung des Arbeitsspeichers pro Knoten beim Speichern von Prüfpunkten zu begrenzen. Beim Festlegen dieser Variablen verwendet Nebula diesen Speicher als Puffer zum Speichern von Prüfpunkten. Wenn die Arbeitsspeicherauslastung nicht begrenzt ist, verwendet Nebula den Speicher zum Speichern der Prüfpunkte so weit wie möglich.
Wenn mehrere Prozesse auf demselben Knoten ausgeführt werden, beträgt der maximale Arbeitsspeicher zum Speichern von Prüfpunkten die Hälfte des Grenzwerts dividiert durch die Anzahl der Prozesse. Nebula verwendet die andere Hälfte für die Mehrprozesskoordination. Wenn Sie beispielsweise die Arbeitsspeicherauslastung pro Knoten auf 200 MB beschränken möchten, können Sie die Umgebungsvariable als export NEBULA_MEMORY_BUFFER_SIZE=200000000
(in Bytes, ca. 200 MB) im Befehl festlegen. In diesem Fall verwendet Nebula nur 200 MB Arbeitsspeicher, um die Prüfpunkte auf jedem Knoten zu speichern. Wenn auf demselben Knoten 4 Prozesse ausgeführt werden, verwendet Nebula pro Prozess 25 MB Arbeitsspeicher zum Speichern der Prüfpunkte.
Aufrufen von APIs zum Speichern und Laden von Prüfpunkten
Nebula bietet APIs zum Verarbeiten von Prüfpunktspeicherungen. Sie können diese APIs in Ihren Trainingsskripts verwenden, ähnlich der PyTorch-API torch.save()
. Diese Beispiele zeigen, wie Sie Nebula in Ihren Trainingsskripts verwenden.
Anzeigen Ihrer Prüfpunktverläufe
Wenn Ihr Trainingsauftrag abgeschlossen ist, navigieren Sie zum Bereich Name> Outputs + logs
des Auftrags. Erweitern Sie im linken Bereich den Ordner Nebula, und wählen Sie checkpointHistories.csv
aus, um detaillierte Informationen zu den Nebula-Prüfpunktspeicherungen anzuzeigen – Dauer, Durchsatz und Prüfpunktgröße.
Beispiele
Dieses Beispielen zeigt, wie Sie Nebula mit verschiedenen Frameworktypen verwenden. Sie können das Beispiel auswählen, das am besten zu Ihrem Trainingsskript passt.
Um die volle Nebula-Kompatibilität mit PyTorch-basierten Trainingsskripts zu ermöglichen, ändern Sie Ihr Trainingsskript nach Bedarf.
Importieren Sie zunächst das erforderliche
nebulaml
-Paket:# Import the Nebula package for fast-checkpointing import nebulaml as nm
Um Nebula zu initialisieren, rufen Sie die
nm.init()
-Funktion inmain()
auf, wie hier gezeigt:# Initialize Nebula with variables that helps Nebula to know where and how often to save your checkpoints persistent_storage_path="/tmp/test", nm.init(persistent_storage_path, persistent_time_interval=2)
Um Prüfpunkte zu speichern, ersetzen Sie die ursprüngliche
torch.save()
Anweisung, um Ihren Prüfpunkt durch Nebula zu speichern. Stellen Sie sicher, dass ihre Prüfpunktinstanz mit "global_step" beginnt, z. B. "global_step500" oder "global_step1000":checkpoint = nm.Checkpoint('global_step500') checkpoint.save('<CKPT_NAME>', model)
Hinweis
<'CKPT_TAG_NAME'>
ist die eindeutige ID für den Prüfpunkt. Ein Tag ist in der Regel die Anzahl von Schritten, die Epoche-Nummer oder ein beliebiger benutzerdefinierter Name. Der optionale<'NUM_OF_FILES'>
-Parameter gibt die Zustandsnummer an, die Sie für dieses Tag speichern würden.Laden Sie den neuesten gültigen Prüfpunkt, wie hier gezeigt:
latest_ckpt = nm.get_latest_checkpoint() p0 = latest_ckpt.load(<'CKPT_NAME'>)
Da ein Prüfpunkt oder eine Momentaufnahme viele Dateien enthalten kann, können Sie eine oder mehrere Dateien nach Namen laden. Mit dem neuesten Prüfpunkt kann der Trainingszustand in den Zustand zurückgesetzt werden, der vom letzten Prüfpunkt gespeichert wurde.
Andere APIs können die Prüfpunktverwaltung übernehmen
- auflisten aller Prüfpunkte
- Abrufen der neuesten Prüfpunkte
# Managing checkpoints ## List all checkpoints ckpts = nm.list_checkpoints() ## Get Latest checkpoint path latest_ckpt_path = nm.get_latest_checkpoint_path("checkpoint", persisted_storage_path)