Accelerate 文档

DataLoader、优化器和调度器

Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

DataLoader、优化器和调度器

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

DataLoader 工具函数

accelerate.data_loader.prepare_data_loader

< >

( dataloader: DataLoader device: 可选[None] num_processes: 可选[None] process_index: 可选[None] split_batches: bool = False put_on_device: bool = False rng_types: 可选[None] dispatch_batches: 可选[None] even_batches: bool = True slice_fn_for_dispatch: 可选[None] use_seedable_sampler: bool = False non_blocking: bool = False use_stateful_dataloader: bool = False ) torch.utils.data.dataloader.DataLoader

参数

  • dataloader (torch.utils.data.dataloader.DataLoader) — 要跨多个设备拆分的 DataLoader。
  • device (torch.device) — 返回的 DataLoader 的目标设备。
  • num_processes (int, 可选) — 并发运行的进程数。将默认为 PartialState 给出的值。
  • process_index (int, 可选) — 当前进程的索引。将默认为 PartialState 给出的值。
  • split_batches (bool, 可选, 默认为 False) — 生成的 DataLoader 是否应该跨设备拆分原始 DataLoader 的批次,或者是否应该生成完整的批次(在这种情况下,它将从第 process_index 个批次开始生成,并在每次迭代中前进 num_processes 个批次)。

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

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

  • put_on_device (bool, 可选, 默认为 False) — 是否将批次放到 device 上(仅在批次是嵌套列表、元组或张量字典时有效)。
  • rng_types (strRNGType 的列表) — 在每次迭代开始时同步的随机数生成器列表。应为以下之一或多个:

    • "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可选) -- 如果传递,则此函数将用于跨 num_processes 切片张量。默认为 [slice_tensors()](/docs/accelerate/v1.0.1/en/package_reference/utilities#accelerate.utils.slice_tensors)。仅当 dispatch_batches 设置为 True 时使用此参数,否则将忽略。
  • use_seedable_sampler (bool可选,默认为 False) — 是否使用 SeedableRandomSampler 而不是 RandomSampler 以获得更好的可重复性。由于不同的洗牌算法,可能会以潜在不同的性能为代价,但确保结果将完全相同。应与每个 self.set_epoch 处的 set_seed() 配合使用。
  • non_blocking (bool可选,默认为 False) — 如果设置为 True,数据加载器将使用非阻塞主机到设备传输。如果数据加载器的 pin_memory 设置为 True,这将有助于增加数据传输和计算之间的重叠。
  • use_stateful_dataloader (bool可选,默认为 False) — “如果设置为 true,则加速器准备的数据加载器将由 ” “torchdata.StatefulDataLoader 支持。这需要安装支持 StatefulDataLoader 的 torchdata 版本 0.8.0 或更高版本。”

返回值

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

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

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_size 或者是 batch_size x num_processes)。根据传递的批次采样器的 drop_last 属性的值,它要么在第一个过小的批次处停止迭代,要么循环使用来自开头的索引。

DataLoaderShard

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 **kwargs )

参数

  • dataset (torch.utils.data.dataset.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

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 **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

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 函数中使用的缩放器。

围绕 torch 优化器的内部包装器。

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

评估

< >

( )

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

训练

< >

( )

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

AcceleratedScheduler

accelerate.scheduler.AcceleratedScheduler

< >

参数

  • scheduler (torch.optim.lr_scheduler._LRScheduler) — 用于包装的调度器。
  • optimizers (一个或一个列表的 torch.optim.Optimizer) — 使用的优化器。
  • step_with_optimizer (bool, 可选,默认为 True) — 调度器是否应在每次优化器步骤时进行更新。
  • split_batches (bool, 可选,默认为 False) — 数据加载器是否将一个批次拆分到不同的进程中(因此无论进程数量多少,批次大小都相同),或者在每个进程上创建批次(因此批次大小是原始批次大小乘以进程数量)。

学习率调度器的包装器,它只会在优化器(s) 有训练步骤时进行更新。这有助于避免在梯度溢出且没有训练步骤时(在混合精度训练中)调度器更新过快。

在执行梯度累积时,不应相应地更改调度器长度,Accelerate 将始终更新调度器以考虑这一点。

< > 在 GitHub 上更新