Accelerate documentation
DataLoaders, Otimizadores e Agendadores
DataLoaders, Otimizadores e Agendadores
As classes internas que o Accelerate usa para preparar objetos para treinamento distribuído ao chamar prepare().
Utilitários do DataLoader
accelerate.data_loader.prepare_data_loader
< source >( dataloader: DataLoaderdevice: torch.device | None = Nonenum_processes: int | None = Noneprocess_index: int | None = Nonesplit_batches: bool = Falseput_on_device: bool = Falserng_types: list[str | accelerate.utils.dataclasses.RNGType] | None = Nonedispatch_batches: bool | None = Noneeven_batches: bool = Trueslice_fn_for_dispatch: typing.Callable | None = Noneuse_seedable_sampler: bool = Falsedata_seed: int | None = Nonenon_blocking: bool = Falseuse_stateful_dataloader: bool = Falsetorch_device_mesh = None ) → torch.utils.data.dataloader.DataLoader
Parâmetros
- dataloader (
torch.utils.data.dataloader.DataLoader) — O carregador de dados a ser dividido entre vários dispositivos. - device (
torch.device) — O dispositivo de destino para oDataLoaderretornado. - num_processes (
int, opcional) — O número de processos executados simultaneamente. O valor padrão é o fornecido por PartialState. - process_index (
int, opcional) — O índice do processo atual. O valor padrão é o fornecido por PartialState. - split_batches (
bool, optional, defaults toFalse) — Whether the resultingDataLoadershould split the batches of the original data loader across devices or yield full batches (in which case it will yield batches starting at theprocess_index-th and advancing ofnum_processesbatches at each iteration).Outra forma de ver isso é que o tamanho do lote observado será o mesmo do
dataloaderinicial se essa opção for definida comoTrue, ou o tamanho do lote dodataloaderinicial multiplicado pornum_processescaso contrário.Definir essa opção como
Trueexige que o tamanho do lote dodataloaderseja um múltiplo exato debatch_size. - put_on_device (
bool, opcional, padrãoFalse) — Se os lotes devem ser colocados nodevice(funciona apenas se os lotes forem listas aninhadas, tuplas ou dicionários de tensores). - rng_types (lista de
strou RNGType) — A lista de geradores de números aleatórios a serem sincronizados no início de cada iteração. Deve ser um ou vários dos seguintes:"torch": o gerador de números aleatórios base do torch"cuda": o gerador de números aleatórios CUDA (somente GPU)"xla": o gerador de números aleatórios do XLA (somente TPU)"generator": otorch.Generatordo sampler (ou do batch sampler, se não houver sampler no seu dataloader) ou do dataset iterável (se existir), caso o dataset subjacente seja desse tipo.
- dispatch_batches (
bool, opcional) — Se definido comoTrue, o dataloader preparado é iterado apenas no processo principal e, em seguida, os lotes são divididos e transmitidos para cada processo. O valor padrão seráTruequando o conjunto de dados subjacente for umIterableDataset, caso contrário,False. - even_batches (
bool, opcional, padrãoTrue) — Se definido comoTrue, em casos em que o tamanho total do lote em todos os processos não divide exatamente o conjunto de dados, as amostras no início do conjunto de dados serão duplicadas para que o lote possa ser dividido igualmente entre todos os workers. - 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. - use_seedable_sampler (
bool, opcional, padrãoFalse) — Se deve usar oSeedableRandomSamplerem vez de umRandomSamplerpara melhor reprodutibilidade. Isso pode resultar em desempenhos diferentes devido a algoritmos de embaralhamento diferentes, mas garante que os resultados serão exatamente os mesmos. Deve ser usado em conjunto comset_seed()a cadaself.set_epoch - data_seed (
int, opcional, padrãoNone) — A semente a ser usada para o gerador subjacente ao usaruse_seedable_sampler. SeNone, o gerador usará a semente padrão atual do torch. - non_blocking (
bool, opcional, padrãoFalse) — Se definido comoTrue, o dataloader utilizará transferências não bloqueantes de host para dispositivo. Se o dataloader tiverpin_memorydefinido comoTrue, isso ajudará a aumentar a sobreposição entre a transferência de dados e os cálculos. - use_stateful_dataloader (
bool, opcional, padrãoFalse) — “Se definido como true, o dataloader preparado pelo Accelerator será baseado em ” “torchdata.StatefulDataLoader. Isso requer a instalação da versão 0.8.0 ou superior dotorchdataque suporte StatefulDataLoader.” - torch_device_mesh (
torch.distributed.DeviceMesh, opcional, padrãoNone) — Malha de dispositivos do PyTorch.
Retorna
torch.utils.data.dataloader.DataLoader
Um novo carregador de dados que retornará a porção dos lotes
Envolve um DataLoader do PyTorch para gerar lotes apenas para um dos processos.
Dependendo do valor do atributo drop_last do dataloader passado, a iteração será interrompida no primeiro lote que seria pequeno demais / não estivesse presente em todos os processos, ou será reiniciada com os índices do início.
BatchSamplers com tamanhos de lote variáveis não são habilitados por padrão. Para habilitar esse comportamento, definaeven_batchescomoFalse
Cria um torch.utils.data.DataLoader que ignorará eficientemente as primeiras num_batches. Não deve ser usado se o dataloader original for um StatefulDataLoader.
BatchSamplerShard
classe accelerate.data_loader.BatchSamplerShard
< source >( batch_sampler: BatchSamplernum_processes: int = 1process_index: int = 0split_batches: bool = Falseeven_batches: bool = True )
Parâmetros
- batch_sampler (
torch.utils.data.sampler.BatchSampler) — O batch sampler para dividir em vários shards. - num_processes (
int, opcional, padrão 1) — O número de processos executados simultaneamente. - process_index (
int, opcional, padrão 0) — O índice do processo atual. - split_batches (
bool, opcional, padrão éFalse) — Se os shards devem ser criados dividindo um lote para dar uma parte dele a cada processo, ou ao render diferentes lotes completos em cada processo.Em dois processos com um sampler de
[[0, 1, 2, 3], [4, 5, 6, 7]], isso resultará em:- o sampler no processo 0 a produzir
[0, 1, 2, 3]e o sampler no processo 1 a produzir[4, 5, 6, 7]se este argumento for definido comoFalse. - o sampler no processo 0 para produzir
[0, 1]e depois[4, 5]e o sampler no processo 1 para produzir[2, 3]e depois[6, 7]se este argumento for definido comoTrue.
- o sampler no processo 0 a produzir
- even_batches (
bool, opcional, padrãoTrue) — Se deve ou não retornar ao início do sampler quando o número de amostras não for um múltiplo exato de (tamanho original do lote / número de processos).
Envolve um BatchSampler do PyTorch para gerar lotes para apenas um dos processos. As instâncias desta classe sempre retornarão um número de lotes que é um múltiplo exato de num_processes e que todos têm o mesmo tamanho. Dependendo do valor do atributo drop_last do lote sampler passado, a iteração será interrompida no primeiro lote que seria pequeno demais / não existiria em todos os processos, ou será repetida com os índices a partir do início.
BatchSamplers com tamanhos de lote variáveis não são habilitados por padrão. Para habilitar esse comportamento, definaeven_batchescomoFalse
IterableDatasetShard
classe accelerate.data_loader.IterableDatasetShard
< source >( dataset: IterableDatasetbatch_size: int = 1drop_last: bool = Falsenum_processes: int = 1process_index: int = 0split_batches: bool = False )
Parâmetros
- dataset (
torch.utils.data.dataset.IterableDataset) — O batch sampler a ser dividido em vários shards. - batch_size (
int, opcional, padrão 1) — O tamanho dos lotes por shard (sesplit_batches=False) ou o tamanho dos lotes (sesplit_batches=True). - drop_last (
bool, opcional, padrãoFalse) — Se deve descartar o último lote incompleto ou completar os últimos lotes usando as amostras do início. - num_processes (
int, opcional, padrão 1) — O número de processos executados simultaneamente. - process_index (
int, opcional, padrão 0) — O índice do processo atual. - split_batches (
bool, opcional, padrão éFalse) — Se os shards devem ser criados dividindo um lote para dar uma parte dele a cada processo, ou ao render diferentes lotes completos em cada processo.Em dois processos com um conjunto de dados iterável que gera
[0, 1, 2, 3, 4, 5, 6, 7], isso resultará em:- o shard no processo 0 para produzir
[0, 1, 2, 3]e o shard no processo 1 para produzir[4, 5, 6, 7]se este argumento for definido comoFalse. - o shard no processo 0 para produzir
[0, 1, 4, 5]e o sampler no processo 1 para produzir[2, 3, 6, 7]se este argumento for definido comoTrue.
- o shard no processo 0 para produzir
Envolve um IterableDataset do PyTorch para gerar amostras para apenas um dos processos. As instâncias desta classe sempre retornarão um número de amostras que é um múltiplo exato do tamanho real do lote (dependendo do valor de split_batches, isso será batch_size ou batch_size x num_processes). Dependendo do valor do atributo drop_last do batch sampler passado, a iteração será interrompida no primeiro lote que seria pequeno demais ou repetirá com os índices a partir do início.
DataLoaderShard
classe accelerate.data_loader.DataLoaderShard
< source >( datasetdevice = Nonerng_types = Nonesynchronized_generator = Noneskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falsetorch_device_mesh = Noneiteration = 0**kwargs )
Parâmetros
- dataset (
torch.utils.data.dataset.Dataset) — O dataset a ser usado para construir este dataloader. - device (
torch.device, opcional) — Se fornecido, o dispositivo em que todos os lotes serão colocados. - rng_types (lista de
strou RNGType) — A lista de geradores de números aleatórios a serem sincronizados no início de cada iteração. Deve ser um ou vários dos seguintes:"torch": o gerador de números aleatórios base do torch"cuda": o gerador de números aleatórios CUDA (somente GPU)"xla": o gerador de números aleatórios do XLA (somente TPU)"generator": umtorch.Generatoropcional
- synchronized_generator (
torch.Generator, opcional) — Um gerador de números aleatórios para manter sincronizado entre processos. - skip_batches (
int, opcional, padrão 0) — O número de lotes a serem ignorados no início. - use_stateful_dataloader (
bool, opcional, padrãoFalse) — Se esta classe deve adaptar oStatefulDataLoaderdotorchdataem vez doDataLoaderregular. - **kwargs (argumentos de palavra-chave adicionais, opcional) —
Todos os outros argumentos de palavra-chave para passar à inicialização regular do
DataLoader.
Subclasse de DataLoaderAdapter que lidará com a colocação de dispositivos e a configuração distribuída atual.
Atributos disponíveis:
total_batch_size (
int) — Tamanho total do lote do dataloader em todos os processos. Igual ao tamanho original do lote quandosplit_batches=True; caso contrário, o tamanho original do lote * o número total de processostotal_dataset_length (
int) — Comprimento total do dataset interno em todos os processos.
DataLoaderDispatcher
classe accelerate.data_loader.DataLoaderDispatcher
< source >( datasetsplit_batches: bool = Falseskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falseslice_fn = Nonetorch_device_mesh = Noneiteration = 0**kwargs )
Parâmetros
- split_batches (
bool, opcional, padrãoFalse) — Se oDataLoaderresultante deve dividir os lotes do carregador de dados original entre os dispositivos ou entregar lotes completos (nesse caso, ele entregará lotes começando no índiceprocess_indexe avançandonum_processeslotes a cada iteração). Outra forma de ver isso é que o tamanho do lote observado será o mesmo dodataloaderinicial se esta opção for definida comoTrue; caso contrário, será o tamanho do lote dodataloaderinicial multiplicado pornum_processes. Definir esta opção comoTrueexige que o tamanho do lote dodataloaderseja um múltiplo exato debatch_size. - skip_batches (
int, opcional, padrão 0) — O número de lotes a serem ignorados no início de uma iteração. - use_stateful_dataloader (
bool, opcional, padrãoFalse) — Se esta classe deve adaptar oStatefulDataLoaderdotorchdataem vez doDataLoaderregular.
Subclasse de DataLoaderAdapter que itera e pré-processa apenas no processo 0 e, em seguida, distribui em cada processo sua parte do lote.
Atributos disponíveis:
total_batch_size (
int) — Tamanho total do lote do dataloader em todos os processos. Igual ao tamanho original do lote quandosplit_batches=True; caso contrário, o tamanho original do lote * o número total de processostotal_dataset_length (
int) — Comprimento total do dataset interno em todos os processos.
AcceleratedOptimizer
classe accelerate.optimizer.AcceleratedOptimizer
< source >( optimizerdevice_placement = Truescaler = None )
Parâmetros
- optimizer (
torch.optim.optimizer.Optimizer) — O otimizador a ser encapsulado. - device_placement (
bool, opcional, padrãoTrue) — Se o otimizador deve ou não gerenciar o posicionamento de dispositivos. Se sim, ele colocará o dicionário de estado deoptimizerno dispositivo correto. - scaler (
torch.amp.GradScaleroutorch.cuda.amp.GradScaler, opcional) — O scaler a ser usado na função de passo durante o treinamento com precisão mista.
Wrapper interno em torno de um otimizador do torch.
Condicionalmente, executará step e zero_grad se os gradientes devem ser sincronizados ao realizar a acumulação de gradientes.
Define o otimizador no modo “eval”. Útil para otimizadores como schedule_free
Define o otimizador no modo “train”. Útil para otimizadores como schedule_free
AcceleratedScheduler
classe accelerate.scheduler.AcceleratedScheduler
< source >( scheduleroptimizersstep_with_optimizer: bool = Truesplit_batches: bool = False )
Parâmetros
- scheduler (
torch.optim.lr_scheduler._LRScheduler) — O scheduler a ser encapsulado. - optimizers (um ou uma lista de
torch.optim.Optimizer) — Os otimizadores usados. - step_with_optimizer (
bool, opcional, padrãoTrue) — Se o agendador deve ou não ser avançado a cada passo do otimizador. - split_batches (
bool, opcional, padrãoFalse) — Se os dataloaders dividem um lote entre os diferentes processos (de modo que o tamanho do lote é o mesmo, independentemente do número de processos) ou criam lotes em cada processo (de modo que o tamanho do lote é o tamanho original do lote multiplicado pelo número de processos).
Um wrapper em torno de um agendador de taxa de aprendizado que só avança quando o(s) otimizador(es) dão um passo de treinamento. Útil para evitar que o agendador avance rápido demais quando os gradientes estouraram e não houve um passo de treinamento (no treinamento em precisão mista)
Ao executar o agendamento de acúmulo de gradientes, os comprimentos não devem ser alterados de acordo, pois o Accelerate sempre executará o passo do agendador para levar isso em conta.