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.
PyTorch
Bringen Sie Ihr eigenes PyTorch Modell mit und führen Sie den Trainingsjob mit SageMaker Training Compiler aus. SageMaker
PyTorch Modelle mit Hugging Face Transformers
PyTorch Modelle mit Hugging Face TransformersPyTorch
oder HuggingFace
Estimator und der Konfiguration des Training Compilers einen SageMaker Trainingsjob starten, wenn Sie mit dem nächsten Thema unter fortfahren. Aktivieren Sie den SageMaker Training Compiler
Tipp
Wenn Sie mithilfe von Transformers in Ihrem Trainingsskript einen Tokenizer für ein NLP-Modell erstellen, stellen Sie sicher, dass Sie eine statische Eingabe-Tensorform verwenden, indem Sie padding='max_length'
angeben. Verwenden Sie padding='longest'
nicht, da das Auffüllen der längsten Sequenz im Stapel die Tensorform für jeden Trainingsstapel ändern kann. Die dynamische Eingabeform kann eine Neukompilierung des Modells auslösen und die Gesamttrainingszeit verlängern. Weitere Informationen zu den Auffülloptionen der Transformers-Tokenizer finden Sie unter Padding and Truncation
Themen
Große Sprachmodelle, die die Hugging Face Transformers-Trainer
Klasse verwenden
Wenn Sie die Trainer-Klasse der Transformers-Bibliothek verwenden, müssen Sie keine weiteren Änderungen an Ihrem Trainingsskript vornehmen. SageMaker Der Training Compiler kompiliert Ihr Trainer-Modell automatisch, wenn Sie es über die Estimator-Klasse aktivieren. Der folgende Code zeigt die Grundform eines PyTorch Trainingsskripts mit der Hugging Face Trainer API.
from transformers import Trainer, TrainingArguments training_args=TrainingArguments(**kwargs) trainer=Trainer(args=training_args, **kwargs)
Themen
Für das Training mit einer einzelnen GPU
Sie müssen Ihren Code nicht ändern, wenn Sie die transformers.Trainer
Für verteiltes Training
PyTorch v1.11.0 und höher
Um verteiltes Training mit SageMaker Training Compiler auszuführen, müssen Sie Ihrem Trainingsskript die folgende _mp_fn()
Funktion hinzufügen und die Funktion umschließen. main()
Sie leitet die _mp_fn(index)
Funktionsaufrufen von der SageMaker verteilten Runtime for PyTorch (pytorchxla
) an die main()
Funktion Ihres Trainingsskripts weiter.
def _mp_fn(index): main()
Diese Funktion akzeptiert das index
Argument, um den Rang der aktuellen GPU im Cluster für verteiltes Training anzugeben. Weitere Beispielskripte finden Sie in den Beispielskripten für die Sprachmodellierung von Hugging Face Transformers
Für Transformers v4.17 und früher mit PyTorch v1.10.2 und früher
SageMaker Training Compiler verwendet einen alternativen Mechanismus zum Starten eines verteilten Trainingsjobs, sodass Sie keine Änderungen an Ihrem Trainingsskript vornehmen müssen. Stattdessen verlangt SageMaker Training Compiler, dass Sie ein SageMaker verteiltes Trainings-Launcher-Skript an das entry_point
Argument und Ihr Trainingsskript an das hyperparameters
Argument im SageMaker Hugging Face Face-Schätzer übergeben.
Bewährte Methoden zur Verwendung von Training Compiler mit SageMaker Trainer
-
Stellen Sie sicher, dass Sie SyncFree Optimierer verwenden, indem Sie das
optim
Argumentadamw_torch_xla
beim Einrichten von Transformatoren auf setzen. TrainingArgument. Siehe auch Optimizer in der Hugging Face Transformers Dokumentation. -
Stellen Sie sicher, dass der Durchsatz der Datenverarbeitungspipeline höher ist als der Trainingsdurchsatz. Sie können die
preprocessing_num_workers
Argumentedataloader_num_workers
und die Argumente der Transformatoren optimieren. TrainingArgumentKlasse, um das zu erreichen. In der Regel müssen diese größer oder gleich der Anzahl der GPUs, aber kleiner als die Anzahl der CPUs sein.
Nachdem Sie die Anpassung Ihres Trainingsskripts abgeschlossen haben, fahren Sie mit Ausführen von PyTorch Trainingsaufträgen mit dem SageMaker Training Compiler fort.
PyTorch Direkte Verwendung großer Sprachmodelle (ohne die Hugging Face Transformers Trainer-API)
Wenn Sie über ein Trainingsskript verfügen, das PyTorch direkt verwendet wird, müssen Sie zusätzliche Änderungen an Ihrem PyTorch Trainingsskript vornehmen, um /XLA zu implementieren. PyTorch Folgen Sie den Anweisungen, um Ihr Skript so zu ändern, dass es die /XLA-Primative richtig einrichtet PyTorch.
Themen
Für das Training mit einer einzelnen GPU
-
Importieren Sie die Optimierungsbibliotheken.
import torch_xla import torch_xla.core.xla_model as xm
-
Ändern Sie das Zielgerät auf XLA statt auf
torch.device("cuda")
device=xm.xla_device()
-
Wenn Sie Automatic Mixed Precision
(AMP) verwenden PyTorch, gehen Sie wie folgt vor: -
Ersetzen Sie
torch.cuda.amp
durch Folgendes:import torch_xla.amp
-
Ersetzen Sie
torch.optim.SGD
undtorch.optim.Adam
durch folgendes:import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
-
Ersetzen Sie
torch.cuda.amp.GradScaler
durch Folgendes:import torch_xla.amp.GradScaler as grad_scaler
-
-
Wenn Sie AMP nicht verwenden, ersetzen Sie
optimizer.step()
durch Folgendes:xm.optimizer_step(optimizer)
-
Wenn Sie einen verteilten Dataloader verwenden, fügen Sie Ihren Dataloader in die PyTorch Klasse /XLA ein:
ParallelLoader
import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
-
Fügen Sie
mark_step
am Ende der Trainingsschleife hinzu, wenn Sieparallel_loader
nicht verwenden:xm.mark_step()
-
Verwenden Sie die Model-Checkpoint-Methode von /XLA, um Ihr Training zu überprüfen: PyTorch
xm.save(model.state_dict(), path_to_save)
Nachdem Sie die Anpassung Ihres Trainingsskripts abgeschlossen haben, fahren Sie mit Ausführen von PyTorch Trainingsaufträgen mit dem SageMaker Training Compiler fort.
Für verteiltes Training
Fügen Sie zusätzlich zu den im vorherigen Für das Training mit einer einzelnen GPU Abschnitt aufgeführten Änderungen die folgenden Änderungen hinzu, um den Workload ordnungsgemäß auf die GPUs zu verteilen.
-
Wenn Sie AMP verwenden, füge
all_reduce
danachscaler.scale(loss).backward()
hinzu:gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
-
Wenn Sie Variablen für
local_ranks
undworld_size
setzen müssen, verwende einen ähnlichen Code wie den folgenden:local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
-
Für alle
world_size
(num_gpus_per_node*num_nodes
) größer als1
, müssen Sie einen Train Sampler definieren, der wie folgt aussehen sollte:import torch_xla.core.xla_model as xm if xm.xrt_world_size() > 1: train_sampler=torch.utils.data.distributed.DistributedSampler( train_dataset, num_replicas=xm.xrt_world_size(), rank=xm.get_ordinal(), shuffle=True ) train_loader=torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, sampler=train_sampler, drop_last=args.drop_last, shuffle=False if train_sampler else True, num_workers=args.num_workers )
-
Nehmen Sie die folgenden Änderungen vor, um sicherzustellen, dass Sie das vom
torch_xla distributed
-Modul bereitgestellteparallel_loader
verwenden.import torch_xla.distributed.parallel_loader as pl train_device_loader=pl.MpDeviceLoader(train_loader, device)
Sie
train_device_loader
funktioniert wie ein normaler PyTorch Loader wie folgt:for step, (data, target) in enumerate(train_device_loader): optimizer.zero_grad() output=model(data) loss=torch.nn.NLLLoss(output, target) loss.backward()
Mit all diesen Änderungen sollten Sie in der Lage sein, verteiltes Training mit jedem PyTorch Modell ohne die Transformer Trainer-API zu starten. Beachten Sie, dass diese Anweisungen sowohl für Einzelknoten-Multi-GPU als auch für Multi-GPU mit mehreren Knoten verwendet werden können.
-
Für PyTorch v1.11.0 und höher
Um verteiltes Training mit SageMaker Training Compiler auszuführen, müssen Sie Ihrem Trainingsskript die folgende
_mp_fn()
Funktion hinzufügen und die Funktion umschließen.main()
Sie leitet die_mp_fn(index)
Funktionsaufrufen von der SageMaker verteilten Runtime for PyTorch (pytorchxla
) an diemain()
Funktion Ihres Trainingsskripts weiter.def _mp_fn(index): main()
Diese Funktion akzeptiert das
index
Argument, um den Rang der aktuellen GPU im Cluster für verteiltes Training anzugeben. Weitere Beispielskripte finden Sie in den Beispielskripten für die Sprachmodellierung von Hugging Face Transformers. Für Transformers v4.17 und früher mit PyTorch v1.10.2 und früher
SageMaker Training Compiler verwendet einen alternativen Mechanismus zum Starten eines verteilten Trainingsjobs und verlangt, dass Sie ein SageMaker verteiltes Trainingsstartskript an das
entry_point
Argument und Ihr Trainingsskript an dashyperparameters
Argument im SageMaker Hugging Face Face-Schätzer übergeben.
Nachdem Sie die Anpassung Ihres Trainingsskripts abgeschlossen haben, fahren Sie mit Ausführen von PyTorch Trainingsaufträgen mit dem SageMaker Training Compiler fort.
Bewährte Methoden für die Verwendung SageMaker des Training Compilers mit /XLA PyTorch
Wenn Sie den SageMaker Training Compiler in Ihrem systemeigenen PyTorch Trainingsskript nutzen möchten, sollten Sie sich zunächst mit PyTorch XLA-Geräten vertraut machen.
Anmerkung
In diesem Abschnitt mit bewährten Methoden wird davon ausgegangen, dass Sie die folgenden PyTorch /XLA-Module verwenden:
import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader as pl
Verstehen Sie den Lazy-Modus in /XLA PyTorch
Ein wesentlicher Unterschied zwischen PyTorch /XLA und Native besteht PyTorch darin, dass das PyTorch /XLA-System im Lazy-Modus läuft, während das native System im Eager-Modus läuft. PyTorch Tensoren im Lazy-Modus sind Platzhalter für die Erstellung des Rechengraphen, bis sie nach Abschluss der Kompilierung und Auswertung materialisiert werden. Das PyTorch /XLA-System erstellt den Rechengraphen im laufenden Betrieb, wenn Sie PyTorch APIs aufrufen, um die Berechnung mithilfe von Tensoren und Operatoren zu erstellen. Der Berechnungsgraph wird kompiliert und ausgeführt, wenn xm.mark_step()
explizit oder implizit durch pl.MpDeviceLoader/pl.ParallelLoader
aufgerufen wird, oder wenn Sie explizit den Wert eines Tensors anfordern, z. B. durch den Aufruf von loss.item()
oder print(loss)
.
Minimiere die Anzahl der Verwendungen von und compilation-and-executionspl.MpDeviceLoader/pl.ParallelLoader
xm.step_closure
Um eine optimale Leistung zu erzielen, sollten Sie die unter beschriebenen compilation-and-executionsInitiationsmöglichkeiten berücksichtigen Verstehen Sie den Lazy-Modus in /XLA PyTorch und versuchen, die Anzahl der zu minimieren compilation-and-executions. Im Idealfall compilation-and-execution ist pro Trainingsiteration nur eine erforderlich, die automatisch von pl.MpDeviceLoader/pl.ParallelLoader
initiiert wird. Das MpDeviceLoader
ist für XLA optimiert und sollte nach Möglichkeit immer verwendet werden, um eine optimale Leistung zu erzielen. Während des Trainings möchten Sie vielleicht einige Zwischenergebnisse, wie z. B. die Verlustwerte, untersuchen. In einem solchen Fall sollte das Drucken von faulen Tensoren mit einem Wrap versehen werden, um Unnötiges xm.add_step_closure()
zu vermeiden. compilation-and-executions
Verwenden Sie AMP und syncfree
Optimierer
Das Training im AMP-Modus (Automatic Mixed Precision) beschleunigt Ihre Trainingsgeschwindigkeit erheblich, indem Sie die Tensor-Kerne der NVIDIA-GPUs nutzen. SageMaker Training Compiler bietet syncfree
Optimierer, die für XLA optimiert sind, um die AMP-Leistung zu verbessern. Derzeit sind die folgenden drei syncfree
Optimierer verfügbar und sollten nach Möglichkeit verwendet werden, um eine optimale Leistung zu erzielen.
torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW
Diese syncfree
Optimierer sollten für die Skalierung/Deskalierung mit torch_xla.amp.GradScaler
Gradienten kombiniert werden.
Tipp
Ab PyTorch Version 1.13.1 verbessert der SageMaker Training Compiler die Leistung, indem PyTorch /XLA die Optimierer (wie SGD, Adam, AdamW) in torch.optim
oder transformers.optimization
mit ihren syncfree-Versionen (wie,,) automatisch überschreibt. torch_xla.amp.syncfree
torch_xla.amp.syncfree.SGD
torch_xla.amp.syncfree.Adam
torch_xla.amp.syncfree.AdamW
Sie müssen die Codezeilen, in denen Sie Optimierer definieren, in Ihrem Trainingsskript nicht ändern.