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.
Gemischtes Präzisionstraining
Die SageMaker Modellparallelismus-Bibliothek (SMP) v2 unterstützt standardmäßig gemischtes Präzisionstraining, indem sie in Open-Source-Frameworks wie FSDP und Transformer Engine integriert wird. PyTorch Weitere Informationen finden Sie unter den folgenden Themen.
Themen
Training mit gemischter Präzision mit FP8 auf P5-Instanzen mithilfe der Transformer Engine
Ausgehend von der SageMaker Modellparallelismus-Bibliothek (SMP) v2.2.0 ist die SMP-Bibliothek in die Transformer EngineMixedPrecision
Anmerkung
SMP v2 bietet FP8-Unterstützung für die folgenden Hugging Face Transformer-Modelle:
-
GPT-NeoX
-
Lama 2
Anmerkung
Diese FP8-Schulung zur P5-Funktion ist in der folgenden Kombination aus Bibliotheken von SageMaker und der Bibliothek verfügbar: PyTorch
-
SMP v2.2.0 und höher
-
das SageMaker Python SDK v2.212.0 und höher
-
PyTorch v2.2.0 und höher
FP8 (8-Bit-Gleitkomma-Präzision) ist ein Datentyp, der sich als weiteres Paradigma zur Beschleunigung des Deep-Learning-Trainings von LLM-Modellen herausgestellt hat. Mit der Veröffentlichung von NVIDIA H100-GPUs, die FP8-Datentypen unterstützen, können Sie von den Vorteilen der Leistungsverbesserungen auf P5-Instances profitieren, die mit den H100-GPUs ausgestattet sind, und gleichzeitig das verteilte Training mit FP8-Training mit gemischter Präzision beschleunigen.
Der FP8-Datentyp unterteilt sich weiter in die Formate E4M3 und E5M2. E4M3 bietet eine bessere Präzision, hat einen begrenzten Dynamikbereich und ist ideal für den Vorwärtspass beim Modelltraining. E5M2 hat einen größeren Dynamikbereich, hat aber eine geringere Präzision und eignet sich besser für den Rückwärtspass, bei dem Präzision weniger wichtig ist und ein größerer Dynamikbereich von Vorteil ist. Daher empfehlen wir Ihnen, das Rezept für die hybride FP8-Strategie zu verwenden, um diese Eigenschaften effektiv
Bei Datentypen mit halber Genauigkeit (FP16 und BF16) lösen globale Verlustskalierungstechniken wie statische Verlustskalierung oder dynamische Verlustskalierung Konvergenzprobleme, die sich aus Informationsverlusten aufgrund von Rundungsgradienten bei halber Genauigkeit ergeben. Der Dynamikbereich von FP8 ist jedoch noch enger, und die Techniken zur globalen Verlustskalierung reichen nicht aus. An diesem Punkt benötigen wir eine detailliertere Skalierungstechnik pro Tensor. Die verzögerte Skalierung ist eine Strategie, bei der ein Skalierungsfaktor auf der Grundlage der maximalen absoluten Werte ausgewählt wird, die in einer Reihe von Tensoren aus früheren Iterationen beobachtet wurden. Bei dieser Strategie gibt es einen Kompromiss: Sie nutzt die vollen Leistungsvorteile der FP8-Berechnung, benötigt aber Speicherplatz, um den Verlauf der Höchstwerte von Tensoren zu speichern. Weitere Informationen zur Strategie der verzögerten Skalierung im Allgemeinen finden Sie im paper FP8 Formats for Deep Learning
In der Praxis ist die Verwendung von FP8 in allen Trainingsszenarien auf P5-Instanzen hilfreich. Wir empfehlen dringend, FP8 wann immer möglich zu aktivieren, um die Trainingsleistung zu verbessern.
SMP v2 unterstützt Transformer Engine von Haus aus. Wenn Sie das FP8-Training mit SMP v2 auf P5-Instanzen von SageMaker (ml.p5.48xlarge
) ausführen, müssen Sie daher nur torch.sagemaker
in Ihr Trainingsskript importieren und weiterhin das native Python-Paket Transformer Engine verwenden. Weitere Informationen zur Verwendung der Transformer Engine für FP8-Trainings im Allgemeinen finden Sie unter Verwenden von FP8 mit Transformer Engine in der NVIDIA Transformer Engine-Dokumentation
import torch.sagemaker as tsm import transformer_engine.pytorch as te from transformer_engine.common.recipe import DelayedScaling, Format # Initialize the SMP torch.sagemaker API. tsm.init() # Define a transformer model and wrap it with the torch.sagemaker.transform API. from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_config(
ModelConfig
) model = tsm.transform(model) # Enable E4M3 during forward pass, E5M2 during backward pass. fp8_format = Format.HYBRID # Create an FP8 recipe. fp8_recipe = DelayedScaling(fp8_format=fp8_format, amax_history_len=32, amax_compute_algo="max") # Enable FP8 autocasting. with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe, fp8_group=tsm.state.world_process_group): out = model(inp) loss = out.sum() loss.backward()
Ein praktisches Beispiel für FP8-Training mit SMP v2 auf P5-Instances finden Sie im Beispiel-Notizbuch unter Accelerate SageMaker PyTorch FSDP Training of LLama-v2
Gemischtes Präzisionstraining PyTorch mit Datentypen mit halber Genauigkeit unter Verwendung von FSDP
SMP v2 unterstützt PyTorch FSDP MixedPrecision
Anmerkung
Dieses Training mit gemischter Präzision und der PyTorch FSDP-Funktion ist in der folgenden Kombination aus Bibliotheken von SageMaker und der PyTorch Bibliothek verfügbar.
-
SMP v2.0.0 und höher
-
das SageMaker Python SDK v2.200.0 und höher
-
PyTorch v2.0.1 und höher
Die Standardmethode, ein Modell für Mixed Precision zu konfigurieren, besteht darinfloat32
, das Modell in zu erstellen und dann FSDP zu erlauben, die Parameter in float16
oder bfloat16
im laufenden Betrieb umzuwandeln, indem eine MixedPrecision
Richtlinie übergeben wird, wie im folgenden Codeausschnitt gezeigt. Weitere Informationen zu Optionen zum Ändern der Parameter, der Reduzierung oder der Puffer dtype
für gemischte Genauigkeit in finden Sie in PyTorch der Dokumentation unter PyTorch FSDP-API MixedPrecision
# Native PyTorch API from torch.distributed.fsdp import MixedPrecision dtype = torch.bfloat16 mixed_precision_policy = MixedPrecision( param_dtype=dtype, reduce_dtype=dtype, buffer_dtype=dtype ) model = FSDP( model, ..., mixed_precision=mixed_precision_policy )
Beachten Sie, dass bei bestimmten Modellen (wie dem Hugging Face Transformers Lama-Modell) Puffer als erwartet werden. float32
Um das Objekt zu verwendenfloat32
, torch.bfloat16
ersetzen Sie es durch torch.float32
in der Zeile, die das Objekt definiert. dtype