Techniken zum Trainieren großer neuronaler Netze PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Techniken zum Trainieren großer neuronaler Netze

Techniken zum Trainieren großer neuronaler Netze

Große neuronale Netze sind der Kern vieler neuerer Fortschritte in der KI, aber ihre Ausbildung ist eine schwierige technische und Forschungsherausforderung, die die Orchestrierung eines Clusters von GPUs erfordert, um eine einzige synchronisierte Berechnung durchzuführen. Da Cluster- und Modellgrößen gewachsen sind, haben Praktiker des maschinellen Lernens eine zunehmende Vielfalt an Techniken entwickelt, um das Modelltraining über viele GPUs zu parallelisieren. Auf den ersten Blick mag das Verständnis dieser Parallelisierungstechniken entmutigend erscheinen, aber mit nur wenigen Annahmen über die Struktur der Berechnung werden diese Techniken viel klarer – an diesem Punkt pendeln Sie nur undurchsichtige Bits wie ein Netzwerk von A nach B Switch-Shuttles um Pakete herum.

Datenparallelität

Techniken zum Trainieren großer neuronaler Netze

Pipeline-Parallelität

Techniken zum Trainieren großer neuronaler Netze

Tensorparallelität

Techniken zum Trainieren großer neuronaler Netze

Experte Parallelität

Techniken zum Trainieren großer neuronaler Netze

Datenparallelität

Techniken zum Trainieren großer neuronaler Netze

Pipeline-Parallelität

Techniken zum Trainieren großer neuronaler Netze

Tensorparallelität

Techniken zum Trainieren großer neuronaler Netze

Experte Parallelität

Techniken zum Trainieren großer neuronaler Netze

Eine Veranschaulichung verschiedener Parallelisierungsstrategien auf einem Drei-Schichten-Modell. Jede Farbe bezieht sich auf eine Ebene und gestrichelte Linien trennen verschiedene GPUs.

Keine Parallelität

Das Training eines neuronalen Netzwerks ist ein iterativer Prozess. In jeder Iteration führen wir einen Durchlauf durch ein Modell durch Lagen um eine Ausgabe für jedes Trainingsbeispiel in einem Datenbatch zu berechnen. Dann geht ein weiterer Durchgang weiter rückwärts durch die Schichten, wobei propagiert wird, wie stark jeder Parameter die endgültige Ausgabe beeinflusst, indem a berechnet wird Die Sonnenbrillengläser in Bezug auf jeden Parameter. Der durchschnittliche Gradient für den Batch, die Parameter und einige Optimierungszustände pro Parameter werden an einen Optimierungsalgorithmus übergeben, wie z Marcus, das die Parameter der nächsten Iteration (die eine etwas bessere Leistung für Ihre Daten haben sollte) und den neuen Optimierungsstatus pro Parameter berechnet. Während das Training über Datenstapel iteriert, entwickelt sich das Modell weiter und liefert immer genauere Ergebnisse.

Verschiedene Parallelisierungstechniken unterteilen diesen Trainingsprozess in verschiedene Dimensionen, darunter:

  • Datenparallelität – Führen Sie verschiedene Teilmengen des Stapels auf verschiedenen GPUs aus;
  • Pipeline-Parallelität – Führen Sie verschiedene Schichten des Modells auf verschiedenen GPUs aus;
  • Tensorparallelität – brechen Sie die Mathematik für eine einzelne Operation auf, wie z. B. eine Matrixmultiplikation, die auf GPUs aufgeteilt werden soll;
  • Mixture-of-Experts – Verarbeiten Sie jedes Beispiel nur mit einem Bruchteil jeder Schicht.

(In diesem Beitrag gehen wir davon aus, dass Sie GPUs verwenden, um Ihre neuronalen Netzwerke zu trainieren, aber die gleichen Ideen gelten auch für diejenigen, die andere verwenden Beschleuniger für neuronale Netzwerke.)

Datenparallelität

Daten parallel Training bedeutet, dieselben Parameter auf mehrere GPUs (oft als „Worker“ bezeichnet) zu kopieren und jeder unterschiedliche Beispiele zur gleichzeitigen Verarbeitung zuzuweisen. Allein die Datenparallelität erfordert immer noch, dass Ihr Modell in den Speicher einer einzelnen GPU passt, ermöglicht Ihnen jedoch die Nutzung der Rechenleistung vieler GPUs auf Kosten der Speicherung vieler doppelter Kopien Ihrer Parameter. Allerdings gibt es Strategien, um den für Ihre GPU verfügbaren effektiven RAM zu erhöhen, z. B. die vorübergehende Auslagerung von Parametern in den CPU-Speicher zwischen den Nutzungen.

