Optimizer-Zustandsfragmentierung - Amazon SageMaker

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.

Optimizer-Zustandsfragmentierung

Die Optimizer-Zustandsfragmentierung ist eine nützliche Technik zur Speichereinsparung, bei der der Optimizer-Zustand (die Menge der Gewichtungen, die den Zustand des Optimierers beschreiben) auf datenparallele Gerätegruppen fragmentiert wird. Sie können das State-Sharding des Optimizers immer dann verwenden, wenn Sie einen Stateful-Optimizer (wie Adam) oder einen FP16 Optimizer (der beide und Kopien der Parameter speichert) verwenden. FP16 FP32

Anmerkung

Das State-Sharding von Optimizer ist PyTorch in der Modellparallelismus-Bibliothek v1.6.0 und höher verfügbar. SageMaker

So wird die Optimizer-Zustandsfragmentierung verwendet

Die Optimizer-Zustandsfragmentierung können Sie aktivieren, indem Sie in der modelparallel Konfiguration "shard_optimizer_state": True einstellen.

Wenn diese Funktion aktiviert ist, partitioniert die Bibliothek die Menge der Modellparameter anhand des Datenparallelitätsgrades. Die Steigungen, die i-ten Partition entsprechen, werden erst im iten Datenparallelrang reduziert. Am Ende des ersten Aufrufs einer smp.step Decorator-Funktion definiert der mit smp.DistributedOptimizer umschlossene Optimizer seine Parameter neu, so dass sie auf diejenigen Parameter beschränkt sind, die der Partition des aktuellen Datenparallelrangs entsprechen. Die neu definierten Parameter werden als virtuelle Parameter bezeichnet und teilen sich den zugrunde liegenden Speicher mit den ursprünglichen Parametern. Beim ersten Aufruf von optimizer.step werden die Optimierer-Zustände anhand dieser neu definierten Parameter erstellt, die aufgrund der ursprünglichen Partition fragmentiert sind. Nach dem Optimierer-Update wird der AllGather Vorgang (als Teil des optimizer.step Aufrufs) über die parallel Datenränge hinweg ausgeführt, um konsistente Parameterstatus zu erreichen.

Tipp

Die Optimizer-Zustandsfragmentierung kann nützlich sein, wenn der Daten-Parallelitätsgrad größer ist als 1 und das Modell mehr als eine Milliarde Parameter hat.

Der Daten-Parallelitätsgrad wird nach (processes_per_host * instance_count / pipeline_parallel_degree) berechnet, und die smp.dp_size() Funktion übernimmt im Hintergrund die Größenanpassung.

Konfigurieren Sie einen SageMaker PyTorch Schätzer

mpi_options = { "enabled" : True, "processes_per_host" : 8, # 8 processes "custom_mpi_options" : "--mca btl_vader_single_copy_mechanism none " } smp_options = { "enabled":True, "parameters": { "microbatches": 4, "pipeline_parallel_degree": 2, # alias for "partitions" "placement_strategy": "cluster", "tensor_parallel_degree": 2, # tp over 2 devices "ddp": True, "shard_optimizer_state": True } }

Passen Sie Ihr PyTorch Trainingsskript an

Weitere Informationen finden Sie unter Anpassen Ihres PyTorch Trainingsskripts im Abschnitt Tensor-Parallelität kombiniert mit Pipeline-Parallelität. Für das Skript sind keine weiteren Änderungen erforderlich.