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 (
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
,可选) -- 如果传递,则此函数将用于跨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
以仅为一个进程生成批次。
根据传递的 dataloader
的 drop_last
属性的值,它将停止在第一个过小/不在所有进程上的批次的迭代,或者循环使用从开头开始的索引。
默认情况下不启用具有不同批大小的 BatchSampler
。要启用此行为,请将 even_batches
设置为 False
创建一个 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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
而不是常规的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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
而不是常规的DataLoader
。
DataLoaderAdapter
的子类,它只在进程 0 上迭代和预处理,然后在每个进程上分发其批次的一部分。
可用属性
total_batch_size (
int
) — 所有进程中数据加载器的总批次大小。当split_batches=True
时等于原始批次大小;否则为原始批次大小 * 进程总数total_dataset_length (
int
) — 所有进程中内部数据集的总长度。
AcceleratedOptimizer
类 accelerate.optimizer.AcceleratedOptimizer
< 源代码 >( optimizer device_placement = True scaler = None )
围绕 torch 优化器的内部包装器。
在执行梯度累积时,如果应同步梯度,则有条件地执行 step
和 zero_grad
。
将优化器设置为“评估”模式。对于像 schedule_free
这样的优化器很有用。
将优化器设置为“训练”模式。对于像 schedule_free
这样的优化器很有用。
AcceleratedScheduler
类 accelerate.scheduler.AcceleratedScheduler
< 源代码 >
学习率调度器的包装器,它只会在优化器(s) 有训练步骤时进行更新。这有助于避免在梯度溢出且没有训练步骤时(在混合精度训练中)调度器更新过快。
在执行梯度累积时,不应相应地更改调度器长度,Accelerate 将始终更新调度器以考虑这一点。