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 State Sharding ist PyTorch in der SageMaker Modellparallelitätsbibliothek v1.6.0 und höher verfügbar.
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 Optimizer-Update wird der AllGather Vorgang (als Teil des optimizer.step Aufrufs) über die parallelen Datenränge hinweg ausgeführt, um konsistente 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 Sie eine SageMaker PyTorch ModelTrainer
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
Siehe Passen Sie Ihr PyTorch Trainingsskript an im Abschnitt Tensorparallelität in Kombination mit Pipeline-Parallelität. Für das Skript sind keine weiteren Änderungen erforderlich.