Accelerate 文档
数据加载器、优化器和调度器
并获得增强的文档体验
开始使用
数据加载器、优化器和调度器
在调用 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 (
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.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`,使其仅为其中一个进程生成批次。
根据传入的 dataloader
的 drop_last
属性值,它要么在第一个太小/并非在所有进程上都存在的批次处停止迭代,要么从头开始循环索引。
默认情况下不启用具有可变批次大小的 BatchSampler
。要启用此行为,请将 `even_batches` 设置为 `False`。
创建一个 `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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
,而不是常规的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
) — 是否让此类适配来自torchdata
的StatefulDataLoader
,而不是常规的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 )
Torch 优化器的内部包装器。
在进行梯度累积时,如果需要同步梯度,则会有条件地执行 `step` 和 `zero_grad`。
将优化器设置为“评估”模式。对于像 `schedule_free` 这样的优化器很有用。
将优化器设置为“训练”模式。对于像 `schedule_free` 这样的优化器很有用。
AcceleratedScheduler
class accelerate.scheduler.AcceleratedScheduler
< 来源 >( scheduler optimizers step_with_optimizer: bool = True split_batches: bool = False )
学习率调度器的包装器,它只会在优化器进行训练步骤时才步进。这对于避免在梯度溢出且没有训练步骤时(在混合精度训练中)调度器步进过快非常有用。
在进行梯度累积时,调度器的长度不应相应更改,Accelerate 会始终步进调度器以考虑这一点。