Schritt 1: Ändern Sie Ihr eigenes Trainingsskript mithilfe der Verteilte Modellparallele Bibliothek von SageMaker - Amazon SageMaker KI

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Schritt 1: Ändern Sie Ihr eigenes Trainingsskript mithilfe der Verteilte Modellparallele Bibliothek von SageMaker

In diesem Abschnitt erfahren Sie, wie Sie Ihr Trainingsskript anpassen können, um die Kernfunktionen der Modellparallelitätsbibliothek von Amazon SageMaker AI zu nutzen. Um die bibliotheksspezifischen API-Funktionen und -Parameter zu verwenden, empfehlen wir Ihnen, diese Dokumentation zusammen mit den APIs der parallel Bibliothek des SageMaker-Modells in der SageMaker Python SDK-Dokumentation zu verwenden.

Die in diesen Abschnitten bereitgestellten Beispiele für Trainingsskripte sind vereinfacht und sollen die erforderlichen Änderungen hervorheben, die Sie vornehmen müssen, um die Bibliothek verwenden zu können. Vollständige, lauffähige Notebook-Beispiele, die zeigen, wie ein TensorFlow- oder PyTorch-Trainingsskript mit der SageMaker-Modellparallelismusbibliothek verwendet wird, finden Sie unter Beispiele für die Modellparallelitätsbibliothek v2 von Amazon SageMaker AI.

Teilen Sie das Modell Ihres Trainingsskripts mithilfe der Modellparallelismusbibliothek von SageMaker auf

Es gibt zwei Möglichkeiten, Ihr Trainingsskript so zu ändern, dass das Modellsplitting eingerichtet wird: automatisiertes Splitting oder manuelles Splitting.

Automatisiertes Aufteilen von Modellen

Wenn Sie die Modellparallelitätsbibliothek von SageMaker verwenden, können Sie die Vorteile der automatisierten Modellteilung nutzen, die auch als automatisierte Modellpartitionierung bezeichnet wird. Die Bibliothek verwendet einen Partitionierungsalgorithmus, der den Arbeitsspeicher ausgleicht, die Kommunikation zwischen Geräten minimiert und die Leistung optimiert. Sie können den automatisierten Partitionierungsalgorithmus so konfigurieren, dass Geschwindigkeit oder Speicher optimiert werden.

Alternativ können Sie die manuelle Modell-Splitting verwenden. Wir empfehlen die automatische Modellteilung, sofern Sie mit der Modellarchitektur nicht sehr vertraut sind und eine gute Vorstellung davon haben, wie Sie Ihr Modell effizient partitionieren können.

Funktionsweise

Die automatische Partitionierung erfolgt während des ersten Trainingsschritts, wenn die mit smp.step -dekorierte Funktion zum ersten Mal aufgerufen wird. Während dieses Aufrufs erstellt die Bibliothek zunächst eine Version des Modells im CPU-RAM (um GPU-Speicherbeschränkungen zu vermeiden), analysiert dann das Modelldiagramm und trifft eine Partitionierungsentscheidung. Basierend auf dieser Entscheidung wird jede Modellpartition auf eine GPU geladen, und erst dann wird der erste Schritt ausgeführt. Aufgrund dieser Analyse- und Partitionierungsschritte kann der erste Trainingsschritt länger dauern.

In beiden Frameworks verwaltet die Bibliothek die Kommunikation zwischen Geräten über ihr eigenes Backend, das für AWS die Infrastruktur optimiert ist.

Das Design der automatischen Partition passt sich den Eigenschaften des Frameworks an, und die Bibliothek führt die Partitionierung auf der Granularitätsebene durch, die in jedem Framework natürlicher ist. In TensorFlow kann beispielsweise jede spezifische Operation einem anderen Gerät zugewiesen werden, während in PyTorch die Zuweisung auf Modulebene erfolgt, wo jedes Modul aus mehreren Operationen besteht. Im folgenden Abschnitt werden die Besonderheiten des Designs in den einzelnen Frameworks beschrieben.

Während des ersten Trainingsschritts führt die Modellparallelitätsbibliothek intern einen Tracing-Schritt durch, der dazu dient, den Modellgraphen zu konstruieren und die Tensor- und Parameterformen zu bestimmen. Nach diesem Verfolgungsschritt erstellt die Bibliothek einen Baum, der aus den verschachtelten nn.Module Objekten im Modell sowie aus zusätzlichen Daten besteht, die bei der Ablaufverfolgung gesammelt wurden, wie z. B. die Menge der gespeicherten nn.Parameters und die Ausführungszeit für jedes nn.Module.

