quicker AI coaching with fewer GPUs Fb Engineering –
Das Training von KI-Modellen im großen Maßstab ist nicht einfach. Neben dem hohen Bedarf an Rechenleistung und Ressourcen steckt auch ein erheblicher Engineering-Aufwand hinter dem Training sehr großer Modelle. Bei Facebook AI Research (FAIR) Engineering haben wir an der Entwicklung von Tools und Infrastrukturen gearbeitet, um das Training großer KI-Modelle zu vereinfachen. Unsere jüngsten Arbeiten in Bereichen wie Intra-Layer-Modellparallelität, Parallelität des Pipeline-Modells, Optimiererstatus+Gradienten-Sharding, und Mischung aus Experten ist nur ein Teil unserer Arbeit, um das Training fortgeschrittener KI-Modelle für eine beliebige Anzahl von Aufgaben effizienter zu gestalten.
Fully Sharded Data Parallel (FSDP) ist das neueste Tool, das wir vorstellen. Es teilt die Parameter eines KI-Modells auf datenparallele Worker und kann optional einen Teil der Trainingsberechnung auf die CPUs auslagern. Wie der Name schon sagt, ist FSDP eine Art datenparalleler Trainingsalgorithmus. Obwohl die Parameter auf verschiedene GPUs aufgeteilt werden, erfolgt die Berechnung für jeden Mikrobatch von Daten immer noch lokal für jeden GPU-Worker. Diese konzeptionelle Einfachheit macht FSDP leichter verständlich und auf eine Vielzahl von Nutzungsszenarien anwendbar (im Vergleich zu Intra-Layer-Parallelität und Pipeline-Parallelität). Im Vergleich zu den parallelen Methoden zum Optimieren von Zustands- und Gradienten-Sharding-Daten teilt FSDP Parameter gleichmäßiger und ist in der Lage, eine bessere Leistung durch Kommunikations- und Berechnungsüberlappungen während des Trainings zu erzielen.
Mit FSDP ist es nun möglich, mit weniger GPUs um Größenordnungen größere Modelle effizienter zu trainieren. FSDP wurde in der FairScale-Bibliothek und ermöglicht Ingenieuren und Entwicklern, das Training ihrer Modelle mit einfachen APIs zu skalieren und zu optimieren. Bei Facebook wurde FSDP bereits integriert und für die Ausbildung einiger unserer NLP und Vision Modelle.
Der hohe Rechenaufwand groß angelegter Schulungen
NLP-Forschung ist ein besonderer Bereich, in dem wir die Bedeutung der effizienten Nutzung von Computing für das Training der KI erkennen können. Letztes Jahr gab OpenAI bekannt, dass sie trainiert haben GPT-3, das bisher größte neuronale Sprachmodell mit 175 Milliarden Parametern. Es ist geschätzt ungefähr 355 GPU-Jahre gebraucht haben, um GPT-3 zu trainieren, oder das Äquivalent von 1.000 GPUs, die mehr als vier Monate lang ununterbrochen arbeiten.
Abgesehen davon, dass viele Rechen- und Engineering-Ressourcen erforderlich sind, verursachen die meisten Skalierungsansätze wie dieser zusätzliche Kommunikationskosten und erfordern von den Ingenieuren, Kompromisse zwischen Speichernutzung und Recheneffizienz sorgfältig abzuwägen. Zum Beispiel erfordert ein typisches datenparalleles Training die Pflege redundanter Kopien des Modells auf jeder GPU, und das modellparallele Training verursacht zusätzliche Kommunikationskosten, um Aktivierungen zwischen Workern (GPUs) zu verschieben.
FSDP ist im Vergleich relativ frei von Kompromissen. Es verbessert die Speichereffizienz durch Sharding von Modellparametern, Gradienten und Optimiererstatus über GPUs hinweg und verbessert die Recheneffizienz, indem es die Kommunikation zerlegt und sie mit den Vorwärts- und Rückwärtsdurchläufen überlappt. FSDP liefert identische Ergebnisse wie ein standardmäßiges Distributed Data Parallel (DDP)-Training und ist in einer benutzerfreundlichen Schnittstelle verfügbar, die ein direkter Ersatz für das DistributedDataParallel-Modul von PyTorch ist. Unsere frühen Tests haben gezeigt, dass FSDP eine Skalierung auf Billionen von Parametern ermöglichen kann.
So funktioniert FSDP
In der Standard-DDP-Schulung verarbeitet jeder Arbeiter einen separaten Stapel und die Gradienten werden über die Arbeiter mit einem . summiert All-Reduce-Betrieb. Obwohl DDP sehr beliebt geworden ist, benötigt es mehr GPU-Speicher als es benötigt, da die Modellgewichtungen und Optimiererstatus über alle DDP-Worker repliziert werden.
Eine Methode zur Reduzierung von Replikationen besteht darin, einen Prozess namens Full Parameter Sharding anzuwenden, bei dem nur eine Teilmenge der Modellparameter, Gradienten und Optimierer zur Verfügung gestellt wird, die für eine lokale Berechnung benötigt werden. Eine Implementierung dieser Methode, ZeRO-3, wurde bereits von Microsoft populär gemacht.
Die wichtigste Erkenntnis, um das vollständige Parameter-Sharding freizuschalten, ist, dass wir die alles reduzierenre Operationen in DDP in separate reduzieren-streuung und All-Gather-Operationen:
All-Reduce als Kombination aus Reduce-Scatter und All-Gather. Der Standard-All-Reduce-Vorgang zum Aggregieren von Gradienten kann in zwei separate Phasen zerlegt werden: Reduce-Scatter und All-Gather. Während der Phase der Reduzierung der Streuung werden die Gradienten in gleichen Blöcken zwischen den Rängen auf jeder GPU basierend auf ihrem Rangindex summiert. Während der All-Gather-Phase wird der geteilte Teil der aggregierten Gradienten, die auf jeder GPU verfügbar sind, allen GPUs zur Verfügung gestellt (Details zu diesen Operatoren finden Sie hier).
Wir können dann die Streuung reduzieren und die Gesamtmenge neu anordnen, sodass jeder DDP-Worker nur einen einzigen Shard von Parametern und Optimiererzuständen speichern muss. Die folgende Abbildung zeigt das Standard-DDP-Training (oben) und das FSDP-Training (unten):
Ein Vergleich von parallelem Standardtraining mit Daten und parallelem Training mit vollständig geteilten Daten. Bei standardmäßigen datenparallelen Trainingsmethoden ist eine Kopie des Modells auf jeder GPU vorhanden und eine Abfolge von Vorwärts- und Rückwärtsdurchläufen wird nur für einen Datensplitter ausgewertet. Nach diesen lokalen Berechnungen werden die Parameter und Optimierer für jeden lokalen Prozess mit den anderen GPUs geteilt, um die globale Gewichtungsaktualisierung zu berechnen. In FSDP ist nur ein Shard des Modells auf einer GPU vorhanden. Dann werden lokal alle Gewichte von den anderen GPUs gesammelt – mittels eines All-Gather-Schritts – um den Vorwärtspass zu berechnen. Dieses Sammeln von Gewichten wird dann vor dem Rückwärtsdurchlauf erneut durchgeführt. Nach diesem Rückwärtsdurchlauf werden die lokalen Gradienten gemittelt und mithilfe eines Schritts zur Reduzierung der Streuung auf die GPUs aufgeteilt, wodurch jede GPU ihren lokalen Gewichts-Shard aktualisieren kann.
Um die Speichereffizienz zu maximieren, können wir die vollen Gewichtungen nach dem Vorwärtsdurchlauf jeder Schicht verwerfen und so Speicherplatz für nachfolgende Schichten sparen. Dies kann implementiert werden, indem der FSDP-Wrapper auf jede Schicht im Netzwerk angewendet wird (mit reshard_after_forward=Wahr).
Im Pseudocode:
FSDP-Forward-Pass:
für Layer_i in Layern:
All-Gather-Vollgewichtungen für layer_i
Vorwärtspass für Layer_i
verwerfen Sie die vollen Gewichtungen für layer_i
FSDP-Rückwärtspass:
für Layer_i in Layern:
All-Gather-Vollgewichtungen für layer_i
Rückwärtspass für Layer_i
verwerfen Sie die vollen Gewichtungen für layer_i
Streuungsgradienten für Layer_i . reduzieren
So verwenden Sie FSDP
Es gibt mehrere Möglichkeiten, FSDP in der groß angelegten KI-Forschung einzusetzen. Derzeit bieten wir vier Lösungen zur Anpassung an unterschiedliche Bedürfnisse an.
1. Verwendung von FSDP in Sprachmodellen
Für Sprachmodelle wird FSDP in der fairseq Rahmen über die folgenden neuen Argumente:
- –ddp-backend=fully_sharded: ermöglicht vollständiges Sharding über FSDP
- – CPU-Entlastung: entlädt den Optimiererstatus und die FP32-Modellkopie auf die CPU (kombiniert mit–optimizer=cpu_adam)
- –no-reshard-after-forward: Erhöht die Trainingsgeschwindigkeit für große Modelle (1B+ Parameter) und ähnelt ZeRO Stufe 2
- Andere beliebte Optionen (–Fp16, –Aktualisierungshäufigkeit, –Checkpoint-Aktivierungen, –Offload-Aktivierungen, etc.) arbeiten wie gewohnt weiter
Siehe die fairseq-Tutorial Anweisungen zur Verwendung von FSDP zum Trainieren eines 13B-Parametermodells auf acht GPUs oder auf einer einzelnen GPU mit FSDP + CPU-Offloading.
2. Verwendung von FSDP in Computer Vision Modellen
Für Computer Vision-Modelle wird FSDP unterstützt in VISSL und auf RegNets-Architekturen getestet. Schichten wie BatchNorm und ReLU werden nahtlos verarbeitet und auf Konvergenz getestet.
Verwenden Sie die folgenden Optionen, um FSDP zu aktivieren:
- config.MODEL.FSDP_CONFIG.AUTO_SETUP_FSDP=True
- config.MODEL.SYNC_BN_CONFIG.SYNC_BN_TYPE=Pytorch
- config.MODEL.AMP_PARAMS.AMP_TYPE=pytorch
Sehen diese Abteilung der Yaml-Konfiguration für zusätzliche Optionen zum Konfigurieren von FSDP in VISSL.
3. Verwenden von FSDP von PyTorch Lightning
Zur einfacheren Integration in allgemeinere Anwendungsfälle wird FSDP als Beta-Funktion von PyTorch Lightning unterstützt. Dieses Tutorial enthält ein detailliertes Beispiel zur Verwendung des FSDP-Plugins mit PyTorch Lightning. Auf hohem Niveau hinzufügen plugins=’fsdp’ unten kann es aktivieren.
Modell = MeinModell ()
Trainer = Trainer(gpus=4, plugins=”fsdp”, Genauigkeit=16)
trainer.fit(Modell)
trainer.test()
trainer.vorhersage()
4. Verwenden der FSDP-Bibliothek direkt von FairScale
Die Hauptbibliothek, in der FSDP entwickelt wurde und in der Sie die neuesten Updates finden, ist FairScale. Sie können FSDP von FairScale direkt mit dem folgenden Beispiel verwenden, indem Sie einfach die DDP(mein_modul):
from fairscale.nn.data_parallel Import FullyShardedDataParallel als FSDP
…
sharded_module = DDP(mein_modul)FSDP(mein_modul)
optim = Torch.optim.Adam(sharded_module.parameters(), lr=0.0001)
für Beispiel, Label in dataload.next_batch:
out = sharded_module(x=sample, y=3, z=torch.Tensor([1]))
Verlust = Kriterium (out, label)
verlust.rückwärts()
optim.step()
Die FSDP-Bibliothek in FairScale stellt die Low-Level-Optionen für viele wichtige Aspekte einer groß angelegten Ausbildung bereit. Hier sind einige wichtige Bereiche, die Sie berücksichtigen sollten, wenn Sie FSDP mit seiner vollen Leistung anwenden.
- Modellverpackung: Um den vorübergehenden GPU-Speicherbedarf zu minimieren, müssen Benutzer ein Modell verschachtelt einschließen. Dies führt zu zusätzlicher Komplexität. Das auto_wrap Das Dienstprogramm ist nützlich, um vorhandenen PyTorch-Modellcode für verschachtelte Wrapping-Zwecke mit Anmerkungen zu versehen.
- Modellinitialisierung: Im Gegensatz zu DDP tut FSDP nicht automatisch Modellgewichtungen zwischen GPU-Workern synchronisieren. Dies bedeutet, dass die Modellinitialisierung sorgfältig durchgeführt werden muss, damit alle GPU-Worker die gleichen Anfangsgewichte haben.
- Optimierereinstellungen: Aufgrund von Sharding und Wrapping werden nur bestimmte Arten von Optimierern und Optimierereinstellungen von FSDP unterstützt. Insbesondere wenn ein Modul von FSDP umschlossen wird und seine Parameter zu einem einzigen Tensor abgeflacht werden, können Benutzer in einem solchen Modul keine unterschiedlichen Hyperparameter für unterschiedliche Parametergruppen verwenden.
- Gemischte Präzision: FSDP unterstützt fortgeschrittenes gemischtes Präzisionstraining mit FP16-Mastergewichten sowie FP16-Reduzierung und Streuung an den Steigungen. Bestimmte Teile eines Modells können nur konvergieren, wenn die volle Genauigkeit verwendet wird. In diesen Fällen ist eine zusätzliche Umhüllung erforderlich, um selektiv Teile eines Modells mit voller Präzision auszuführen.
- Zustands-Checkpointing und Inferenz: Wenn der Modellmaßstab groß ist, kann das Speichern und Laden des Modellzustands eine Herausforderung darstellen. Die FSDP unterstützt mehrere Möglichkeiten, diese Aufgabe zu ermöglichen, aber es ist keineswegs trivial.
- Schließlich wird FSDP oft zusammen mit . verwendet Aktivierungs-Checkpointing Funktionen wie checkpoint_wrapper von FairScale. Benutzer müssen möglicherweise die Checkpointing-Strategie für die Aktivierung sorgfältig abstimmen, damit ein großes Modell in den begrenzten GPU-Speicherplatz passt.
Nächste Schritte
FSDP ist Open Source, und frühe Benutzer haben es ausprobiert und dazu beigetragen. Wir glauben, dass dies der gesamten Forschungsgemeinschaft zugute kommen kann, und freuen uns darauf, mit allen zusammenzuarbeiten, um es besser zu machen. Dies sind insbesondere einige der wichtigen Bereiche.
- FSVP allgemeiner machen. Bisher wurde FSDP sowohl für NLP- als auch für Vision-Modelle mit SGD- und Adam-Optimierern verwendet. Wenn neuere Modelle und Optimierer auf den Markt kommen, muss FSDP sie weiterhin unterstützen. Als rein datenparalleles Trainingsschema hat FSDP das größte Potenzial, eine breite Palette von KI-Algorithmen zu unterstützen.
- FSDP-Auto-Tune machen. Es gibt viele Regler, die Benutzer heute mit FSDP für Skalierung und Leistung einstellen können. Wir freuen uns darauf, Algorithmen für die automatische Optimierung sowohl der GPU-Speichernutzung als auch der Trainingsleistung zu entwickeln.
- Neben dem Training mehr skalierbare Inferenz und Model Serving ist ein wichtiger Anwendungsfall, den FSDP möglicherweise unterstützen muss.
- Last but not least: Refactoring und Weiterführung FSDP modularisieren und seine Kernkomponenten sind für neuere und bessere Funktionen gleichermaßen wichtig.
Probieren Sie es aus und tragen Sie dazu bei!
FSDP ist derzeit direkt bei der FairScale-Bibliothek.
Danke, dass Sie uns bis jetzt treu geblieben sind. Bitte versuchen Sie es mit FSDP in Ihrer Forschungs- oder Produktionsarbeit. Wir freuen uns über Ihr Feedback und wie immer sind Pull-Requests willkommen!
Comments are closed.