Accelerate 文档

数据加载器、优化器和调度器

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

数据加载器、优化器和调度器

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

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 (strRNGType 列表) — 每次迭代开始时需要同步的随机数生成器列表。应为以下一项或多项:

    • "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.10.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_size` 或 `batch_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) — 用于构建此 dataloader 的数据集。
  • 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) — 所有进程中 dataloader 的总批次大小。当 `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) — 所有进程中 dataloader 的总批次大小。当 `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.amp.GradScalertorch.cuda.amp.GradScaler, 可选) — 如果使用混合精度训练,则在 step 函数中使用的缩放器。

Torch 优化器的内部包装器。

在进行梯度累积时,如果需要同步梯度,则会有条件地执行 `step` 和 `zero_grad`。

eval

< >

( )

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

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) — 调度器是否应在每个优化器步骤时都进行步进。
  • split_batches (bool, 可选, 默认为 False) — 数据加载器是否在不同进程间拆分一个批次(因此无论进程数多少,批次大小都相同),还是在每个进程上创建批次(因此批次大小是原始批次大小乘以进程数)。

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

在进行梯度累积时,调度器的长度不应相应更改,Accelerate 会始终步进调度器以考虑这一点。

< > 在 GitHub 上更新