Dieser Austausch analysiert systematisch die wichtigsten Leistungsengpässe im KI-Modell-Trainingsprozess sowie die aktuellen wichtigsten Beschleunigungslösungen und technischen Prinzipien für diese Engpässe und stellt einige praktische Ergebnisse der Baidu Intelligent Cloud in dieser Hinsicht vor.
Der heutige Austausch besteht hauptsächlich aus drei Teilen:
Zunächst werden wir vorstellen, warum wir das KI-Training beschleunigen müssen, das heißt, was der allgemeine Hintergrund und Ausgangspunkt ist;
# 🎜🎜#Im zweiten Teil analysieren wir systematisch die Leistungsengpässe, die während des eigentlichen Trainingsprozesses auftreten können, und stellen dann die aktuellen wichtigsten Beschleunigungslösungen vor, um diese Probleme anzugehen; #Einführung in den dritten Teil der KI-Trainingsbeschleunigungssuite AIAK-Training der Baidu-Baige-Plattform hat praktische Auswirkungen auf die Beschleunigung einiger Modelltrainings. 1. Warum wird das KI-Training beschleunigt? In einem KI-System umfasst ein Modell von der Produktion bis zur Anwendung im Allgemeinen zwei Phasen: Offline-Training und Inferenzbereitstellung. Die Offline-Trainingsphase ist der Prozess der Generierung eines Modells. Benutzer müssen die Datensätze und neuronalen Netzwerkalgorithmen vorbereiten, die zum Trainieren des Modells gemäß ihren eigenen Aufgabenszenarien erforderlich sind. Der Algorithmus kann als hochkomplexe nichtkonvexe mathematische Funktion verstanden werden, die viele Variablen und Parameter enthält. Der Prozess des Modelltrainings besteht tatsächlich darin, die Parameter im neuronalen Netzwerkmodell zu lernen. Nachdem das Modelltraining begonnen hat, werden die Daten gelesen, dann zur Vorwärtsberechnung an das Modell gesendet und der Fehler mit dem tatsächlichen Wert berechnet. Führen Sie dann die umgekehrte Berechnung durch, um den Parametergradienten zu erhalten, und aktualisieren Sie schließlich die Parameter. Das Training umfasst mehrere Runden von Dateniterationen. Nach Abschluss des Trainings speichern wir das trainierte Modell, stellen es dann online bereit, akzeptieren die tatsächlichen Eingaben des Benutzers und schließen die Schlussfolgerung durch Vorwärtsberechnung ab. Unabhängig davon, ob es sich um Training oder Schlussfolgerung handelt, liegt der Kern in der Datenberechnung. Um die Recheneffizienz zu beschleunigen, werden Training und Inferenz im Allgemeinen über heterogene Beschleunigungschips wie GPUs durchgeführt.Darüber hinaus, gemessen an der Entwicklungsgeschichte von Deep-Learning-Modellen, um weiterhin die Obergrenze der Genauigkeit des Modells zu durchbrechen, Die Anzahl der Modellparameter nimmt tatsächlich rapide zu. Eine größere Anzahl von Parametern führt jedoch zu einem höheren Rechenaufwand.
Die linke Seite der Abbildung unten stammt aus einer öffentlichen Veröffentlichung. Aus dieser Zusammenfassung sehen wir, dass sich der Berechnungsbetrag des Modells vor 2010 in etwa 20 Monaten verdoppelt hat. Von 2010 bis 2015 verdoppelten sich herkömmliche Modellrechnungen alle 5-6 Monate. Nach 2015 zeichnete sich der Trend zum Training großer Modelle ab, und der Rechenaufwand stieg um das Zehn- bis Hundertfache. Modelltraining stellt immer höhere Anforderungen an Rechenleistung und Infrastruktur. Das Training erfordert mehr Rechenleistung und dauert länger, was auch zu höheren Ressourcenkosten führt. Hier listen wir die in einigen Veröffentlichungen oder Studien veröffentlichten Kostendaten auf, die darauf hinweisen, dass die Kosten für das Modelltraining sehr hoch sind. Daher ist es tatsächlich entscheidend, wie man das Modelltraining stabil durchführt und wie man weiterhin Kosten senkt und die Effizienz steigert.Vor diesem Hintergrund startete Baidu Intelligent Cloud die heterogene Computing-Plattform Baidu Baige·AI mit dem Ziel, Software und Hardware für KI-Szenarien bereitzustellen. In-One-Lösung. Durch den vierschichtigen Technologie-Stack aus KI-Computing, KI-Speicher, KI-Beschleunigung und KI-Containern erfüllt es die Anforderungen von Geschäftsszenarien der oberen Ebene.
Die KI-Rechenschicht bietet leistungsstarke GPU-, Kunlun- und andere heterogene Chipressourcen, leistungsstarkes RDMA- oder IB-Netzwerk und den selbst entwickelten Super-KI-Computer X-MAN. usw.;
Wenn wir uns daher für die Verwendung eines bestimmten Modellalgorithmus entscheiden, müssen wir ihn bewusst optimieren, um eine bessere Ressourceneffizienz und Trainingseffizienz zu erreichen. Allerdings gibt es hier auch viele technische Herausforderungen:
2. Trainingsleistungs-Overhead-Analyse und Beschleunigungslösung
Da die Optimierung des Modelltrainings selbst eine umfassende Arbeit von Software und Hardware ist und der Technologie-Stack relativ komplex ist, können die heutigen Inhalte definitiv nicht alle Details abdecken. Wir werden unser Bestes geben, um die wichtigsten Ideen abzudecken.
Werfen wir zunächst einen Blick auf die aktuelle Modelltrainingslösung. In der vergangenen Entwicklungsphase gab es zwei wichtige Änderungen bei Modelltrainingslösungen. Zum einen der Wechsel vom Einzelkartentraining zum verteilten Training und zum anderen der Wechsel vom datenparallelen Training zum mehrdimensionalen hybriden Paralleltraining. Die wichtigsten treibenden Punkte hierbei sind die Menge an Trainingsdaten und die Menge an Modellparametern.
Einzelkarten-Trainingsmethode: Bei tatsächlicher Verwendung dieses Modus sind die Anzahl der Modellparameter und das Datenvolumen im Allgemeinen relativ gering und die Trainingszeit einer einzelnen Karte ist akzeptabel. Die Modellparameterskala muss sicherstellen, dass der Videospeicher einer einzelnen Karte während des Trainingsprozesses die obere Speichergrenze erreichen kann. Gemäß der Konfiguration der Videospeicherkapazität der neuen GPU-Karte beträgt die maximale Größe, die im Allgemeinen platziert werden kann, 1 Milliarde Parameter.Wenn die Anzahl der Modellparameter beispielsweise groß genug ist, erreicht die Anzahl der Parameter Dutzende oder Hunderte von Milliarden, und eine einzelne Karte kann nicht das gesamte Modell abdecken. Auch hier werden Modellparallelität oder hybride Parallellösungen verwendet Es treten sowohl Datenparallelität als auch Modellparallelität auf.
Modellparallelität teilt das Modell in verschiedene Karten auf und platziert einen Teil des Modells auf jeder Karte. Dabei wird der Tensor nach den verschiedenen Aufteilungsmethoden unterteilt, z. B. Aufteilung zwischen Schichten und Parallelität Pipeline-Parallelansätze.
Da im allgemeinen Modelltraining häufiger Datenparallelität verwendet wird, konzentrieren wir uns auf Datenparallelität als Beispiel, um die Ideen der Leistungsoptimierung vorzustellen.
Wir verstehen zunächst den Leistungsaufwand im Einzelkarten-Trainingsprozess aus der Gesamtperspektive von Software und Hardware.
Die linke Seite des Bildes unten zeigt unseren Schulungsprozess aus Software-Perspektive. Der Prozess des Einzelkartentrainings umfasst hauptsächlich das Lesen von Daten, die Datenvorverarbeitung, die Vorwärtsberechnungsausgabe und die Verlustberechnung, die Rückwärtsberechnung gemäß der Verlustfunktion, um den Gradienten jedes Schichtparameters zu erhalten, und schließlich die Aktualisierung der Modellparameter entsprechend dem Gradienten. Setzen Sie diesen Vorgang fort, bis das Training konvergiert.
Die rechte Seite des Bildes unten ist ein vereinfachtes Knoten-Hardware-Topologiediagramm. An der Spitze steht der Datenspeicher, der lokaler Speicher oder Netzwerkspeicher sein kann. Dann sind da noch die CPU und der Speicher. Es gibt 8 GPU-Karten, die über mehrere PCIe-Switches mit der Nummer 0 bis 7 verbunden sind, und die 8 Karten sind über NVSwitch miteinander verbunden. Unterschiedliche Recheninstanzen haben unterschiedliche Hardwaretopologien.
Aus Sicht einer einzelnen Karte gibt es daher hauptsächlich Overheads bei E/A, CPU-Vorverarbeitung, Datenkopieren zwischen CPU und GPU, GPU-Berechnung usw.
Dann werfen wir einen Blick auf den Prozess der Datenparallelität.
Die linke Seite der folgenden Abbildung zeigt immer noch den Hauptprozess des Trainings, und die rechte Seite zeigt die Hardware-Topologie eines Trainingsclusters mit 3 Maschinen und 24 Karten. Die 3 Maschinen sind über das Netzwerk miteinander verbunden .
Wir haben im vorherigen Teil auch eingeführt, dass bei der Datenparallelität jedes Gerät die Vorwärts- und Rückwärtsberechnungsprozesse parallel und unabhängig ausführt. Daher tritt bei jedem Trainingsprozess auch der zuvor erwähnte Leistungsaufwand für eine einzelne Karte auf Probleme in der Ausbildung.
Die Datenparallelitätsgarantie entspricht mathematisch dem Einzelkartentraining. Es muss sichergestellt werden, dass die Modellparameter jeder Karte während des Iterationsprozesses konsistent bleiben. Einerseits ist es notwendig, den Initialisierungsstatus der Modellparameter jeder GPU-Karte konsistent zu machen. Dies geschieht normalerweise durch Senden des Parameterstatus auf der ersten Karte an andere Karten vor Beginn des Trainings.
Während des Trainings ist aufgrund der unterschiedlichen Daten, die von jedem Gerät verarbeitet werden, auch der durch Vorwärtsberechnung erhaltene Modellverlustwert unterschiedlich, sodass der Gradient für jedes Gerät auch umgekehrt berechnet werden muss wird gemittelt und die Modellparameter werden mit dem gemittelten Gradientenwert aktualisiert, um sicherzustellen, dass die Modellparameter jeder Karte während des Iterationsprozesses konsistent bleiben.
Die Gradientenmittelung umfasst den Prozess der Kommunikation, einschließlich der Kommunikation zwischen Karten innerhalb von Knoten sowie des Netzwerkkommunikations-Overheads über Knoten hinweg. Die Kommunikation umfasst hier synchrone Kommunikation und asynchrone Kommunikation. Um jedoch die Konvergenz des Modelltrainings sicherzustellen, wird im Allgemeinen die synchrone Kommunikationslösung verwendet, und nachfolgende Optimierungsarbeiten werden auch auf der Grundlage synchroner Kommunikation durchgeführt.
Aus dem oben Gesagten ist ersichtlich, dass die Datenparallelität im Vergleich zum Einzelkartentraining hauptsächlich zusätzlichen Kommunikationsaufwand verursacht.
Durch die obige Analyse wissen wir, dass die Beschleunigung des KI-Trainings nicht nur ein bestimmter Aspekt der Arbeit ist, sondern auch das Laden von Daten, die Modellberechnung und die Verteilung erfordert Kommunikation und andere Dimensionen werden umfassend betrachtet. Das hier erwähnte Laden von Daten umfasst Daten-E/A, Vorverarbeitung, Speicherkopie und andere Prozesse.
In der spezifischen Optimierungspraxis bedeutet die Beschleunigung des Modelltrainings bei einem zu optimierenden Modell eine kontinuierliche Verbesserung des Gesamtdurchsatzes des Trainings (der Anzahl der Proben, die pro Sekunde trainiert werden können). In diesem Prozess können wir im Allgemeinen zunächst den Trainingsdurchsatz einer einzelnen Karte analysieren. Wenn sich der Trainingsdurchsatz einer einzelnen Karte verbessert, können wir uns dann mit der Erweiterung von einer einzelnen Karte auf mehrere Karten befassen, um zu sehen, wie wir das Trainingsbeschleunigungsverhältnis verbessern können mehrere Karten.
Zuallererst, Single-Card-Trainingsoptimierung, das ultimative Optimierungsziel besteht darin, alle Zeit mit GPU-Computing zu verbringen, und die Beschleunigerauslastung beträgt 100 %. Natürlich ist es in der Praxis schwierig, diesen Zustand vollständig zu erreichen, aber wir können unsere Arbeit an diesem Indikator orientieren oder messen.
Der Schlüssel zur Leistungsoptimierung einer einzelnen Karte besteht aus zwei Teilen:
Erweitern Sie dann von einer einzelnen Karte auf mehrere Karten. Das Ziel besteht darin, ein lineares Beschleunigungsverhältnis zu erreichen. Der Indikator des linearen Beschleunigungsverhältnisses gibt lediglich an, ob die Trainingsleistung doppelt so hoch ist wie die einer einzelnen Karte, wenn das Training von 1 Karte auf 2 Karten erweitert wird.
Der Kern besteht darin, die Effizienz der verteilten Kommunikation zu optimieren. Einerseits ist es die Optimierung der Hardwareebene. Andererseits müssen wir in der tatsächlichen Kommunikation überlegen, wie wir vorgehen gute Nutzung der Bandbreitenressourcen des Netzwerks, oder ob der Kommunikationsprozess ausgeblendet werden kann usw.
Im Folgenden gehen wir ausführlich auf diese Aspekte ein.
Das erste ist die Optimierung des Datenladens.
Nachdem wir einen Datenlader instanziiert haben, iterieren wir den Datenlader weiter, um einen Datenstapel für das Modelltraining zu lesen.
Wenn hier keine Optimierung durchgeführt wird, wie im oberen Teil der Abbildung unten gezeigt, werden der Datenladeprozess jeder Charge und der Modelltrainingsprozess jeder Charge tatsächlich nacheinander ausgeführt. Aus der GPU-Perspektive kommt es zu Berechnungslücken, die durch das Laden von Daten verursacht werden, und zu einer Zeitverschwendung bei den Rechenressourcen.
Wie können wir neben der Verwendung besserer Hardware, um die Effizienz des Datenlesens direkt zu verbessern, wie bereits erwähnt, diese noch optimieren?
Tatsächlich gibt es während des KI-Trainingsprozesses zwei Schlüsselfunktionen beim Datenzugriff:
Daher können wir, wenn wir uns nicht auf Änderungen auf Hardwareebene verlassen, den Datenvorabruf durchführen. Beim Training des ersten Datenstapels können wir den nächsten Stapel laden Advance Batch Data ermöglicht die vollständige Parallelisierung des I/O-Prozesses und der Berechnung auf der GPU.
Zunächst müssen wir die vorhandenen Optimierungslösungen im Dataloader sinnvoll nutzen. Stellen Sie zunächst die Hyperparameter „num_workers“ sinnvoll ein und lesen Sie die Daten durch mehrere Dieser Schritt ermöglicht den Vorabruf von Daten aus dem Speichersystem in den Hostspeicher. Die zweite besteht darin, vom Host-Speicher in den GPU-Speicher zu kopieren, was durch den Pinned-Memory-Mechanismus beschleunigt werden kann.
Lassen Sie uns kurz das Hauptprinzip der Pinned-Memory-Beschleunigung vorstellen: Es gibt zwei Arten von Speicherdaten: auslagerbarer Speicher und fixierter Speicher. Die Daten im auslagerbaren Speicher können auf die Festplatte ausgelagert werden. In diesem Fall kann es beim Ausführen von H2D erforderlich sein, zuerst von der Festplatte in den Speicher zu lesen und dann vom Speicher in den Videospeicher zu kopieren. Darüber hinaus müssen Sie beim Kopieren von auslagerbaren Speicherdaten in den GPU-Speicher zunächst einen temporären angehefteten Speicherpuffer erstellen, die Daten vom auslagerbaren Speicher in den angehefteten Speicher kopieren und sie dann an die GPU übertragen, was ebenfalls zusätzliche Datenübertragungsvorgänge erfordert.
Wenn wir jedoch die obige Lösung aktivieren, implementieren wir nur den Vorabruf vom Speichersystem zum Host-Speicher und beschleunigen so die Datenkopiergeschwindigkeit vom Host zum Gerät. Die Speicherkopie vom Host zum Gerät und der eigentliche Berechnungskern werden jedoch weiterhin seriell auf der GPU ausgeführt, d. h. es besteht immer noch eine kleine Zeitlücke auf der GPU.
AIAK hat weitere Optimierungen vorgenommen, um dieses Problem zu lösen, wodurch die Überlappung von H2D und Vorwärtsberechnung realisiert werden kann.
In einem datenparallelen Szenario muss darauf geachtet werden, dass die Daten gleichmäßig aufgeteilt werden müssen.
Wenn die jedem Trainingsprozess zugewiesenen Daten unausgeglichen sind, ist der Berechnungsumfang unterschiedlich, was dazu führt, dass die Abschlusszeit der Vorwärtsberechnung und der Rückwärtsberechnung jedes Prozesses unterschiedlich ist und dann der Prozess Schließt die Berechnung zuerst ab. Während des umgekehrten Prozesses wird zuerst die Gradientenkommunikationsverbindung eingegeben. Da es sich bei der Allreduce-Kommunikation jedoch um einen synchronen Kommunikationsvorgang handelt, müssen alle Prozesse gleichzeitig gestartet und beendet werden wartet darauf, dass alle anderen Prozesse ebenfalls AllReduce initiieren. Erst dann kann der Kommunikationsvorgang gemeinsam abgeschlossen werden. Aufgrund unterschiedlicher Geschwindigkeiten kann es zu Ressourcenleerlaufproblemen kommen.
Um dieses Problem zu lösen, muss jeder Prozess dieselbe Stapelgröße zum Lesen von Daten verwenden und die Datenmenge in jedem Stapel muss ausgeglichen sein. Bilddaten haben für das Training im Allgemeinen eine feste Größe, während NLP-Modelle Anweisungen variabler Länge verarbeiten müssen, was möglicherweise eine spezielle Verarbeitung erfordert. Beispielsweise können Daten auf die gleiche Länge aufgefüllt oder durch Sortieren der Beispiellängen usw. gleichmäßig verteilt werden.
Die Optimierung der Recheneffizienz wird im Folgenden vorgestellt.
Die Berechnung umfasst Vorwärts-, Rückwärts- und Parameteraktualisierungen. Ziel der Optimierung von Berechnungen ist es, die Rechenleistung heterogener Hardware voll auszunutzen. Im Idealfall soll die tatsächliche Rechenleistung des GPU-Chips den theoretischen Höhepunkt erreichen.
Lassen Sie uns es zunächst aus der Perspektive eines einzelnen Bedieners analysieren. Wenn wir uns auf die Durchführung einer Berechnungsoperation auf der GPU vorbereiten, umfasst der vereinfachte Prozess vier Schritte.
Je nach Anteil des Rechen- und Speicherzugriffsaufwands werden Betreiber im Allgemeinen als Rechenengpässe oder Speicherzugriffsengpässe klassifiziert.
Bei der Erweiterung von einem Operator auf ein vollständiges Modelltraining müssen viele Kernel-Berechnungen kontinuierlich durchgeführt werden, sodass zwischen den Kernel-Berechnungen viel Lese- und Schreibvorgänge beim Kernel-Start und Zwischenergebnissen erforderlich sind. Dies führt zu Berechnungslückenproblemen.
Aus dem oben Gesagten ist ersichtlich, dass die Optimierung der Modellberechnungseffizienz eine umfassende Berücksichtigung der Speicherzugriffsoptimierung, Berechnungsoptimierung und anderer Overhead-Optimierung erfordert.
Die erste ist die Operatorfusion. Wenn ein Operator auf der zugrunde liegenden GPU ausgeführt wird, werden ein oder mehrere Kernel-Starts initiiert, und die interaktiven Daten zwischen Kerneln müssen auch durch den Videospeicher geleitet werden. Durch die Operator-Fusion werden mehrere GPU-Kernel für eine einheitliche Initiierung zusammengeführt Ausführung.
Da die Anzahl der auszuführenden Operatoren reduziert wird, kann der Aufwand für die Kernel-Planung und -Initiierung reduziert werden.Eine Möglichkeit, ineffiziente Vorgänge im Modell zu analysieren, handschriftliche Fusionsoperatoren basierend auf Expertenerfahrung. Bei der GPU geht es hauptsächlich um die Forschung und Entwicklung von CUDA-Operatoren, und hier gibt es eine gewisse Schwelle. AIAK-Training bietet eine effiziente und optimierte Betreiberimplementierung basierend auf typischen Modellstrukturen oder Kundenbedürfnissen.
Eine andere Möglichkeit besteht darin, die Lösung zu kompilieren und zu optimieren. Die rechnerische Optimierung wird durch Kompilierung durchgeführt und Code wird automatisch generiert, wodurch die Kosten für die manuelle Optimierung auf unterschiedlicher Hardware reduziert werden. Allerdings sind viele aktuelle Kompilierungslösungen stärker für Inferenz optimiert und Trainingslösungen befinden sich noch in einem rasanten Entwicklungsprozess. Unter dem Gesichtspunkt der ultimativen Leistung wird die Arbeit von Handschriftfusionsoperatoren jedoch noch einige Zeit lang unverzichtbar sein.
Im Folgenden werden einige praktische Fälle der Operatorfusion vorgestellt. Die erste ist die Optimierung typischer Modellnetzwerkstrukturen.Die folgende Abbildung zeigt unsere Berechnungsfusionsoptimierung für das Kernmodul WindowAttention im SwinTransformer-Modell.
WindowAttention-Struktur, die Kernbetriebsformel ist in der folgenden Abbildung dargestellt. Während des Berechnungsprozesses müssen 7 Berechnungskerne nacheinander ausgeführt werden. In Verbindung mit einigen Umformungs- und anderen Konvertierungsvorgängen müssen insgesamt 10 Kernel gestartet werden. Durch die Leistungsanalyse wurde festgestellt, dass während des eigentlichen Ausführungsprozesses der Intervallredundanz-Overhead des Startkernels mehr als 80 % der End-to-End-Zeit ausmacht, was zu einem großen Optimierungsraum für dieses Modul führt.
Durch die Verschmelzung dieser Kernel zu einem wird die Ausführungszeit des gesamten Moduls von 392 Mikrosekunden auf 13 Mikrosekunden reduziert und ein einzelner Operator wird um das 30-fache beschleunigt. Die Trainingseffizienz des gesamten Modells wurde durchgängig um mehr als 20 % beschleunigt.
Die Kernidee dieser Optimierung besteht aus drei Hauptpunkten:
Das Folgende ist die letzte Berechnungsoptimierungsmethode, um die Tensor Core-Recheneinheit vollständig zu nutzen.
Eine GPU enthält im Allgemeinen mehrere SMs, und jeder SM umfasst Rechenkerne unterschiedlicher Datentypen sowie verschiedene Speicherressourcen. Auf der linken Seite der Abbildung unten ist ein schematisches Diagramm eines NVIDIA A100 SM dargestellt. Ein SM enthält 64 FP32 CUDA-Kerne und 4 Tensor-Kerne.
Beim Training des Modells wird standardmäßig hauptsächlich FP32 CUDA Core für die Berechnung verwendet, und Tensor Core ist eine spezielle Hardware-Ausführungseinheit, die aus der Volta-GPU-Serie eingeführt wurde. Sie wird hauptsächlich zur Beschleunigung von Matrizen oder Volumina verwendet . Kumulierte Betriebseffizienz.
Im Vergleich zu FP32 CUDA Core, das nur Berechnungen auf zwei Skalaren gleichzeitig durchführen kann, kann Tensor Core Berechnungen auf zwei Matrizen gleichzeitig durchführen, sodass der Berechnungsdurchsatz von Tensor Core viel höher ist von FP32 CUDA Core.
In A100 unterstützt Tensor Core eine Vielzahl von Gleitkomma-Datentypen. Für Deep-Learning-Training kann es sich um die Modi FP16, BF16 und TF32 handeln.
TF32 wird hauptsächlich in Trainingsszenarien mit einfacher Genauigkeit verwendet. Im Vergleich zum FP32-Training wird der theoretische Rechendurchsatz bei gleichen Anforderungen an die Speicherzugriffsbandbreite um das Achtfache erhöht.
FP16/BF16 wird hauptsächlich in gemischten Präzisionstrainingsszenarien verwendet. Im Vergleich zum FP32-Training werden die Speicherzugriffsanforderungen um die Hälfte reduziert und der theoretische Rechendurchsatz um das 16-fache erhöht.
Mit Tensor Core können Sie die zugrunde liegende cublas- oder cuda-Schnittstelle zum Programmieren verwenden. Für Algorithmenentwickler ist es einfacher, die im Framework bereitgestellte TF32-Trainings- oder Mixed-Precision-Trainingslösung zu verwenden.
Der erste ist der TF32-Trainingsmodus, TF32 wurde von Ampere eingeführt.
TF32 Im Ausdruck von Gleitkommazahlen gibt es 8 Exponentenbits, 10 Mantissenbits und 1 Vorzeichenbit. Das Exponentenbit ist dasselbe wie bei FP32, dh der Datendarstellungsbereich ist derselbe, aber das Mantissenbit ist niedriger als bei FP32 und dasselbe wie bei FP16.
Es ist zu beachten, dass TF32 kein offener numerischer Typ ist, sondern ein Rechenmodus von Tensor Core. Das heißt, Benutzer können keine Gleitkommazahl vom Typ TF32 erstellen.
Wenn TF32 aktiviert ist, konvertiert Tensor Core bei der Berechnung von Matrizen oder Faltungsoperationen automatisch FP32 in TF32. Nach Abschluss der Berechnung ist der Ausgabedatentyp immer noch der FP32-Typ.
TF32-Training ist in einigen Framework-Versionen standardmäßig aktiviert. In einigen Framework-Versionen muss es möglicherweise manuell über Umgebungsvariablen oder Parameterkonfiguration aktiviert werden. Weitere Informationen finden Sie im Benutzerhandbuch des Frameworks .
Da jedoch der Genauigkeitsbereich von TF32 im Vergleich zu FP32 reduziert ist, müssen Sie während des tatsächlichen Trainings auf die Auswirkungen auf die Konvergenzgenauigkeit des Modells achten.
Training mit gemischter Präzision bezieht sich auf die Verwendung der gemischten Präzision FP32 und FP16 für das Training bei gleichzeitiger Minimierung des Verlusts der Modellgenauigkeit.
Die Hauptvorteile des gemischten Präzisionstrainings sind: Im Vergleich zum FP32-Training wird der Speicherbedarf reduziert und es können größere Netzwerke trainiert oder größere Batchgrößen verwendet werden. Die Verwendung einer geringeren Speicherbandbreite kann die Datenübertragung beschleunigen, und Berechnungen mit halber Genauigkeit können auch mathematische Operationen beschleunigen.
Da der Bereich des Exponentenbits und des Mantissenbits von FP16 jedoch kleiner ist als der von FP32 , Daher werden der numerische Darstellungsbereich und die Genauigkeit verringert. Bei der tatsächlichen Verwendung kann es aufgrund des engen Darstellungsbereichs zu numerischen Überlaufproblemen oder aufgrund unzureichender Genauigkeit zu Rundungsfehlern kommen.
Um ähnliche Probleme zu optimieren, gibt es in der gemischten Präzisionstrainingslösung mehrere wichtige technische Aufgaben:
AIAK-Training bietet eine Nutzungsmethode, die mit der nativen Nutzung des Taschenlampenverstärkers kompatibel ist und die Aktivierung des O2-Modus erleichtert.
Das ist auch ein sehr großes Thema und beinhaltet viel Inhalt.
Wie bereits erwähnt, wird die Kommunikation hauptsächlich im verteilten Training eingeführt, da die Erweiterung von einer einzelnen Karte auf mehrere Karten eine gewisse Datensynchronisierung zwischen mehreren Karten erfordert.
Die folgende Abbildung listet eine Gesamtarchitektur zur Kommunikationsoptimierung auf:
Die unterste Schicht ist die Netzwerkprotokollschicht, einschließlich des traditionellen TCP-Netzwerks und derjenigen, die in verwendet werden Trainingsszenarien Immer mehr Hochleistungs-RDMA-Netzwerke sind RoCE oder IB. Baidu Baige bietet auch Unterstützung für diese zugrunde liegenden Netzwerklösungen. Offensichtlich ist die Verbesserung der Hardware-Infrastruktur zur Erhöhung der Netzwerkbandbreite und Reduzierung der Latenz der direkteste und effektivste Weg zur Optimierung der Kommunikationsleistung.Schauen wir uns zunächst die Optimierungsideen auf der Ebene der Kommunikationsstrategie an. Die erste ist die versteckte Kommunikationsoptimierung.
Bei der Datenparallelität wird die Gradientensynchronisationskommunikation während des umgekehrten Trainingsvorgangs durchgeführt. Nachdem der Gradient umgekehrt berechnet wurde, kann der globale Gradientendurchschnitt durchgeführt werden.
Wenn keine Mechanismusoptimierung durchgeführt wird, werden die umgekehrte Berechnung und Kommunikation nacheinander durchgeführt, und es entsteht eine Zeitlücke bei der Berechnung.
Da beim umgekehrten Vorgang keine Datenabhängigkeit zwischen der Kommunikation des vorherigen Gradienten und der Berechnung des nächsten Gradienten besteht, können die Kommunikation des vorherigen Gradienten und die Berechnung des nächsten Gradienten parallelisiert werden. Lassen Sie die zeitaufwändigen Aspekte der beiden sich überschneiden, sodass ein Teil der zeitaufwändigen Kommunikation ausgeblendet werden kann.
Auf der Implementierungsebene werden Kommunikations- und Berechnungsoperatoren normalerweise für verschiedene Cuda-Streams geplant, und Berechnungsoperatoren werden für Berechnungsstreams in verschiedenen Streams geplant und parallel ausgeführt, wodurch eine parallele Überlappung der Gradientenkommunikation und Berechnung in umgekehrter Richtung erreicht wird.
Derzeit ist diese Optimierungsfunktion standardmäßig im Framework aktiviert.
Zweitens: Optimierung der Kommunikationsintegration.
Standardmäßig muss jeder Gradient im Modell einen Kommunikationsvorgang initiieren. Wenn die Größe eines einzelnen Gradienten relativ klein ist, ist die Auslastung der Netzwerkbandbreite bei der tatsächlichen Kommunikation kleiner Datenpakete sehr gering und die Kommunikationsleistung schlecht.
Bei der Kommunikationsfusion werden mehrere Gradienten für eine Kommunikation zusammengeführt. Aus der Analyse des Kommunikations-Overhead-Modells geht hervor, dass sie nicht nur die Bandbreitennutzung verbessern, sondern auch die Initialisierungsverzögerungszeit der Kommunikation reduzieren kann.
Heutzutage unterstützen viele verteilte Trainings-Frameworks standardmäßig auch die Gradientenfusionsstrategie. Einige Implementierungen erfordern zunächst eine Gradientenaushandlung, um die Kommunikationssequenz zu bestimmen.
Obwohl das Framework standardmäßig die Kommunikationsfusion unterstützt, kann die Größe der Gradientenfusion im Allgemeinen über Parameter konfiguriert werden. Benutzer können den geeigneten Fusionsschwellenwert entsprechend den Anforderungen der physischen Umgebung und des Modells anpassen und sollten in der Lage sein, bessere Vorteile zu erzielen.
Wenn Sie sich in einem Trainingsszenario mit geringer Netzwerkbandbreite befinden, z. B. einer TCP-Umgebung mit geringer Bandbreite, kann die Verzögerung bei der Gradientensynchronisation zum größten Leistungsengpass des Trainings werden.
Zur Optimierung der Kommunikationshäufigkeitsreduzierung besteht die einfachste Idee darin, die Stapelgröße zu erhöhen, sodass in jeder Iteration mehr Daten verwendet werden, wodurch die Anzahl der Iterationen verringert wird, was bedeutet, dass das Kommunikationsvolumen verringert wird.
Je größer die Batchgröße, desto besser. Eine größere Batchgröße kann dazu führen, dass die Modellkonvergenzgenauigkeit abnimmt oder sich die Konvergenzgeschwindigkeit verlangsamt. Als Reaktion auf ähnliche Probleme hat die Industrie auch Optimierungsalgorithmen wie LARS und LAMB vorgeschlagen, die ähnliche Probleme durch adaptive Anpassung der Lernrate über Schichten lindern können. AIAK-Training hat ebenfalls Unterstützung hinzugefügt.
Um die Batchgröße zu erhöhen, können Sie bei ausreichendem Videospeicher den Batchsize-Superparameter direkt anpassen. Wenn der Videospeicher knapp ist, können Sie durch Gradientenakkumulation auch mehrere Gradientenkommunikationen überspringen, was tatsächlich einer Erhöhung der Stapelgröße entspricht.
Im Folgenden wird eine Optimierungslösung für die Kommunikationstopologie vorgestellt – hierarchische Topologiekommunikation, die auch auf Situationen abzielt, in denen die Netzwerkbandbreite zwischen Maschinen relativ gering ist.
Durch hierarchische Kommunikation kann die hohe Verbindungsbandbreite innerhalb der Maschine vollständig genutzt werden, während die Auswirkungen einer geringen Netzwerkbandbreite zwischen Maschinen abgeschwächt werden können.
Diese Kommunikationslösung wurde auch in AIAK implementiert. In einer 25-Gbit/s-TCP-Umgebung wurden 4 Maschinen und 32 Karten für das SwinTransformer-Training getestet. Durch geschichtetes Allreduce kann die Leistung um 85 % beschleunigt werden.
Abschließend führen wir eine Optimierung auf der Ebene der zugrunde liegenden Kommunikationsbibliothek ein, die GPU Direct RDMA-Kommunikationstechnologie. Diese Technologie erfordert die Hardwareumgebung zur Unterstützung des RDMA-Netzwerks.
RDMA-Kommunikation ermöglicht es lokalen Anwendungen, den virtuellen Speicher von Remote-Anwendungen im Benutzermodus direkt zu lesen und zu schreiben. Der gesamte Kommunikationsprozess, mit Ausnahme des ersten Schritts der Übermittlung einer Sendeanforderung, der die Beteiligung der CPU erfordert, wird von der abgeschlossen Es sind keine Speicherkopien, keine Systemunterbrechung und keine Softwareverarbeitung erforderlich, sodass eine extrem niedrige Latenz und eine hohe Bandbreite erreicht werden können.
Im GPU-Szenario bietet die GPU Direct RDMA-Technologie außerdem Unterstützung für RDMA, um direkt auf den GPU-Videospeicher zuzugreifen. Dadurch wird das Hin- und Herkopieren von Daten zwischen GPU-Videospeicher und Host-Speicher während der Kommunikation vermieden, wodurch Verzögerungen bei der maschinenübergreifenden Kommunikation weiter reduziert werden.
In tatsächlichen Fällen haben wir jedoch festgestellt, dass einige Benutzer eine RDMA-Umgebung gekauft haben, aber nicht tatsächlich die GDR-Technologie verwendet haben, was zu einer geringen Kommunikationseffizienz geführt hat. Hier sind mehrere wichtige Konfigurationselemente aufgeführt. Wenn Sie ähnliche Probleme haben, können Sie diese beheben und in Ordnung bringen.
Wir haben einige der aktuellen wichtigsten Ideen und Lösungen zur Leistungsoptimierung vorgestellt. Unabhängig von der E/A-Optimierung, der Rechenoptimierung und der Kommunikationsoptimierung geht es bei den einfachsten Optimierungsideen hauptsächlich darum, wie der Betrieb selbst optimiert werden kann kann reduzieren Die Häufigkeit, mit der die Operation ausgeführt wird, oder ob die Operation mit anderen Prozessen parallelisiert werden kann, um den Overhead usw. zu verbergen.
Um es richtig zu aktivieren, muss jeder Benutzer ein klares Verständnis der technischen Implementierungsprinzipien des Frameworks haben. Um die Kosten für die Trainingsoptimierung zu vereinfachen, haben wir das AIAK-Training-Beschleunigungspaket entwickelt.
AIAK-Training baut vollständige Link-Optimierungsfunktionen rund um das Laden von Daten, Modellberechnung, Kommunikation usw. auf. Gleichzeitig werden wir diese Optimierungsfunktionen in einer einfachen und benutzerfreundlichen Oberfläche kapseln, die Benutzer einfügen können Codezeilen zum Vergleichen Bequeme integrierte Nutzung. Gleichzeitig bauen wir auch einen Mechanismus zur automatisierten Optimierung von Strategiekombinationen auf, um Benutzern automatisch bei der Auswahl effektiver Optimierungsstrategien zu helfen.
Bei spezifischer Verwendung können die Komponenten der Beschleunigungsbibliothek unabhängig voneinander installiert und bereitgestellt werden, oder Sie können direkt das von uns bereitgestellte Container-Image verwenden.
Im Folgenden sind einige spezifische Anwendungsfälle aufgeführt.
Wie im Bild unten gezeigt, dient es hauptsächlich der Optimierung des Datenladers. In diesem Szenario ist das Modell relativ klein, die Datensatzgröße ist ebenfalls relativ klein und die reine Berechnungsgeschwindigkeit ist tatsächlich schneller. Die Ladezeit für EPOCHE-übergreifende Daten ist jedoch relativ lang, was dazu führt, dass E/A zeitaufwändig wird der Hauptengpass.
Durch die Verwendung der in AIAK bereitgestellten Prozesswiederverwendung und des vollständigen Prefetch-Mechanismus wird das gesamte Modelltraining um 166 % beschleunigt.
Das Bild unten zeigt einen Fall der Modellberechnungsoptimierung.
Transformer-Klassenmodell-Trainingsszenario: Während des tatsächlichen Trainings ist die Kommunikationsskalierbarkeit nahezu linear, das E/A-Zeitaufwendungsverhältnis ist ebenfalls sehr niedrig und die Berechnung ist der Hauptleistungsengpass.
Für dieses Modell hat AIAK-Training eine Reihe von Optimierungen auf Berechnungsebene durchgeführt, darunter Operatorfusion der Hauptstrukturen, gemischte Präzision, Abstimmung großer Chargen usw., und die Trainingseffizienz des gesamten Modells ist um 169 % gestiegen .
Der Fall in der folgenden Abbildung wendet hauptsächlich die Optimierung auf Kommunikationsebene an und ermöglicht Optimierungsstrategien für Netzwerke mit geringer Bandbreite in der Cloud-TCP-Umgebung. Bei einigen klassischen Modellen wie resnet50, bert und vgg16 kann sie beschleunigt werden 26 % ~78 %.
In autonomen Fahrszenarien haben wir außerdem eine Reihe von Optimierungen der Modelltrainingsleistung für typische 2D-Vision-, 3D-Vision-, Lidar- und Pre-Fusion-Modelle vorgenommen und die Trainingsleistung wurde um 49 % bis 391 % beschleunigt. . .
Das obige ist der detaillierte Inhalt vonAnalyse der KI-Trainingsbeschleunigungsprinzipien und Austausch technischer Praxis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!