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 die Optimizer-Zustandsfragmentierung immer dann verwenden, wenn Sie einen zustandsbehafteten Optimizer (wie Adam) oder einen FP16-Optimizer verwenden (der sowohl FP16- als auch FP32-Kopien der Parameter speichert).
Anmerkung
Optimizer-Zustandsfragmentierung stehen für PyTorch in der SageMaker-Modellparallelitätsbibliothek v1.6.0 und höher zur Verfügung.
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 Daten-Parallelränge hinweg ausgeführt, um gleichbleibende Parameterzustände 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 eines SageMaker PyTorch-Schätzers
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 } }
Anpassen Ihres PyTorch-Trainingsskripts
Siehe den Absatz Anpassen Ihres PyTorch-Trainingsskripts im Abschnitt Tensor-Parallelität kombiniert mit Pipeline-Parallelität. Für das Skript sind keine weiteren Änderungen erforderlich.