Da jeder Data Parallel Worker seine Kopie der Parameter aktualisiert, müssen sie sich koordinieren, um sicherzustellen, dass jeder Worker weiterhin ähnliche Parameter hat. Der einfachste Ansatz besteht darin, eine blockierende Kommunikation zwischen Workern einzuführen: (1) unabhängig den Gradienten für jeden Worker zu berechnen; (2) Durchschnitt der Gradienten über Arbeiter; und (3) unabhängiges Berechnen derselben neuen Parameter für jeden Arbeiter. Schritt (2) ist ein blockierender Durchschnitt, der die Übertragung ziemlich vieler Daten erfordert (proportional zur Anzahl der Worker mal der Größe Ihrer Parameter), was Ihren Trainingsdurchsatz beeinträchtigen kann. Es gibt verschiedene asynchrone Synchronisationsschemata um diesen Overhead zu beseitigen, aber sie beeinträchtigen die Lerneffizienz; In der Praxis hält man sich im Allgemeinen an den synchronen Ansatz.

Pipeline-Parallelität

Mit der Pipeline parallel Beim Training partitionieren wir sequentielle Teile des Modells über GPUs hinweg. Jede GPU enthält nur einen Bruchteil der Parameter, und daher verbraucht dasselbe Modell proportional weniger Speicher pro GPU.

Es ist einfach, ein großes Modell in Teile aufeinanderfolgender Schichten aufzuteilen. Es besteht jedoch eine sequentielle Abhängigkeit zwischen Eingaben und Ausgaben von Schichten, sodass eine naive Implementierung zu einer großen Leerlaufzeit führen kann, während ein Arbeiter darauf wartet, dass Ausgaben von der vorherigen Maschine als Eingaben verwendet werden. Diese Wartezeitbrocken werden als „Blasen“ bezeichnet und verschwenden die Berechnung, die von den im Leerlauf befindlichen Maschinen durchgeführt werden könnte.

Techniken zum Trainieren großer neuronaler Netze vorwärts
Techniken zum Trainieren großer neuronaler Netze rückwärts
Techniken zum Trainieren großer neuronaler Netze Verlaufsaktualisierung
Techniken zum Trainieren großer neuronaler Netze Leerlauf
Techniken zum Trainieren großer neuronaler Netze

Abbildung eines naiven Pipeline-Parallelismus-Setups, bei dem das Modell vertikal pro Schicht in 4 Partitionen aufgeteilt wird. Worker 1 hostet Modellparameter der ersten Schicht des Netzwerks (am nächsten zum Eingang), während Worker 4 Schicht 4 hostet (die am nächsten zum Ausgang liegt). „F“, „B“ und „U“ stehen für Vorwärts-, Rückwärts- bzw. Aktualisierungsoperationen. Die Indizes geben an, auf welchem ​​Worker eine Operation ausgeführt wird. Die Daten werden aufgrund der sequentiellen Abhängigkeit jeweils von einem Worker verarbeitet, was zu großen „Blasen“ von Leerlaufzeiten führt.

Wir können die Ideen aus der Datenparallelität wiederverwenden, um die Kosten der Blase zu reduzieren, indem wir jeden Arbeiter nur eine Teilmenge von Datenelementen auf einmal verarbeiten lassen, was es uns ermöglicht, neue Berechnungen geschickt mit Wartezeiten zu überlappen. Die Kernidee besteht darin, eine Charge in mehrere Mikrochargen aufzuteilen; Jeder Mikrobatch sollte proportional schneller zu verarbeiten sein, und jeder Mitarbeiter beginnt mit der Arbeit am nächsten Mikrobatch, sobald er verfügbar ist, wodurch die Ausführung der Pipeline beschleunigt wird. Mit genügend Mikrochargen können die Arbeiter die meiste Zeit mit einer minimalen Blase zu Beginn und am Ende des Schritts eingesetzt werden. Gradienten werden über Mikrobatches gemittelt, und Aktualisierungen der Parameter erfolgen nur, wenn alle Mikrobatches abgeschlossen sind.

Die Anzahl der Arbeiter, auf die das Modell aufgeteilt wird, wird allgemein als bezeichnet Rohrleitungstiefe.

