Accelerate documentation

DataLoaders、优化器和调度器

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

DataLoaders、优化器和调度器

Accelerate 在调用 prepare() 时用于为分布式训练准备对象的内部类

DataLoader 实用工具

accelerate.data_loader.prepare_data_loader

< >

( 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

参数

  • dataloader (torch.utils.data.dataloader.DataLoader) — 用于在多个设备之间划分的数据加载器。
  • device (torch.device) — 返回的 DataLoader 的目标设备。
  • num_processes (int,可选) — 并发运行的进程数量。默认值为 PartialState 提供的值。
  • process_index (int,可选) — 当前进程的索引。默认值为 PartialState 提供的值。
  • split_batches (bool, 可选, 默认为 False) — 是否让生成的 DataLoader 将原始数据加载器的批次拆分到各个设备上,还是返回完整的批次(在这种情况下,它将从 process_index-开始,每次迭代推进 num_processes 个批次)。

    另一种理解方式是,如果将此选项设置为 True,则观察到的批大小将与初始 dataloader 的批大小相同;否则,初始 dataloader 的批大小将乘以 num_processes。

    将此选项设置为 True 要求 dataloader 的批大小必须是 batch_size 的整数倍。

  • put_on_device (bool,可选,默认为 False) — 是否将批次放到 device 上(仅当批次是张量的嵌套列表、元组或字典时才有效)。
  • rng_types (的列表 str 或 RNGType) — 要在每次迭代开始时同步的随机数生成器列表。应为以下一项或多项:
    • "torch":基础的 torch 随机数生成器
    • "cuda":CUDA 随机数生成器(仅限 GPU)
    • "xla":XLA 随机数生成器(仅限 TPU)
    • "generator":如果底层数据集属于该类型,则为采样器(如果数据加载器中没有采样器,则为批采样器)或可迭代数据集(如果存在)的 torch.Generator。
  • dispatch_batches (bool,可选) — 如果设置为 True,则仅在主进程上迭代准备好的数据加载器,然后将批次拆分并广播到每个进程。当底层数据集是 IterableDataset 时,默认值为 True,否则为 False。
  • even_batches (bool,可选,默认为 True) — 如果设置为 True,当所有进程上的总批大小无法整除数据集时,将复制数据集开头的样本,以便批数据能够均匀分配给所有工作进程。
  • slice_fn_for_dispatch (Callable, optional) -- If passed, this function will be used to slice tensors across num_processes. Will default to [slice_tensors()](/docs/accelerate/main/en/package_reference/utilities#accelerate.utils.slice_tensors). This argument is used only when dispatch_batchesis set toTrue` and will be ignored otherwise.
  • use_seedable_sampler (bool,可选,默认为 False) — 是否使用 SeedableRandomSampler 而非 RandomSampler 以获得更好的可复现性。由于不同的洗牌算法,这可能会导致性能存在差异,但可确保结果完全相同。应在每次 self.set_epoch 时与 set_seed() 配合使用
  • data_seed (int,可选,默认为 None) — 在使用 use_seedable_sampler 时,底层生成器所使用的种子。如果为 None,生成器将使用 torch 的当前默认种子。
  • non_blocking (bool,可选,默认为 False) — 如果设置为 True,dataloader 将使用非阻塞的主机到设备传输。如果 dataloader 的 pin_memory 设置为 True,这将有助于增加数据传输与计算之间的重叠。
  • use_stateful_dataloader (bool,可选,默认为 False) — “如果设置为 true,则由 Accelerator 准备的 dataloader 将由 torchdata.StatefulDataLoader 提供支持。 这需要安装支持 StatefulDataLoader 的 torchdata 0.8.0 或更高版本。”
  • torch_device_mesh(torch.distributed.DeviceMesh,可选,默认为 None)—— PyTorch 设备网格。

返回值

torch.utils.data.dataloader.DataLoader

一个将生成批次中相应部分的新数据加载器

封装 PyTorch DataLoader,仅为其中一个进程生成批次。

根据传入的 dataloader 的 drop_last 属性的值,它要么在遇到第一个过小或并非在所有进程上都存在的批次时停止迭代,要么从头开始循环使用索引。

默认情况下,BatchSampler 不支持可变批次大小。要启用此行为,请将 even_batches 设置为 False

accelerate.skip_first_batches

< >

( dataloadernum_batches = 0 )

创建一个 torch.utils.data.DataLoader,用于高效跳过前 num_batches 个批次。如果原始 dataloader 是 StatefulDataLoader,则不应使用此方法。

BatchSamplerShard

class accelerate.data_loader.BatchSamplerShard

< >

( batch_sampler: BatchSamplernum_processes: int = 1process_index: int = 0split_batches: bool = Falseeven_batches: bool = True )

参数

  • batch_sampler (torch.utils.data.sampler.BatchSampler) — 用于将数据拆分为多个分片的批采样器。
  • num_processes (int,可选,默认为 1) — 并发运行的进程数量。
  • process_index (int,可选,默认为 0) — 当前进程的索引。
  • split_batches (bool, 可选, 默认为 False) — 是否通过拆分批次来创建分片,即将批次的部分数据分配给每个进程,还是在每个进程上生成不同的完整批次。

    在两个进程上使用采样器 [[0, 1, 2, 3], [4, 5, 6, 7]] 时,结果如下:

    • 如果将此参数设置为 False,则进程 0 上的采样器将返回 [0, 1, 2, 3],进程 1 上的采样器将返回 [4, 5, 6, 7]。
    • 如果将此参数设置为 True,则进程 0 上的采样器将依次返回 [0, 1] 和 [4, 5],而进程 1 上的采样器将依次返回 [2, 3] 和 [6, 7]。
  • even_batches (bool,可选,默认为 True) — 当样本数量不是(原始批大小 / 进程数)的整数倍时,是否从采样器开头重新循环。

封装 PyTorch BatchSampler,仅为其中一个进程生成批次。此类的实例始终会生成 num_processes 整数倍数量的批次,且所有批次大小相同。根据传入的批次采样器的 drop_last 属性值,它要么在遇到第一个过小或并非所有进程都存在的批次时停止迭代,要么从头开始循环使用索引。

默认情况下,BatchSampler 不支持可变批次大小。要启用此行为,请将 even_batches 设置为 False

IterableDatasetShard

class accelerate.data_loader.IterableDatasetShard

< >

( dataset: IterableDatasetbatch_size: int = 1drop_last: bool = Falsenum_processes: int = 1process_index: int = 0split_batches: bool = False )

参数

  • dataset (torch.utils.data.dataset.IterableDataset) — 要拆分为多个分片的批采样器。
  • batch_size (int, 可选, 默认为 1) — 每个分片中的批次大小(如果 split_batches=False)或批次的大小(如果 split_batches=True)。
  • drop_last (bool,可选,默认为 False) — 是否丢弃最后一个不完整的批次,或者使用开头的样本补全最后一个批次。
  • num_processes (int,可选,默认为 1) — 并发运行的进程数量。
  • process_index (int,可选,默认为 0) — 当前进程的索引。
  • split_batches (bool, 可选, 默认为 False) — 是否通过拆分批次来创建分片,即将批次的部分数据分配给每个进程,还是在每个进程上生成不同的完整批次。

    在两个进程上使用可迭代数据集,其产出为 [0, 1, 2, 3, 4, 5, 6, 7],结果如下:

    • 如果将此参数设置为 False,则进程 0 上的分片将返回 [0, 1, 2, 3],进程 1 上的分片将返回 [4, 5, 6, 7]。
    • 如果将此参数设置为 True,则进程 0 上的分片将生成 [0, 1, 4, 5],进程 1 上的采样器将生成 [2, 3, 6, 7]。

将 PyTorch IterableDataset 包装起来,以便仅为其中一个进程生成样本。此类的实例始终会生成实际批大小整数倍的样本数量(根据 split_batches 的值,该数量要么是 batch_size,要么是 batch_size x num_processes)。根据传入的批采样器中 drop_last 属性的值,它要么在遇到第一个过小的批次时停止迭代,要么从头开始循环使用索引。

DataLoaderShard

class accelerate.data_loader.DataLoaderShard

< >

( datasetdevice = Nonerng_types = Nonesynchronized_generator = Noneskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falsetorch_device_mesh = Noneiteration = 0**kwargs )

参数

  • dataset (torch.utils.data.dataset.Dataset) — 用于构建此数据加载器的数据集。
  • device (torch.device,可选) — 如果传入,则指定将所有批次放置到的设备。
  • rng_types (的列表 str 或 RNGType) — 要在每次迭代开始时同步的随机数生成器列表。应为以下一项或多项:
    • "torch":基础的 torch 随机数生成器
    • "cuda":CUDA 随机数生成器(仅限 GPU)
    • "xla":XLA 随机数生成器(仅限 TPU)
    • "generator":一个可选的 torch.Generator
  • synchronized_generator (torch.Generator, 可选) — 用于在进程之间保持同步的随机数生成器。
  • skip_batches (int,可选,默认为 0) — 开头要跳过的批次数。
  • use_stateful_dataloader (bool,可选,默认为 False) — 是否让此类适配来自 torchdata 的 StatefulDataLoader,而不是常规的 DataLoader。
  • **kwargs(额外的关键字参数,可选) — 传递给常规 DataLoader 初始化的所有其他关键字参数。

DataLoaderAdapter 的子类,用于处理设备放置和当前的分布式设置。

可用属性:

  • total_batch_size (int) — 数据加载器在所有进程上的总批大小。 当 split_batches=True 时,等于原始批大小;否则为原始批大小 * 进程总数

  • total_dataset_length (int) — 所有进程中内部数据集的总长度。

DataLoaderDispatcher

类 accelerate.data_loader.DataLoaderDispatcher

< >

( datasetsplit_batches: bool = Falseskip_batches = 0use_stateful_dataloader = False_drop_last: bool = False_non_blocking: bool = Falseslice_fn = Nonetorch_device_mesh = Noneiteration = 0**kwargs )

参数

  • split_batches (bool, optional, defaults to False) — Whether the resulting DataLoader should split the batches of the original data loader across devices or yield full batches (in which case it will yield batches starting at the process_index-th and advancing of num_processes batches at each iteration). Another way to see this is that the observed batch size will be the same as the initial dataloader if this option is set to True, the batch size of the initial dataloader multiplied by num_processes otherwise. Setting this option to True requires that the batch size of the dataloader is a round multiple of batch_size.
  • skip_batches (int,可选,默认为 0) — 每次迭代开始时跳过的批次数。
  • use_stateful_dataloader (bool,可选,默认为 False) — 是否让此类适配来自 torchdata 的 StatefulDataLoader,而不是常规的 DataLoader。

DataLoaderAdapter 的子类,仅在进程 0 上执行迭代和预处理,然后在每个进程上分发其对应的批次部分。

可用属性:

  • total_batch_size (int) — 数据加载器在所有进程上的总批大小。 当 split_batches=True 时,等于原始批大小;否则为原始批大小 * 进程总数

  • total_dataset_length (int) — 所有进程中内部数据集的总长度。

AcceleratedOptimizer

类 accelerate.optimizer.AcceleratedOptimizer

< >

( optimizerdevice_placement = Truescaler = None )

参数

  • optimizer (torch.optim.optimizer.Optimizer) — 要包装的优化器。
  • device_placement (bool,可选,默认为 True) — 优化器是否应处理设备放置。如果是,它会将 optimizer 的状态字典放置在正确的设备上。
  • scaler(torch.amp.GradScaler 或 torch.cuda.amp.GradScaler,可选) — 在以混合精度进行训练时,在 step 函数中使用的缩放器。

torch 优化器的内部封装。

在梯度累积期间,如果需要同步梯度,则有条件地执行 step 和 zero_grad。

评估

< >

( )

将优化器设置为“eval”模式。对于 schedule_free 等优化器非常有用。

训练

< >

( )

将优化器设置为“train”模式。对于 schedule_free 等优化器非常有用。

AcceleratedScheduler

类 accelerate.scheduler.AcceleratedScheduler

< >

( scheduleroptimizersstep_with_optimizer: bool = Truesplit_batches: bool = False )

参数

  • scheduler (torch.optim.lr_scheduler._LRScheduler) — 要包装的调度器。
  • optimizers(一个或一个torch.optim.Optimizer列表)— 所使用的优化器。
  • step_with_optimizer (bool,可选,默认为 True) — 是否应在每次优化器步骤时步进调度器。
  • split_batches (bool,可选,默认为 False) — 是否让数据加载器将一个批次拆分到不同的进程上(这样无论进程数量如何,批次大小都保持不变),还是在每个进程上创建批次(这样批次大小就是原始批次大小乘以进程数量)。

一个学习率调度器的封装器,仅当优化器执行训练步骤时才进行步进。这在混合精度训练中非常有用,可以避免在梯度溢出且未执行训练步骤时,调度器步进过快的问题。

在执行梯度累积时,不应相应地更改调度器的长度,Accelerate 始终会步进调度器以对此进行补偿。

Update on GitHub