Accelerate documentation
Accélérateur
Accélérateur
La classe Accelerator est la principale pour activer l'entraînement distribué sur tout type de configuration d'entraînement. Consultez le tutoriel Ajouter Accelerator à votre code pour en savoir plus sur l'ajout de Accelerator à votre script.
Accélérateur
classe accelerate.Accelerator
< source >( device_placement: bool = Truesplit_batches: bool = <object object at 0x7f8c18e61580>mixed_precision: PrecisionType | str | None = Nonegradient_accumulation_steps: int = 1cpu: bool = Falsedataloader_config: DataLoaderConfiguration | None = Nonedeepspeed_plugin: DeepSpeedPlugin | dict[str, DeepSpeedPlugin] | None = Nonefsdp_plugin: FullyShardedDataParallelPlugin | None = Nonetorch_tp_plugin: TorchTensorParallelPlugin | None = Nonemegatron_lm_plugin: MegatronLMPlugin | None = Nonerng_types: list[str | RNGType] | None = Nonelog_with: str | LoggerType | GeneralTracker | list[str | LoggerType | GeneralTracker] | None = Noneproject_dir: str | os.PathLike | None = Noneproject_config: ProjectConfiguration | None = Nonegradient_accumulation_plugin: GradientAccumulationPlugin | None = Nonestep_scheduler_with_optimizer: bool = Truekwargs_handlers: list[KwargsHandler] | None = Nonedynamo_backend: DynamoBackend | str | None = Nonedynamo_plugin: TorchDynamoPlugin | None = Nonedeepspeed_plugins: DeepSpeedPlugin | dict[str, DeepSpeedPlugin] | None = Noneparallelism_config: ParallelismConfig | None = None )
Paramètres
- device_placement (
bool, facultatif, par défautTrue) — Indique si l'accélérateur doit placer les objets sur l'appareil (tenseurs générés par le chargeur de données, modèle, etc…). - mixed_precision (
str, facultatif) — Indique s'il faut utiliser l'entraînement en précision mixte. Choisissez parmi ‘no’,‘fp16’,‘bf16’ ou ‘fp8’. Par défaut, la valeur de la variable d'environnementACCELERATE_MIXED_PRECISIONest utilisée, qui utilise la valeur par défaut de la configuration accelerate du système actuel ou le drapeau passé avec la commandeaccelerate.launch. ‘fp8’ nécessite l'installation de transformers-engine. - gradient_accumulation_steps (
int, facultatif, valeur par défaut 1) — Le nombre d'étapes qui doivent s'écouler avant que les gradients ne soient accumulés. Une valeur > 1 doit être combinée avecAccelerator.accumulate. Si elle n'est pas fournie, la valeur de la variable d'environnementACCELERATE_GRADIENT_ACCUMULATION_STEPSsera utilisée par défaut. Elle peut également être configurée via unGradientAccumulationPlugin. - cpu (
bool, facultatif) — Indique s'il faut forcer l'exécution du script sur le CPU. Si défini surTrue, ignore le GPU disponible et force l'exécution sur un seul processus. - dataloader_config (
DataLoaderConfiguration, facultatif) — Une configuration pour la gestion des dataloaders dans les scénarios distribués. - deepspeed_plugin (DeepSpeedPlugin ou dict de
str— DeepSpeedPlugin, facultatif) : Ajustez vos arguments liés à DeepSpeed à l’aide de cet argument. Cet argument est facultatif et peut être configuré directement à l’aide de accelerate config. En cas d’utilisation de plusieurs plugins, utilisez la propriétékeyconfigurée de chaque plugin pour y accéder viaaccelerator.state.get_deepspeed_plugin(key). Alias dedeepspeed_plugins. - fsdp_plugin (FullyShardedDataParallelPlugin, facultatif) — Ajustez vos arguments liés à FSDP à l'aide de cet argument. Cet argument est facultatif et peut être configuré directement à l'aide de accelerate config
- torch_tp_plugin (
TorchTensorParallelPlugin, facultatif) — Obsolète : utilisezparallelism_configavectp_sizeà la place. - megatron_lm_plugin (MegatronLMPlugin, facultatif) — Ajustez vos arguments liés à MegatronLM à l’aide de cet argument. Cet argument est facultatif et peut être configuré directement à l’aide de accelerate config
- rng_types (liste de
strou RNGType) — La liste des générateurs de nombres aléatoires à synchroniser au début de chaque itération de vos dataloaders préparés. Doit être un ou plusieurs des éléments suivants :"torch": le générateur de nombres aléatoires de base de torch"cuda": le générateur de nombres aléatoires CUDA (GPU uniquement)"xla": le générateur de nombres aléatoires XLA (TPU uniquement)"generator": letorch.Generatordu sampler (ou du batch sampler s’il n’y a pas de sampler dans votre dataloader) ou de l’ensemble de données itérable (s’il existe) si l’ensemble de données sous-jacent est de ce type.
Par défaut, la valeur sera
["torch"]pour les versions de PyTorch <=1.5.1 et["generator"]pour les versions de PyTorch >= 1.6. - log_with (liste de
str, LoggerType ou GeneralTracker, facultatif) — Une liste de loggers à configurer pour le suivi des expériences. Doit être un ou plusieurs des éléments suivants :"all""tensorboard""wandb""trackio""aim""comet_ml""mlflow""dvclive""swanlab"Si"all"est sélectionné, tous les traceurs disponibles dans l’environnement seront récupérés et initialisés. Il est également possible d’accepter des implémentations deGeneralTrackerpour des traceurs personnalisés, et de les combiner avec"all".
- project_config (ProjectConfiguration, facultatif) — Une configuration pour la gestion de la sauvegarde de l'état.
- project_dir (
str,os.PathLike, facultatif) — Un chemin vers un répertoire pour stocker des données telles que les journaux des enregistreurs compatibles localement et, le cas échéant, les points de contrôle enregistrés. - step_scheduler_with_optimizer (
bool, facultatif, valeur par défautTrue) — DéfinirTruesi le planificateur de taux d’apprentissage est incrémenté en même temps que l’optimiseur,Falsesi cela n’est fait que dans certaines circonstances (à la fin de chaque époque, par exemple). - kwargs_handlers (liste de KwargsHandler, facultatif) — Une liste de KwargsHandler pour personnaliser la création des objets liés à l’entraînement distribué, au profilage ou à la précision mixte. Voir kwargs pour plus d’informations.
- dynamo_backend (
strou DynamoBackend, facultatif, par défaut"no") — Définissez l’un des backends dynamo possibles pour optimiser votre entraînement avec torch dynamo. - dynamo_plugin (TorchDynamoPlugin, facultatif) —
Une configuration pour la gestion de torch dynamo, si des ajustements plus poussés que le simple
backendoumodesont nécessaires. - gradient_accumulation_plugin (GradientAccumulationPlugin, facultatif) —
Une configuration pour la gestion de l’accumulation des gradients, si des ajustements plus poussés que le simple paramètre
gradient_accumulation_stepssont nécessaires.
Crée une instance d'accélérateur pour l'entraînement distribué ou l'entraînement en précision mixte.
Attributs disponibles :
- device (
torch.device) — L'appareil à utiliser. - distributed_type (DistributedType) — La configuration d’entraînement distribué.
- local_process_index (
int) — L'index du processus sur la machine actuelle. - mixed_precision (
str) — Le mode de précision mixte configuré. - num_processes (
int) — Le nombre total de processus utilisés pour l'entraînement. - optimizer_step_was_skipped (
bool) — Indique si la mise à jour de l’optimiseur a été ignorée (en raison d’un dépassement de gradient en précision mixte), auquel cas le taux d’apprentissage ne doit pas être modifié. - process_index (
int) — L'index global du processus actuel parmi tous les processus. - state (AcceleratorState) — L'état de la configuration distribuée.
- sync_gradients (
bool) — Indique si les gradients sont actuellement synchronisés entre tous les processus. - use_distributed (
bool) — Indique si la configuration actuelle est destinée à l'entraînement distribué.
accumulate
< source >( *models )
Un gestionnaire de contexte qui enveloppe légèrement et effectue l'accumulation des gradients automatiquement
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=1)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, output in dataloader:
... with accelerator.accumulate(model):
... outputs = model(input)
... loss = loss_func(outputs)
... loss.backward()
... optimizer.step()
... scheduler.step()
... optimizer.zero_grad()Appliquera la précision mixte automatique à l'intérieur du bloc dans ce gestionnaire de contexte, si elle est activée. Rien de différent ne se produira sinon.
Un autocast_handler différent peut être transmis pour remplacer celui défini dans l'objet Accelerator. Cela est
utile dans les blocs sous autocast où vous souhaitez revenir au fp32.
Échelle les gradients conformément au GradientAccumulationPlugin et appelle le backward() approprié en fonction de la configuration.
Doit être utilisé à la place de loss.backward().
Vérifie si le tenseur de déclenchement interne a été défini à 1 dans l'un des processus. Si c'est le cas, renvoie True et réinitialise le tenseur de déclenchement à 0.
Note :
N'exige pas wait_for_everyone()
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume later in the training script
>>> # `should_do_breakpoint` is a custom function to monitor when to break,
>>> # e.g. when the loss is NaN
>>> if should_do_breakpoint(loss):
... accelerator.set_trigger()
>>> # Assume later in the training script
>>> if accelerator.check_trigger():
... breakAlias de Accelerate.free_memory, libère toutes les références aux objets internes stockés et appelle le collecteur de déchets. Vous devez appeler cette méthode entre deux entraînements avec des modèles/optimiseurs différents.
clip_grad_norm_
< source >( parametersmax_normnorm_type = 2 ) → torch.Tensor
Retourne
torch.Tensor
Norme totale des gradients des paramètres (considérés comme un seul vecteur).
Doit être utilisé à la place de torch.nn.utils.clip_grad_norm_.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=2)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, target in dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... if accelerator.sync_gradients:
... accelerator.clip_grad_norm_(model.parameters(), max_grad_norm)
... optimizer.step()Doit être utilisé à la place de torch.nn.utils.clip_grad_value_.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(gradient_accumulation_steps=2)
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> for input, target in dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... if accelerator.sync_gradients:
... accelerator.clip_grad_value_(model.parameters(), clip_value)
... optimizer.step()Ceci est normalement appelé dans le cadre de prepare, mais lorsque le dataloader a été préparé séparément du modèle (pour l'appel externe accelerator.prepare), cet appel supplémentaire doit être effectué après prepare(model) (voir HF Trainer comme cas d'utilisation).
Exécute les comportements spéciaux de fin d’entraînement, tels que l’arrêt des traceurs uniquement sur le processus principal ou la destruction du groupe de processus. Doit toujours être appelé à la fin de votre script si vous utilisez le suivi d’expériences.
Libérera toutes les références aux objets internes stockés et appellera le collecteur de déchets. Vous devez appeler cette méthode entre deux entraînements avec des modèles/optimiseurs différents. Réinitialisera également Accelerator.step à 0.
gather
< source >( tensor ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
Paramètres
- tensor (
torch.Tensor, ou un tuple/liste/dictionnaire imbriqué detorch.Tensor) — Les tenseurs à collecter sur tous les processus.
Retourne
torch.Tensor, ou un tuple/liste/dictionnaire imbriqué de torch.Tensor
Le(s) tenseur(s) collecté(s). Notez que la première dimension du résultat est num_processes multipliée par la première dimension des tenseurs d'entrée.
Rassemble les valeurs de tensor sur tous les processus et les concatène sur la première dimension. Utile pour regrouper les prédictions de tous les processus lors de l'évaluation.
Note : Cette opération de regroupement s'effectue dans tous les processus.
Exemple :
>>> # Assuming four processes
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.tensor([accelerator.process_index], device=accelerator.device)
>>> gathered_tensor = accelerator.gather(process_tensor)
>>> gathered_tensor
tensor([0, 1, 2, 3])gather_for_metrics
< source >( input_datause_gather_object = False )
Paramètres
- input_data (
torch.Tensor,object, un tuple/liste/dictionnaire imbriqué detorch.Tensor, ou un tuple/liste/dictionnaire imbriqué deobject) — Les tenseurs ou objets pour le calcul des métriques sur tous les processus - use_gather_object(
bool) — Indique s'il faut forcer l'utilisation de gather_object au lieu de gather (ce qui est déjà le cas si aucun des objets transmis ne contient de tenseurs). Ce drapeau peut être utile pour regrouper des tenseurs de tailles différentes que l'on ne souhaite ni compléter (padding) ni concaténer le long de la première dimension. Son utilisation avec des tenseurs GPU est mal prise en charge et inefficace, car elle entraîne un transfert GPU -> CPU, les tenseurs devant être sérialisés (pickled).
Réunit input_data et supprime éventuellement les doublons dans le dernier lot si le système est distribué. Doit être utilisé pour rassembler les entrées et les cibles en vue du calcul des métriques.
Exemple :
>>> # Assuming two processes, with a batch size of 5 on a dataset with 9 samples
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader = torch.utils.data.DataLoader(range(9), batch_size=5)
>>> dataloader = accelerator.prepare(dataloader)
>>> batch = next(iter(dataloader))
>>> gathered_items = accelerator.gather_for_metrics(batch)
>>> len(gathered_items)
9get_state_dict
< source >( modelunwrap = True ) → dict
Paramètres
- model (
torch.nn.Module) — Un modèle PyTorch passé par Accelerator.prepare() - unwrap (
bool, facultatif, par défautTrue) — Indique s'il faut retourner le state_dict sous-jacent original demodelou le state_dict encapsulé
Retourne
dict
Le dictionnaire d'état du modèle, potentiellement sans précision complète.
Retourne le dictionnaire d'état d'un modèle transmis via Accelerator.prepare(), potentiellement sans pleine précision.
get_tracker
< source >( name: strunwrap: bool = False ) → GeneralTracker
Retourne un tracker depuis self.trackers en fonction de name, uniquement sur le processus principal.
join_uneven_inputs
< source >( joinableseven_batches = None )
Paramètres
- joinables (
list[torch.distributed.algorithms.Joinable]) — Une liste de modèles ou d’optimiseurs qui sous-classenttorch.distributed.algorithms.Joinable. Le plus souvent, il s’agit d’un Module PyTorch préparé avecAccelerator.preparepour l’entraînement DistributedDataParallel. - even_batches (
bool, facultatif) — Si défini, cette valeur écrasera la valeur deeven_batchesdéfinie dans leAccelerator. Si elle n’est pas fournie, la valeur par défaut duAcceleratorsera utilisée.
Un gestionnaire de contexte qui facilite l’entraînement ou l’évaluation distribués sur des entrées inégales, agissant comme un wrapper autour de torch.distributed.algorithms.join. Cela est utile lorsque la taille totale du lot ne divise pas uniformément la longueur du jeu de données.
join_uneven_inputsn'est pris en charge que pour l'entraînement Distributed Data Parallel sur plusieurs GPU. Pour toute autre configuration, cette méthode n'aura aucun effet.
L'écrasement de
even_batchesn'affecte pas les chargeurs de données de type itérable.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator(even_batches=True)
>>> ddp_model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
>>> with accelerator.join_uneven_inputs([ddp_model], even_batches=False):
... for input, output in dataloader:
... outputs = model(input)
... loss = loss_func(outputs)
... loss.backward()
... optimizer.step()
... optimizer.zero_grad()load_state
< source >( input_dir: str | None = Noneload_kwargs: dict | None = None**load_model_func_kwargs )
Paramètres
- input_dir (
strouos.PathLike) — Le nom du dossier dans lequel tous les poids et états pertinents ont été enregistrés. Peut êtreNonesiautomatic_checkpoint_namingest utilisé, auquel cas le dernier point de contrôle sera sélectionné. - load_kwargs (
dict, facultatif) — Arguments supplémentaires pour la fonctionloadsous-jacente, tels que les arguments facultatifs pour state_dict et optimizer. - load_model_func_kwargs (
dict, facultatif) — Arguments supplémentaires par mot-clé pour le chargement du modèle, qui peuvent être transmis à la fonction de chargement sous-jacente, tels que les arguments facultatifs de la fonctionload_checkpointde DeepSpeed ou unmap_locationpour charger le modèle et l’optimiseur.
Charge les états actuels du modèle, de l'optimiseur, du scaler, des générateurs RNG et des objets enregistrés.
À n'utiliser qu'en conjonction avec Accelerator.save_state(). Si un fichier n'est pas enregistré pour le checkpointing, il ne sera pas chargé s'il est stocké dans le répertoire.
Permet au processus principal local d'entrer dans un bloc with.
Les autres processus entreront dans le bloc with après la sortie du processus principal.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> with accelerator.local_main_process_first():
... # This will be printed first by local process 0 then in a seemingly
... # random order by the other processes.
... print(f"This will be printed by process {accelerator.local_process_index}")Exécute la passe arrière sur les optimiseurs LOMO.
Permet au processus principal de passer en premier dans un bloc with.
Les autres processus entreront dans le bloc with après la sortie du processus principal.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> with accelerator.main_process_first():
... # This will be printed first by process 0 then in a seemingly
... # random order by the other processes.
... print(f"This will be printed by process {accelerator.process_index}")maybe_context_parallel
< source >( buffers: list[torch.Tensor] | None = Nonebuffer_seq_dims: list[int] | None = Noneno_restore_buffers: set[torch.Tensor] | None = None )
Paramètres
- buffers (
list[torch.Tensor],optional) — Buffers qui seront fractionnés le long de la dimension de séquence. Les exemples courants sont les entrées, les étiquettes ou les buffers d'embeddings positionnels. Ce gestionnaire de contexte modifiera ces buffers sur place, et après la sortie du contexte, les buffers seront restaurés à leur état d'origine. Pour éviter des restaurations inutiles, vous pouvez utiliserno_restore_bufferspour spécifier quels buffers n'ont pas besoin d'être restaurés. - buffer_seq_dims (
list[int],optional) — Dimensions de séquence desbuffers. - no_restore_buffers (
set[torch.Tensor],optional) — Cet ensemble doit être un sous-ensemble debuffers. Il spécifie quels buffers de l'argumentbuffersne seront pas restaurés après la sortie du contexte. Ces buffers seront alors conservés dans un état fragmenté.
Un gestionnaire de contexte qui permet l'entraînement parallèle par contexte.
context_parallelest actuellement pris en charge avec FSDP2 et nécessiteparallelism_config.cp_size>
- Si l'une de ces conditions n'est pas remplie, ce gestionnaire de contexte n'aura aucun effet, bien qu'il ne lève pas d'Exception afin de limiter les modifications de code nécessaires.
Ce gestionnaire de contexte doit être recréé à chaque étape d’entraînement, comme le montre l’exemple ci-dessous.
no_sync
< source >( model )
Un gestionnaire de contexte pour désactiver la synchronisation des gradients entre les processus DDP en appelant torch.nn.parallel.DistributedDataParallel.no_sync.
Si model n'est pas en DDP, ce gestionnaire de contexte ne fait rien
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer = accelerator.prepare(dataloader, model, optimizer)
>>> input_a = next(iter(dataloader))
>>> input_b = next(iter(dataloader))
>>> with accelerator.no_sync():
... outputs = model(input_a)
... loss = loss_func(outputs)
... accelerator.backward(loss)
... # No synchronization across processes, only accumulate gradients
>>> outputs = model(input_b)
>>> accelerator.backward(loss)
>>> # Synchronization across all processes
>>> optimizer.step()
>>> optimizer.zero_grad()on_last_process
< source >( function: Callable[..., Any] )
Un décorateur qui exécute la fonction décorée uniquement sur le dernier processus. Peut également être appelé à l'aide de la classe PartialState.
on_local_main_process
< source >( function: Callable[..., Any] | None = None )
Un décorateur qui exécute la fonction décorée uniquement sur le processus principal local. Peut également être appelé à l'aide de la classe PartialState.
Exemple :
# Assume we have 2 servers with 4 processes each.
from accelerate import Accelerator
accelerator = Accelerator()
@accelerator.on_local_main_process
def print_something():
print("This will be printed by process 0 only on each server.")
print_something()
# On server 1:
"This will be printed by process 0 only"
# On server 2:
"This will be printed by process 0 only"on_local_process
< source >( function: Callable[..., Any] | None = Nonelocal_process_index: int | None = None )
Un décorateur qui exécute la fonction décorée uniquement sur un index de processus local donné. Peut également être appelé à l’aide de la classe PartialState.
Exemple :
# Assume we have 2 servers with 4 processes each.
from accelerate import Accelerator
accelerator = Accelerator()
@accelerator.on_local_process(local_process_index=2)
def print_something():
print(f"Printed on process {accelerator.local_process_index}")
print_something()
# On server 1:
"Printed on process 2"
# On server 2:
"Printed on process 2"on_main_process
< source >( function: Callable[..., Any] | None = None )
Un décorateur qui exécute la fonction décorée uniquement sur le processus principal. Peut également être appelé à l'aide de la classe PartialState.
on_process
< source >( function: Callable[..., Any] | None = Noneprocess_index: int | None = None )
Un décorateur qui exécute la fonction décorée uniquement sur un index de processus donné. Peut également être appelé à l'aide de la classe PartialState.
pad_across_processes
< source >( tensordim = 0pad_index = 0pad_first = False ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
Paramètres
- tensor (liste/tuple/dictionnaire imbriqué de
torch.Tensor) — Les données à collecter. - dim (
int, facultatif, valeur par défaut 0) — La dimension sur laquelle effectuer le bourrage. - pad_index (
int, facultatif, valeur par défaut 0) — La valeur utilisée pour le bourrage. - pad_first (
bool, facultatif, par défautFalse) — Indique s'il faut ajouter des jetons de bourrage au début ou à la fin.
Retourne
torch.Tensor, ou un tuple/liste/dictionnaire imbriqué de torch.Tensor
Le ou les tenseurs rembourrés.
Rembourrer récursivement les tenseurs d'une liste/tuple/dictionnaire imbriqué de tenseurs provenant de tous les appareils à la même taille afin qu'ils puissent être collectés en toute sécurité.
Exemple :
>>> # Assuming two processes, with the first processes having a tensor of size 1 and the second of size 2
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.arange(accelerator.process_index + 1).to(accelerator.device)
>>> padded_tensor = accelerator.pad_across_processes(process_tensor)
>>> padded_tensor.shape
torch.Size([2])prepare
< source >( *argsdevice_placement = None )
Paramètres
- *args (liste d'objets) —
L'un des types d'objets suivants :
torch.utils.data.DataLoader: Dataloader PyTorchtorch.nn.Module: Module PyTorchtorch.optim.Optimizer: Optimiseur PyTorchtorch.optim.lr_scheduler.LRScheduler: Planificateur de taux d'apprentissage PyTorch
- device_placement (
list[bool], facultatif) — Utilisé pour personnaliser si le placement automatique des appareils doit être effectué pour chaque objet transmis. Doit être une liste de la même longueur queargs. Non compatible avec DeepSpeed ou FSDP.
Prépare tous les objets passés dans args pour l’entraînement distribué et la précision mixte, puis les renvoie dans le même ordre.
Vous n'avez pas besoin de préparer un modèle si vous l'utilisez uniquement pour l'inférence sans aucun type de précision mixte
Exemples :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume a model, optimizer, data_loader and scheduler are defined
>>> model, optimizer, data_loader, scheduler = accelerator.prepare(model, optimizer, data_loader, scheduler)>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume a model, optimizer, data_loader and scheduler are defined
>>> device_placement = [True, True, False, False]
>>> # Will place the first two items passed in automatically to the right device but not the last two.
>>> model, optimizer, data_loader, scheduler = accelerator.prepare(
... model, optimizer, data_loader, scheduler, device_placement=device_placement
... )prepare_data_loader
< source >( data_loader: torch.utils.data.DataLoaderdevice_placement = Noneslice_fn_for_dispatch = None )
Paramètres
- data_loader (
torch.utils.data.DataLoader) — Un DataLoader PyTorch standard pour préparer - device_placement (
bool, facultatif) — Indique s'il faut placer les lots sur le bon appareil dans le chargeur de données préparé. La valeur par défaut estself.device_placement. - slice_fn_for_dispatch (
Callable, optional) -- If passed, this function will be used to slice tensors acrossnum_processes. Will default to [slice_tensors()](/docs/accelerate/main/en/package_reference/utilities#accelerate.utils.slice_tensors). This argument is used only whendispatch_batchesis set toTrue` and will be ignored otherwise.
Prépare un DataLoader PyTorch pour l'entraînement dans toute configuration distribuée. Il est recommandé d'utiliser Accelerator.prepare() à la place.
prepare_model
< source >( model: torch.nn.Moduledevice_placement: bool | None = Noneevaluation_mode: bool = False )
Paramètres
- model (
torch.nn.Module) — Un modèle PyTorch à préparer. Vous n’avez pas besoin de préparer un modèle s’il est utilisé uniquement pour l’inférence sans aucun type de précision mixte - device_placement (
bool, facultatif) — Indique s'il faut placer le modèle sur le bon appareil. La valeur par défaut estself.device_placement. - evaluation_mode (
bool, facultatif, par défautFalse) — Indique s'il faut configurer le modèle uniquement pour l'évaluation, en appliquant simplement la précision mixte ettorch.compile(si configuré dans l'objetAccelerator).
Prépare un modèle PyTorch pour l'entraînement dans toute configuration distribuée. Il est recommandé d'utiliser Accelerator.prepare() à la place.
prepare_optimizer
< source >( optimizer: torch.optim.Optimizerdevice_placement = None )
Prépare un Optimizer PyTorch pour l'entraînement dans toute configuration distribuée. Il est recommandé d'utiliser Accelerator.prepare() à la place.
prepare_scheduler
< source >( scheduler: LRScheduler )
Prépare un planificateur PyTorch pour l'entraînement dans toute configuration distribuée. Il est recommandé d'utiliser Accelerator.prepare() à la place.
Remplacement direct de print() pour n'imprimer qu'une seule fois par serveur.
profil
< source >( profile_handler: ProfileKwargs | None = None )
Profilera le code à l’intérieur du gestionnaire de contexte. Le profil sera enregistré dans un fichier Chrome Trace si profile_handler.output_trace_dir est défini.
Un profile_handler différent peut être transmis pour remplacer celui défini dans l'objet Accelerator.
Exemple :
# Profile with default settings
from accelerate import Accelerator
from accelerate.utils import ProfileKwargs
accelerator = Accelerator()
with accelerator.profile() as prof:
train()
accelerator.print(prof.key_averages().table())
# Profile with the custom handler
def custom_handler(prof):
print(prof.key_averages().table(sort_by="self_cpu_time_total", row_limit=10))
kwargs = ProfileKwargs(schedule_option=dict(wait=1, warmup=1, active=1), on_trace_ready=custom_handler)
accelerator = Accelerator(kwarg_handler=[kwargs])
with accelerator.profile() as prof:
for _ in range(10):
train_iteration()
prof.step()
# Profile and export to Chrome Trace
kwargs = ProfileKwargs(output_trace_dir="output_trace")
accelerator = Accelerator(kwarg_handler=[kwargs])
with accelerator.profile():
train()reduce
< source >( tensorreduction = 'sum'scale = 1.0 ) → torch.Tensor, or a nested tuple/list/dictionary of torch.Tensor
Paramètres
- tensor (
torch.Tensor, ou un tuple/liste/dictionnaire imbriqué detorch.Tensor) — Les tenseurs à réduire sur tous les processus. - reduction (
str, facultatif, par défaut “sum”) — Un type de réduction, peut être ‘sum’, ‘mean’, ‘max’ ou ‘none’. Si ‘none’, aucune opération n’est effectuée. - scale (
float, facultatif, valeur par défaut 1.0) — Valeur de mise à l'échelle par défaut à appliquer après la réduction, uniquement valide sur XLA.
Retourne
torch.Tensor, ou un tuple/liste/dictionnaire imbriqué de torch.Tensor
Le ou les tenseurs réduits.
Réduire les valeurs de tensor sur tous les processus en fonction de reduction.
Note : Tous les processus reçoivent la valeur réduite.
Exemple :
>>> # Assuming two processes
>>> import torch
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> process_tensor = torch.arange(accelerator.num_processes) + 1 + (2 * accelerator.process_index)
>>> process_tensor = process_tensor.to(accelerator.device)
>>> reduced_tensor = accelerator.reduce(process_tensor, reduction="sum")
>>> reduced_tensor
tensor([4, 6])Prend note des objects et les enregistre ou les charge lors de l'appel à save_state ou load_state.
Ils doivent être utilisés lorsque l'état est chargé ou enregistré dans le même script. Ils ne sont pas conçus pour être utilisés dans des scripts différents.
Chaque
objectdoit disposer des fonctionsload_state_dictetstate_dictpour être stocké.
register_load_state_pre_hook
< source >( hook: Callable[..., None] ) → torch.utils.hooks.RemovableHandle
Paramètres
- hook (
Callable) — Une fonction à appeler dans Accelerator.load_state() avantload_checkpoint.
Retourne
torch.utils.hooks.RemovableHandle
un gestionnaire qui peut être utilisé pour supprimer le hook ajouté en appelant
handle.remove()
Enregistre un pré-hook à exécuter avant l’appel de load_checkpoint dans Accelerator.load_state().
Le hook doit avoir la signature suivante :
hook(models: list[torch.nn.Module], input_dir: str) -> None
L'argument models correspond aux modèles tels qu'ils sont enregistrés dans l'état de l'accélérateur sous accelerator._models, et l'argument input_dir est l'argument input_dir transmis à Accelerator.load_state().
À n'utiliser qu'en conjonction avec Accelerator.register_save_state_pre_hook(). Peut s'avérer utile pour charger des configurations en plus des poids du modèle. Peut également être utilisé pour remplacer le chargement du modèle par une méthode personnalisée. Dans ce cas, veillez à retirer les modèles déjà chargés de la liste des modèles.
register_save_state_pre_hook
< source >( hook: Callable[..., None] ) → torch.utils.hooks.RemovableHandle
Paramètres
- hook (
Callable) — Une fonction à appeler dans Accelerator.save_state() avantsave_checkpoint.
Retourne
torch.utils.hooks.RemovableHandle
un gestionnaire qui peut être utilisé pour supprimer le hook ajouté en appelant
handle.remove()
Enregistre un pré-hook à exécuter avant l'appel de save_checkpoint dans Accelerator.save_state().
Le hook doit avoir la signature suivante :
hook(models: list[torch.nn.Module], weights: list[dict[str, torch.Tensor]], input_dir: str) -> None
L'argument models correspond aux modèles tels qu'enregistrés dans l'état de l'accélérateur sous accelerator._models, l'argument weights correspond aux dictionnaires d'état des models, et l'argument input_dir est l'argument input_dir transmis à Accelerator.load_state().
À n'utiliser qu'en conjonction avec Accelerator.register_load_state_pre_hook(). Peut s'avérer utile pour enregistrer des configurations en plus des poids du modèle. Peut également être utilisé pour remplacer l'enregistrement du modèle par une méthode personnalisée. Dans ce cas, veillez à retirer les poids déjà chargés de la liste des poids.
save
< source >( objfsafe_serialization = False )
Enregistrez l'objet passé sur le disque une fois par machine. Utilisez à la place de torch.save.
Note :
Si save_on_each_node a été transmis dans un ProjectConfiguration, l'objet sera enregistré une fois par nœud,
plutôt qu'une seule fois sur le nœud principal.
save_model
< source >( model: torch.nn.Modulesave_directory: Union[str, os.PathLike]max_shard_size: Union[int, str] = '10GB'safe_serialization: bool = True )
Paramètres
- model — (
torch.nn.Module) : Modèle à enregistrer. Le modèle peut être enveloppé ou non. - save_directory (
strouos.PathLike) — Répertoire de destination. Sera créé s'il n'existe pas. - max_shard_size (
intoustr, facultatif, défaut :"10GB") — Taille maximale d'un checkpoint avant son fractionnement. Les shards du checkpoint auront chacun une taille inférieure à cette valeur. S'il est exprimé sous forme de chaîne, il doit être composé de chiffres suivis d'une unité (comme"5MB").Si un seul poids du modèle est plus grand que
max_shard_size, il sera placé dans sa propre partition de point de contrôle, qui sera plus grande quemax_shard_size. - safe_serialization (
bool, facultatif, valeur par défautTrue) — Indique si le modèle doit être enregistré à l'aide desafetensorsou de la méthode traditionnelle de PyTorch (qui utilisepickle).
Enregistrer un modèle afin qu'il puisse être rechargé à l'aide de load_checkpoint_in_model
save_state
< source >( output_dir: str | None = Nonesafe_serialization: bool = True**save_model_func_kwargs )
Paramètres
- output_dir (
strouos.PathLike) — Le nom du dossier dans lequel enregistrer tous les poids et états pertinents. - safe_serialization (
bool, facultatif, valeur par défautTrue) — Indique si le modèle doit être enregistré à l'aide desafetensorsou de la méthode traditionnelle de PyTorch (qui utilisepickle). - save_model_func_kwargs (
dict, facultatif) — Arguments supplémentaires par mot-clé pour l'enregistrement du modèle, qui peuvent être transmis à la fonction d'enregistrement sous-jacente, tels que les arguments facultatifs de la fonctionsave_checkpointde DeepSpeed.
Enregistre les états actuels du modèle, de l’optimiseur, du scaler, des générateurs RNG et des objets enregistrés dans un dossier.
Si un ProjectConfiguration a été transmis à l'objet Accelerator avec automatic_checkpoint_naming activé,
les points de contrôle seront enregistrés dans self.project_dir/checkpoints. Si le nombre d'enregistrements actuels est supérieur
à total_limit, l'enregistrement le plus ancien est supprimé. Chaque point de contrôle est enregistré dans des dossiers distincts nommés checkpoint_<iteration>.
Sinon, elles sont simplement enregistrées dans output_dir.
À n'utiliser que lorsque l'on souhaite enregistrer un point de contrôle pendant l'entraînement et restaurer l'état dans le même environnement.
Définit le tenseur de déclenchement interne à 1 sur le processus actuel. Un contrôle ultérieur doit suivre en utilisant celui-ci, qui vérifiera sur tous les processus.
Note :
N'exige pas wait_for_everyone()
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> # Assume later in the training script
>>> # `should_do_breakpoint` is a custom function to monitor when to break,
>>> # e.g. when the loss is NaN
>>> if should_do_breakpoint(loss):
... accelerator.set_trigger()
>>> # Assume later in the training script
>>> if accelerator.check_breakpoint():
... breakskip_first_batches
< source >( dataloadernum_batches: int = 0 )
Crée un nouveau torch.utils.data.DataLoader qui ignorera efficacement les num_batches premiers lots.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer, scheduler = accelerator.prepare(dataloader, model, optimizer, scheduler)
>>> skipped_dataloader = accelerator.skip_first_batches(dataloader, num_batches=2)
>>> # for the first epoch only
>>> for input, target in skipped_dataloader:
... optimizer.zero_grad()
... output = model(input)
... loss = loss_func(output, target)
... accelerator.backward(loss)
... optimizer.step()
>>> # subsequent epochs
>>> for input, target in dataloader:
... optimizer.zero_grad()
... ...split_between_processes
< source >( inputs: list | tuple | dict | torch.Tensorapply_padding: bool = False )
Paramètres
- inputs (
list,tuple,torch.Tensoroudictdelist/tuple/torch.Tensor) — L'entrée à répartir entre les processus. - apply_padding (
bool,optional, par défautFalse) — Indique s'il faut appliquer un bourrage en répétant le dernier élément de l'entrée afin que tous les processus aient le même nombre d'éléments. Utile lors de l'exécution d'actions telles queAccelerator.gather()sur les sorties ou lors du passage de moins d'entrées que de processus. Si c'est le cas, n'oubliez pas de supprimer les éléments bourrés par la suite.
Divise input rapidement entre self.num_processes et peut ensuite être utilisé sur ce processus. Utile lors d’une inférence distribuée, par exemple avec des prompts différents.
Notez que lors de l'utilisation d'un dict, toutes les clés doivent avoir le même nombre d'éléments.
Exemple :
# Assume there are two processes
from accelerate import Accelerator
accelerator = Accelerator()
with accelerator.split_between_processes(["A", "B", "C"]) as inputs:
print(inputs)
# Process 0
["A", "B"]
# Process 1
["C"]
with accelerator.split_between_processes(["A", "B", "C"], apply_padding=True) as inputs:
print(inputs)
# Process 0
["A", "B"]
# Process 1
["C", "C"]trigger_sync_in_backward
< source >( model )
Déclencher la synchronisation des gradients lors du prochain passage en arrière du modèle après plusieurs passages en avant sous Accelerator.no_sync (applicable uniquement dans les scénarios multi-GPU).
Si le script n'est pas lancé en mode distribué, ce gestionnaire de contexte ne fait rien.
Exemple :
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> dataloader, model, optimizer = accelerator.prepare(dataloader, model, optimizer)
>>> with accelerator.no_sync():
... loss_a = loss_func(model(input_a)) # first forward pass
... loss_b = loss_func(model(input_b)) # second forward pass
>>> accelerator.backward(loss_a) # No synchronization across processes, only accumulate gradients
>>> with accelerator.trigger_sync_in_backward(model):
... accelerator.backward(loss_b) # Synchronization across all processes
>>> optimizer.step()
>>> optimizer.zero_grad()unscale_gradients
< source >( optimizer = None )
Paramètres
- optimizer (
torch.optim.Optimizeroulist[torch.optim.Optimizer], facultatif) — L’optimiseur (ou les optimiseurs) pour lesquels déséquilibrer les gradients. Si non défini, déséquilibre les gradients sur tous les optimiseurs passés à prepare().
Désamplifier les gradients lors de l’entraînement en précision mixte avec AMP. Cette opération est un noop dans tous les autres contextes.
Il est probablement appelé via Accelerator.clipgrad_norm() ou Accelerator.clipgrad_value()
unwrap_model
< source >( modelkeep_fp32_wrapper: bool = Truekeep_torch_compile: bool = True ) → torch.nn.Module
Paramètres
- model (
torch.nn.Module) — Le modèle à déballer. - keep_fp32_wrapper (
bool, facultatif, valeur par défautTrue) — Indique s'il faut conserver le hook de précision mixte s'il a été ajouté. - keep_torch_compile (
bool, facultatif, valeur par défautTrue) — Indique s'il faut conserver le modèle compilé sans le décompiler.
Retourne
torch.nn.Module
Le modèle non enveloppé.
Développe le model en retirant la couche supplémentaire éventuellement ajoutée par prepare(). Utile avant d'enregistrer le modèle.
Exemple :
>>> # Assuming two GPU processes
>>> from torch.nn.parallel import DistributedDataParallel
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> model = accelerator.prepare(MyModel())
>>> print(model.__class__.__name__)
DistributedDataParallel
>>> model = accelerator.unwrap_model(model)
>>> print(model.__class__.__name__)
MyModelVérifie que model n'a pas été préparé pour l'inférence de grands modèles avec une carte d'appareils ressemblant à auto.
Arrêtera l'exécution du processus en cours jusqu'à ce que tous les autres processus aient atteint ce point (donc cela ne fait rien lorsque le script est exécuté dans un seul processus). Utile à faire avant d'enregistrer un modèle.
Exemple :
>>> # Assuming two GPU processes
>>> import time
>>> from accelerate import Accelerator
>>> accelerator = Accelerator()
>>> if accelerator.is_main_process:
... time.sleep(2)
>>> else:
... print("I'm waiting for the main process to finish its sleep...")
>>> accelerator.wait_for_everyone()
>>> # Should print on every process at the same time
>>> print("Everyone is here")Utilitaires
accelerate.utils.gather_object
< source >( object: Any )
Récupérer récursivement un objet dans une liste/tuple/dictionnaire imbriqué d'objets à partir de tous les appareils.