Während des Vorwärtsdurchgangs müssen Worker nur die Ausgabe (sogenannte Aktivierungen) ihres Schichtenblocks an den nächsten Worker senden; während des Rückwärtsdurchgangs werden nur die Gradienten dieser Aktivierungen an den vorherigen Worker gesendet. Es gibt einen großen Gestaltungsspielraum, wie diese Durchgänge geplant und die Gradienten über Mikrobatches hinweg aggregiert werden. GPipe lässt jeden Worker-Prozess nacheinander vorwärts und rückwärts durchlaufen und aggregiert dann am Ende synchron Gradienten aus mehreren Mikrobatches. Wunschtraum plant stattdessen jeden Worker so ein, dass er abwechselnd Vorwärts- und Rückwärtsdurchläufe verarbeitet.

Techniken zum Trainieren großer neuronaler Netze vorwärts
Techniken zum Trainieren großer neuronaler Netze rückwärts
Techniken zum Trainieren großer neuronaler Netze Aktualisierung
Techniken zum Trainieren großer neuronaler Netze Leerlauf
GPipe

Techniken zum Trainieren großer neuronaler Netze

Wunschtraum

Techniken zum Trainieren großer neuronaler Netze

Vergleich der Pipelining-Schemata von GPipe und PipeDream mit 4 Mikrobatches pro Batch. Mikrochargen 1–8 entsprechen zwei aufeinanderfolgenden Datenchargen. In der Abbildung gibt „(Nummer)“ an, auf welchem ​​Mikrobatch eine Operation durchgeführt wird, und der tiefgestellte Index kennzeichnet die Arbeiter-ID. Beachten Sie, dass PipeDream effizienter wird, wenn einige Berechnungen mit veralteten Parametern durchgeführt werden.

Tensorparallelität

Die Pipeline-Parallelität teilt ein Modell „vertikal“ in Schichten auf. Es ist auch möglich, bestimmte Vorgänge innerhalb einer Ebene „horizontal“ aufzuteilen, was üblicherweise als „ebene“ bezeichnet wird Tensorparallel Ausbildung. Für viele moderne Modelle (wie z Transformator) besteht der Berechnungsengpass darin, eine Aktivierungsbatchmatrix mit einer großen Gewichtsmatrix zu multiplizieren. Matrix-Multiplikation kann als Skalarprodukt zwischen Zeilen- und Spaltenpaaren betrachtet werden; Es ist möglich, unabhängige Skalarprodukte auf verschiedenen GPUs zu berechnen oder Teile jedes Skalarprodukts auf verschiedenen GPUs zu berechnen und die Ergebnisse zusammenzufassen. Mit beiden Strategien können wir die Gewichtsmatrix in gleichmäßig große „Shards“ aufteilen, jeden Shard auf einer anderen GPU hosten und diesen Shard verwenden, um den relevanten Teil des gesamten Matrixprodukts zu berechnen, bevor wir später kommunizieren, um die Ergebnisse zu kombinieren.

Ein Beispiel ist Megatron-LM, das Matrixmultiplikationen innerhalb der Selbstaufmerksamkeits- und MLP-Schichten des Transformers parallelisiert. PTD-P verwendet Tensor-, Daten- und Pipeline-Parallelität; Sein Pipeline-Zeitplan weist jedem Gerät mehrere nicht aufeinanderfolgende Schichten zu, wodurch der Bubble-Overhead auf Kosten von mehr Netzwerkkommunikation reduziert wird.

Manchmal kann die Eingabe in das Netzwerk über eine Dimension mit einem hohen Grad an paralleler Berechnung relativ zur Querkommunikation parallelisiert werden. Sequenzparallelität ist eine solche Idee, bei der eine Eingabesequenz über die Zeit in mehrere Unterbeispiele aufgeteilt wird, wodurch der Spitzenspeicherverbrauch proportional verringert wird, indem die Berechnung mit Beispielen mit größerer Granularität fortgesetzt werden kann.

Expertenmix (MoE)

