Accelerate 文档
Accelerate 的内部机制
并获得增强的文档体验
开始入门
Accelerate 的内部机制
在内部,Accelerate 的工作原理是首先分析启动脚本的环境,以确定使用哪种分布式设置、有多少不同的进程以及当前脚本在哪个进程中。所有这些信息都存储在 ~AcceleratorState
中。
此类在您首次实例化 ~Accelerator 时以及执行分布式设置所需的任何特定初始化时进行初始化。然后,它的状态在 AcceleratorState 的所有实例中唯一共享。(PartialState 也可以做到这一点,它是继承自它的更精简版本)
然后,当调用 prepare() 时,库会
- 将您的模型包装在适用于分布式设置的容器中,
- 将您的优化器包装在 AcceleratedOptimizer 中,
- 将您的调度器包装在 AcceleratedScheduler 中
- 在 DataLoaderShard 或 DataLoaderDispatcher 中创建您的数据加载器的新版本
虽然模型、优化器和调度器只是放在简单的包装器中,但数据加载器会被重新创建。这主要是因为 PyTorch 不允许用户在数据加载器创建后更改其 batch_sampler
,并且该库通过更改 batch_sampler
以产生每隔 num_processes
批次(如果启用)来处理进程之间的数据分片。
DataLoaderShard 子类化 DataLoader
以添加以下功能
- 它在每次新迭代时同步所有进程的适当随机数生成器,以确保在进程之间以完全相同的方式完成任何随机化(如洗牌)。
- 它在产生批次之前将批次放在适当的设备上(除非您选择不使用
device_placement=True
)。
DataLoaderDispatcher 子类化与 DataLoaderShard 的不同之处在于,当遍历 DataLoader
时,数据全部从进程 0 开始,然后 分割并发送到每个进程,而不是在数据集级别发生。
随机数生成器同步将默认同步
- PyTorch >= 1.6 的给定采样器的
generator
属性(如 PyTorchRandomSampler
) - PyTorch <=1.5.1 中的主随机数生成器
您可以选择使用主 Accelerator 的 rng_types
参数同步哪些随机数生成器。在 PyTorch >= 1.6 中,建议依赖本地 generator
以避免在所有进程中的主随机数生成器中设置相同的种子。
主 torch(或 CUDA 或 XLA)随机数生成器的同步将影响您在数据集中可能拥有的任何其他潜在随机伪像(如随机数据增强),因为所有进程将从 torch 随机模块获得相同的随机数(因此如果由 torch 控制,将应用相同的随机数据增强)。
您的自定义采样器、批次采样器或可迭代数据集的随机化部分应使用本地 torch.Generator
对象(在 PyTorch >= 1.6 中)完成,请参见传统的 RandomSampler
作为示例。
如果您安装了 torchdata>=0.8.0
,并且您已将 use_stateful_dataloader=True
传递到您的 DataLoaderConfiguration 中,这些类将直接继承自 StatefulDataLoader
,并维护 state_dict
。
有关内部结构的更多详细信息,请参阅内部结构页面。
< > 在 GitHub 上更新