Accelerate documentation
DataLoaders、优化器和调度器
DataLoaders、优化器和调度器
Accelerate 在调用 prepare() 时用于为分布式训练准备对象的内部类
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
参数
- 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 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,可选,默认为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 的torchdata0.8.0 或更高版本。” - torch_device_mesh(
torch.distributed.DeviceMesh,可选,默认为None)—— PyTorch 设备网格。
返回值
torch.utils.data.dataloader.DataLoader
一个将生成批次中相应部分的新数据加载器
封装 PyTorch DataLoader,仅为其中一个进程生成批次。
根据传入的 dataloader 的 drop_last 属性的值,它要么在遇到第一个过小或并非在所有进程上都存在的批次时停止迭代,要么从头开始循环使用索引。
默认情况下,
BatchSampler不支持可变批次大小。要启用此行为,请将even_batches设置为False
创建一个 torch.utils.data.DataLoader,用于高效跳过前 num_batches 个批次。如果原始 dataloader 是 StatefulDataLoader,则不应使用此方法。
BatchSamplerShard
class accelerate.data_loader.BatchSamplerShard
< source >( 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
< source >( 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
< 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 )
参数
- 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
< 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 )
参数
- 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). Another way to see this is that the observed batch size will be the same as the initialdataloaderif this option is set toTrue, the batch size of the initialdataloadermultiplied bynum_processesotherwise. Setting this option toTruerequires that the batch size of thedataloaderis a round multiple ofbatch_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
< source >( optimizerdevice_placement = Truescaler = None )
torch 优化器的内部封装。
在梯度累积期间,如果需要同步梯度,则有条件地执行 step 和 zero_grad。
将优化器设置为“eval”模式。对于 schedule_free 等优化器非常有用。
将优化器设置为“train”模式。对于 schedule_free 等优化器非常有用。
AcceleratedScheduler
类 accelerate.scheduler.AcceleratedScheduler
< source >( scheduleroptimizersstep_with_optimizer: bool = Truesplit_batches: bool = False )
一个学习率调度器的封装器,仅当优化器执行训练步骤时才进行步进。这在混合精度训练中非常有用,可以避免在梯度溢出且未执行训练步骤时,调度器步进过快的问题。
在执行梯度累积时,不应相应地更改调度器的长度,Accelerate 始终会步进调度器以对此进行补偿。