Mit der Expertenmix (MoE) Ansatz wird nur ein Bruchteil des Netzwerks verwendet, um die Ausgabe für eine beliebige Eingabe zu berechnen. Ein beispielhafter Ansatz besteht darin, viele Gewichtungssätze zu haben, und das Netzwerk kann über einen Gating-Mechanismus zur Inferenzzeit auswählen, welcher Satz verwendet werden soll. Dies ermöglicht viel mehr Parameter ohne erhöhten Rechenaufwand. Jeder Satz von Gewichten wird als „Experten“ bezeichnet, in der Hoffnung, dass das Netzwerk lernt, jedem Experten spezielle Berechnungen und Fähigkeiten zuzuweisen. Verschiedene Experten können auf verschiedenen GPUs gehostet werden, was eine klare Möglichkeit bietet, die Anzahl der für ein Modell verwendeten GPUs zu skalieren.

Techniken zum Trainieren großer neuronaler Netze

Abbildung einer Mischung aus Experten (MoE)-Schicht. Nur 2 von den n Experten werden vom Gating-Netzwerk ausgewählt. (Bild angepasst von: Shazeeret al., 2017)

GShard skaliert einen MoE-Transformer auf bis zu 600 Milliarden Parameter mit einem Schema, bei dem nur die MoE-Schichten auf mehrere TPU-Geräte aufgeteilt und andere Schichten vollständig dupliziert werden. Transformator schalten skaliert die Modellgröße auf Billionen von Parametern mit noch höherer Sparsity, indem eine Eingabe an einen einzelnen Experten weitergeleitet wird.

Andere speichersparende Designs

Es gibt viele andere Berechnungsstrategien, um das Training immer größerer neuronaler Netze handhabbarer zu machen. Zum Beispiel:

  • Um den Gradienten zu berechnen, müssen Sie die ursprünglichen Aktivierungen gespeichert haben, was viel Geräte-RAM verbrauchen kann. Checkpointing (auch als Aktivierungsneuberechnung bezeichnet) speichert eine beliebige Teilmenge von Aktivierungen und berechnet die Zwischenaktivierungen just-in-time während des Rückwärtsdurchlaufs neu. Dies spart eine Menge Speicher zum Rechenaufwand von höchstens einem zusätzlichen vollen Vorwärtsdurchlauf. Man kann auch kontinuierlich zwischen Rechen- und Speicherkosten abwägen selektive Aktivierungsneuberechnung, das Prüfpunkte für Teilmengen der Aktivierungen darstellt, die relativ teurer zu speichern, aber billiger zu berechnen sind.

  • Gemischtes Präzisionstraining besteht darin, Modelle mit Zahlen mit geringerer Genauigkeit zu trainieren (am häufigsten FP16). Moderne Beschleuniger können viel höhere FLOP-Zahlen mit Zahlen mit geringerer Genauigkeit erreichen, und Sie sparen auch Geräte-RAM. Bei richtiger Pflege kann das resultierende Modell fast keine Genauigkeit verlieren.

  • Entladen besteht darin, ungenutzte Daten vorübergehend auf die CPU oder zwischen verschiedenen Geräten auszulagern und sie später bei Bedarf zurückzulesen. Naive Implementierungen werden das Training stark verlangsamen, aber ausgefeilte Implementierungen werden Daten vorab abrufen, sodass das Gerät nie darauf warten muss. Eine Implementierung dieser Idee ist Null der die Parameter, Gradienten und Optimiererzustände über die gesamte verfügbare Hardware aufteilt und sie nach Bedarf materialisiert.

  • Speichereffiziente Optimierer Es wurde vorgeschlagen, den Speicherbedarf des vom Optimierer verwalteten Betriebszustands zu reduzieren, sowie Adafaktor.

  • Kompression kann auch zum Speichern von Zwischenergebnissen im Netzwerk verwendet werden. Zum Beispiel, Kern komprimiert Aktivierungen, die für den Rückwärtsdurchlauf gespeichert werden; DALL · E. komprimiert die Farbverläufe, bevor sie synchronisiert werden.


Bei OpenAI trainieren und verbessern wir große Modelle von der zugrunde liegenden Infrastruktur bis hin zum Einsatz für reale Probleme. Wenn Sie die Ideen aus diesem Beitrag in die Praxis umsetzen möchten – besonders relevant für unsere Skalierungs- und angewandte Forschungsteams – sind wir das Verleih!


Anerkennungen
Vielen Dank an Nikolas Tezak, Sam Altman, Daniel Gackle, Ilya Sutskever und Steven Adler für ihr Feedback zu den Entwürfen. Vielen Dank an Justin Jay Wang, Bianca Martin und Steve Dowling für Kommunikation und Design.

Zeitstempel:

Mehr von OpenAI