Als Nächstes durchläuft die Bibliothek diesen Baum von der Wurzel aus und führt einen Partitionierungsalgorithmus aus, der jedes nn.Module Gerät einem Gerät zuweist, wodurch die Rechenlast (gemessen an der Modulausführungszeit) und die Speichernutzung (gemessen an der gesamten gespeicherten nn.Parameter Größe und den Aktivierungen) ausgeglichen werden. Wenn mehrere Module nn.Modules dasselbe nn.Parameter verwenden, werden diese Module auf demselben Gerät platziert, um zu vermeiden, dass mehrere Versionen desselben Parameters beibehalten werden. Sobald die Entscheidung über die Partitionierung getroffen wurde, werden die zugewiesenen Module und Gewichte auf ihre Geräte geladen.

Anweisungen zur Registrierung des smp.step Decorators in Ihrem PyTorch-Trainingsskript finden Sie unter Automatisiertes Splitten mit PyTorch.

Die Modellparallelitätsbibliothek analysiert die Größen der trainierbaren Variablen und die Graphstruktur und verwendet intern einen Algorithmus zur Graphpartitionierung. Dieser Algorithmus erstellt für jeden Vorgang eine Gerätezuweisung mit dem Ziel, den Kommunikationsaufwand zwischen den Geräten zu minimieren. Dabei gelten zwei Einschränkungen:

  • Ausbalancierung der Anzahl der in jedem Gerät gespeicherten Variablen

  • Ausgleich der Anzahl der auf jedem Gerät ausgeführten Operationen

Wenn Sie speed für optimize (in den Modellparallelitätsparametern im Python-SDK) angeben, versucht die Bibliothek, die Anzahl der Operationen und tf.Variable Objekte in jedem Gerät auszugleichen. Andernfalls versucht sie, die Gesamtgröße von tf.Variables auszugleichen.

Sobald die Entscheidung über die Partitionierung getroffen wurde, erstellt die Bibliothek eine serialisierte Darstellung des Untergraphen, den jedes Gerät ausführen muss, und importiert sie auf jedes Gerät. Bei der Partitionierung platziert die Bibliothek Operationen, die dasselbe tf.Variable verbrauchen, und Operationen, die Teil derselben Keras-Schicht sind, auf demselben Gerät. Es respektiert auch die von TensorFlow auferlegten Colocation-Einschränkungen. Dies bedeutet, dass, wenn es beispielsweise zwei Keras-Ebenen gibt, die sich eine tf.Variable teilen, alle Operationen, die Teil dieser Ebenen sind, auf einem einzigen Gerät platziert werden.

Anweisungen zur Registrierung des smp.step Decorators in Ihrem PyTorch-Trainingsskript finden Sie unter Automatisiertes Teilen mit TensorFlow.

Vergleich der automatisierten Modellaufteilung zwischen Frameworks

In TensorFlow ist die grundlegende Berechnungseinheit a tf.Operation, und TensorFlow stellt das Modell als gerichteten azyklischen Graphen (DAG) von tf.Operations dar. Daher partitioniert die Modellparallelitätsbibliothek diese DAG so, dass jeder Knoten zu einem Gerät gehört. Entscheidend ist, dass tf.Operation Objekte ausreichend reich an anpassbaren Attributen sind und dass sie insofern universell sind, als jedes Modell garantiert aus einem Graphen solcher Objekte besteht.

PyTorch hingegen hat keine äquivalente Vorstellung von Bedienung, die ausreichend umfangreich und universell ist. Die nächste Berechnungseinheit in PyTorch, die diese Eigenschaften aufweist, ist ein nn.Module, die sich auf einer viel höheren Granularitätsstufe befindet. Aus diesem Grund partitioniert die Bibliothek in PyTorch auf dieser Ebene.

Manuelles Aufteilen von Modellen

Wenn Sie manuell angeben möchten, wie Ihr Modell geräteübergreifend partitioniert werden soll, verwenden Sie den smp.partition Kontext-Manager. Anleitungen zum Einrichten des Kontext-Managers für die manuelle Partitionierung finden Sie auf den folgenden Seiten.

Um diese Option zu nutzen, nachdem Sie in Schritt 2 Änderungen vorgenommen haben, müssen Sie auto_partition auf False setzen und ein default_partition in der Framework-Schätzerklasse des SageMaker Python SDK definieren. Jede Operation, die nicht explizit über den smp.partition Kontext-Manager auf einer Partition platziert wurde, wird auf der default_partition ausgeführt. In diesem Fall wird die automatische Aufteilungslogik umgangen und jede Operation wird auf der Grundlage Ihrer Spezifikation platziert. Auf der Grundlage der resultierenden Graphstruktur erstellt die Modellparallelitätsbibliothek automatisch einen Ausführungsplan über die Pipeline.