Hugging Face Accelerate 库发布
Hugging Face 推出了 🤗 Accelerate,这是一个旨在让 PyTorch 用户能够在各种硬件设置(包括单 GPU、多 GPU 集群和 TPU)上运行其原始训练脚本的库,而无需为分布式训练或混合精度重写样板代码。
简化分布式训练和混合精度
Accelerate 允许开发者在保持对训练循环完全控制的同时,移除管理设备放置和分布式设置的复杂性。通过在标准的 PyTorch 脚本中添加少量代码行,用户就可以从单设备设置过渡到分布式环境,而无需手动实现 DistributedDataParallel 或 DistributedSampler。
技术实现与核心 API
Accelerate 通过抽象 PyTorch 核心对象的初始化和准备工作来运行。主要接口是 Accelerator 类。
初始化
accelerator = Accelerator() 会分析环境以确定分布式训练运行的类型,并执行必要的初始化。用户可以通过在初始化期间传递 cpu=True 或 fp16=True 来显式强制进行 CPU 训练或混合精度训练。
prepare 方法
accelerator.prepare() 方法是该库的核心组件。它封装了三种主要的对象类型,使其与分布式环境兼容:
- Models: 封装模型在适当的容器中(例如,
DistributedDataParallel)并处理设备放置。可以通过accelerator.unwrap_model(model)获取模型,以便进行保存或访问特定方法。 - Optimizers: 封装优化器以处理混合精度操作并管理 state dict 的设备放置。
- DataLoaders: 封装 dataloader 以确保每个进程仅从 sampler 中检索相关索引。这消除了用户手动实现
DistributedSampler的要求,并可与提供给 dataloader 的任何 sampler 一起工作。
反向传播
accelerator.backward(loss) 取代了标准的 loss.backward(),以纳入混合精度和其他专门集成的必要步骤。
分布式评估
Accelerate 支持单进程和分布式评估。对于应该仅在主进程上运行的任务,用户可以使用 if accelerator.is_main_process():。
对于分布式评估,该库提供了 accelerator.gather(),它会收集所有进程中的预测值和标签的张量。由于准备好的评估 dataloader 可能会返回额外的元素以确保各进程间批次大小(batch size)一致,用户必须将收集到的结果截断为原始数据集的长度,以确保准确性。
部署与启动
Accelerate 包含一个 CLI 工具,以简化在不同硬件配置下执行脚本的过程:
- 配置:
accelerate config会启动一个问答流程,以创建一个带有默认训练设置的配置文件。 - 执行:
accelerate launch path_to_script.py使用保存的默认设置运行脚本。
虽然 Accelerate 与 torch.distributed.launch 等传统启动器兼容,但其 CLI 提供了更流线化的体验。该启动器还支持通过 SageMaker 启动 AWS 实例。
未来路线图
Hugging Face 计划扩展 Accelerate,以支持 fairscale、deepspeed 以及 AWS SageMaker 特有的数据并行和模型并行。
Sources
- OriginalIntroducing 🤗 Accelerate