Accelerate 文档

DataLoaders、优化器和调度器

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

DataLoaders、优化器和调度器

Accelerate 使用的内部类,用于在调用 prepare() 时准备对象以进行分布式训练。

DataLoader 实用工具

accelerate.data_loader.prepare_data_loader

< >

( dataloader: DataLoader device: typing.Optional[torch.device] = None num_processes: typing.Optional[int] = None process_index: typing.Optional[int] = None split_batches: bool = False put_on_device: bool = False rng_types: typing.Optional[list[typing.Union[str, accelerate.utils.dataclasses.RNGType]]] = None dispatch_batches: typing.Optional[bool] = None even_batches: bool = True slice_fn_for_dispatch: typing.Optional[typing.Callable] = None use_seedable_sampler: bool = False data_seed: typing.Optional[int] = None non_blocking: bool = False use_stateful_dataloader: bool = False torch_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(如果数据加载器中没有采样器,则为批次采样器),或者如果底层数据集属于该类型,则为可迭代数据集(如果存在)的 torch.Generator
  • dispatch_batches (bool, 可选) — 如果设置为 True,则准备好的数据加载器仅在主进程上迭代,然后将批次拆分并广播到每个进程。 当底层数据集为 IterableDataset 时,将默认为 True,否则为 False
  • even_batches (bool, 可选, 默认为 True) — 如果设置为 True,在所有进程的总批次大小不能完全整除数据集的情况下,数据集开始处的样本将被复制,以便批次可以在所有工作进程之间平均分配。
  • slice_fn_for_dispatch (Callable, 可选) -- 如果传入,此函数将用于跨num_processes对张量进行切片。 将默认为 [slice_tensors()](/docs/accelerate/v1.6.0/en/package_reference/utilities#accelerate.utils.slice_tensors)。 此参数仅在dispatch_batches设置为True` 时使用,否则将被忽略。
  • 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,数据加载器将使用非阻塞的主机到设备传输。如果数据加载器已将 pin_memory 设置为 True,这将有助于增加数据传输和计算之间的重叠。
  • use_stateful_dataloader (bool, 可选, 默认为 False) — “如果设置为 true,Accelerator 准备的数据加载器将由 ” “torchdata.StatefulDataLoader 支持。这需要安装支持 StatefulDataLoader 的 torchdata 0.8.0 或更高版本。”
  • torch_device_mesh (torch.distributed.DeviceMesh, 可选, 默认为 None) — PyTorch 设备网格。

返回

torch.utils.data.dataloader.DataLoader

一个新的数据加载器,它将产生批次的一部分

包装 PyTorch DataLoader,仅为一个进程生成批次。

取决于传递的 dataloaderdrop_last 属性值,它将在第一个批次太小/在所有进程上不存在时停止迭代,或者从头开始循环索引。

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

accelerate.skip_first_batches

< >

( dataloader num_batches = 0 )

创建一个 torch.utils.data.DataLoader,它将有效地跳过前 num_batches 个批次。如果原始数据加载器是 StatefulDataLoader,则不应使用此方法。

BatchSamplerShard

class accelerate.data_loader.BatchSamplerShard

< >

( batch_sampler: BatchSampler num_processes: int = 1 process_index: int = 0 split_batches: bool = False even_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: IterableDataset batch_size: int = 1 drop_last: bool = False num_processes: int = 1 process_index: int = 0 split_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_sizebatch_size x num_processes)。取决于传递的批采样器的 drop_last 属性值,它将在第一个批次太小时停止迭代,或者从头开始循环索引。

DataLoaderShard

class accelerate.data_loader.DataLoaderShard

< >

( dataset device = None rng_types = None synchronized_generator = None skip_batches = 0 use_stateful_dataloader = False _drop_last: bool = False _non_blocking: bool = False torch_device_mesh = None **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) — 是否让此类适配来自 torchdataStatefulDataLoader 而不是常规的 DataLoader
  • **kwargs (附加关键字参数,可选) — 传递给常规 DataLoader 初始化的所有其他关键字参数。

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

可用属性

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

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

DataLoaderDispatcher

class accelerate.data_loader.DataLoaderDispatcher

< >

( dataset split_batches: bool = False skip_batches = 0 use_stateful_dataloader = False _drop_last: bool = False _non_blocking: bool = False slice_fn = None torch_device_mesh = None **kwargs )

参数

  • split_batches (bool, 可选,默认为 False) — 指示生成的 DataLoader 是否应在设备之间拆分原始数据加载器的批次,还是生成完整批次(在这种情况下,它将在每次迭代中生成从第 process_index 个批次开始并前进 num_processes 个批次的批次)。看待此问题的另一种方式是,如果此选项设置为 True,则观察到的批次大小将与初始 dataloader 相同;否则为初始 dataloader 的批次大小乘以 num_processes。将此选项设置为 True 需要 dataloader 的批次大小是 batch_size 的整数倍。
  • skip_batches (int, 可选,默认为 0) — 迭代开始时要跳过的批次数。
  • use_stateful_dataloader (bool, 可选,默认为 False) — 是否让此类适配来自 torchdataStatefulDataLoader 而不是常规的 DataLoader

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

可用属性

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

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

AcceleratedOptimizer

class accelerate.optimizer.AcceleratedOptimizer

< >

( optimizer device_placement = True scaler = None )

参数

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

torch 优化器的内部包装器。

当执行梯度累积时,如果应该同步梯度,则有条件地执行 stepzero_grad

eval

< >

( )

将优化器设置为“eval”模式。对于像 schedule_free 这样的优化器很有用

train

< >

( )

将优化器设置为“train”模式。对于像 schedule_free 这样的优化器很有用

AcceleratedScheduler

class accelerate.scheduler.AcceleratedScheduler

< >

( scheduler optimizers step_with_optimizer: bool = True split_batches: bool = False )

参数

  • scheduler (torch.optim.lr_scheduler._LRScheduler) — 要包装的调度器。
  • optimizers (一个或多个 torch.optim.Optimizer 的列表) — 使用的优化器。
  • step_with_optimizer (bool, 可选,默认为 True) — 调度器是否应在每个优化器步骤中执行 step。
  • split_batches (bool, 可选,默认为 False) — 指示数据加载器是否在不同进程之间拆分一个批次(因此批次大小与进程数无关),或者在每个进程上创建批次(因此批次大小是原始批次大小乘以进程数)。

学习率调度器的包装器,它仅在优化器具有训练步骤时才执行 step。在混合精度训练中,当梯度溢出且没有训练步骤时,这对于避免调度器 step 过快很有用

当执行梯度累积时,不应相应地更改调度器长度,Accelerate 将始终 step 调度器以解决此问题。

< > 在 GitHub 上更新