Hugging Face Accelerate 库发布

Hugging Face 推出了 🤗 Accelerate,这是一个旨在让 PyTorch 用户能够在各种硬件设置(包括单 GPU、多 GPU 集群和 TPU)上运行其原始训练脚本的库,而无需为分布式训练或混合精度重写样板代码。

简化分布式训练和混合精度

Accelerate 允许开发者在保持对训练循环完全控制的同时,移除管理设备放置和分布式设置的复杂性。通过在标准的 PyTorch 脚本中添加少量代码行,用户就可以从单设备设置过渡到分布式环境,而无需手动实现 DistributedDataParallelDistributedSampler

技术实现与核心 API

Accelerate 通过抽象 PyTorch 核心对象的初始化和准备工作来运行。主要接口是 Accelerator 类。

初始化

accelerator = Accelerator() 会分析环境以确定分布式训练运行的类型,并执行必要的初始化。用户可以通过在初始化期间传递 cpu=Truefp16=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 工具,以简化在不同硬件配置下执行脚本的过程:

  1. 配置: accelerate config 会启动一个问答流程,以创建一个带有默认训练设置的配置文件。
  2. 执行: accelerate launch path_to_script.py 使用保存的默认设置运行脚本。

虽然 Accelerate 与 torch.distributed.launch 等传统启动器兼容,但其 CLI 提供了更流线化的体验。该启动器还支持通过 SageMaker 启动 AWS 实例。

未来路线图

Hugging Face 计划扩展 Accelerate,以支持 fairscale、deepspeed 以及 AWS SageMaker 特有的数据并行和模型并行。

Sources