Accelerate 文档
DataLoaders、优化器和调度器
并获得增强的文档体验
开始使用
DataLoaders、优化器和调度器
Accelerate 使用的内部类,用于在调用 prepare() 时准备对象以进行分布式训练。
DataLoader 实用工具
accelerate.data_loader.prepare_data_loader
< source >( 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
,仅为一个进程生成批次。
取决于传递的 dataloader
的 drop_last
属性值,它将在第一个批次太小/在所有进程上不存在时停止迭代,或者从头开始循环索引。
默认情况下不启用具有可变批次大小的 BatchSampler
。要启用此行为,请将 even_batches
设置为 False
创建一个 torch.utils.data.DataLoader
,它将有效地跳过前 num_batches
个批次。如果原始数据加载器是 StatefulDataLoader
,则不应使用此方法。
BatchSamplerShard
class accelerate.data_loader.BatchSamplerShard
< source >( 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]
。
- 进程 0 上的采样器产生
- even_batches (
bool
, 可选, 默认为True
) — 当样本数量不是(原始批次大小/进程数)的整数倍时,是否循环回到采样器的开头。
包装 PyTorch BatchSampler
,仅为一个进程生成批次。此类的实例将始终产生批次数量,该数量是 num_processes
的整数倍,并且都具有相同的大小。取决于传递的批采样器的 drop_last
属性值,它将在第一个批次太小/在所有进程上不存在时停止迭代,或者从头开始循环索引。
默认情况下不启用具有可变批次大小的 BatchSampler
。要启用此行为,请将 even_batches
设置为 False
IterableDatasetShard
class accelerate.data_loader.IterableDatasetShard
< source >( 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]
。
- 进程 0 上的分片产生
包装 PyTorch IterableDataset
,仅为一个进程生成样本。此类的实例将始终产生样本数量,该数量是实际批次大小的整数倍(取决于 split_batches
的值,这可以是 batch_size
或 batch_size x num_processes
)。取决于传递的批采样器的 drop_last
属性值,它将在第一个批次太小时停止迭代,或者从头开始循环索引。
DataLoaderShard
class accelerate.data_loader.DataLoaderShard
< source >( 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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
而不是常规的DataLoader
。 - **kwargs (附加关键字参数,可选) — 传递给常规
DataLoader
初始化的所有其他关键字参数。
DataLoaderAdapter
的子类,它将处理设备放置和当前分布式设置。
可用属性
total_batch_size (
int
) — 数据加载器在所有进程中的总批次大小。当split_batches=True
时等于原始批次大小;否则为原始批次大小 * 进程总数total_dataset_length (
int
) — 所有进程中内部数据集的总长度。
DataLoaderDispatcher
class accelerate.data_loader.DataLoaderDispatcher
< source >( 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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
而不是常规的DataLoader
。
DataLoaderAdapter
的子类,它将仅在进程 0 上迭代和预处理,然后在每个进程上分发其批次部分。
可用属性
total_batch_size (
int
) — 数据加载器在所有进程中的总批次大小。当split_batches=True
时等于原始批次大小;否则为原始批次大小 * 进程总数total_dataset_length (
int
) — 所有进程中内部数据集的总长度。
AcceleratedOptimizer
class accelerate.optimizer.AcceleratedOptimizer
< source >( optimizer device_placement = True scaler = None )
torch 优化器的内部包装器。
当执行梯度累积时,如果应该同步梯度,则有条件地执行 step
和 zero_grad
。
将优化器设置为“eval”模式。对于像 schedule_free
这样的优化器很有用
将优化器设置为“train”模式。对于像 schedule_free
这样的优化器很有用
AcceleratedScheduler
class accelerate.scheduler.AcceleratedScheduler
< source >( scheduler optimizers step_with_optimizer: bool = True split_batches: bool = False )
学习率调度器的包装器,它仅在优化器具有训练步骤时才执行 step。在混合精度训练中,当梯度溢出且没有训练步骤时,这对于避免调度器 step 过快很有用
当执行梯度累积时,不应相应地更改调度器长度,Accelerate 将始终 step 调度器以解决此问题。