Accelerate

加速你的 PyTorch 训练:深入了解Accelerate 库

Accelerate

Accelerate 是一个为 PyTorch 用户设计的库,旨在帮助简化分布式训练和混合精度训练的过程。它提供了一种简单且灵活的方式来加速和扩展您的 PyTorch 训练脚本,而无需编写冗长的样板代码。使用户能够更轻松地利用大规模计算资源并加速模型训练过程。在无需大幅修改代码的情况下完成并行化,支持 DeepSpeed 的多种 ZeRO 策略。

代码效率高,支持无论是单机单卡还是多机多卡适配同一套代码。

允许在单个实例上训练更大的数据集:Accelerate 还可以使 DataLoaders 更高效。这是通过自定义采样器实现的,它可以在训练期间自动将部分批次发送到不同的设备,从而允许每个设备只需要储存数据的一部分,而不是一次将数据复制四份存入内存。

支持 DeepSpeed:无需更改代码,只用配置文件即可对 DeepSpeed 开箱即用。

分布式推理

当模型参数大到单张卡放不下时候(哪怕 batchsize 为 1 也会报显存不足的情况),这里就需要将大模型中的不同 layer 放到不同的 GPU 上,而每个 GPU 只负责其中一部分训练,当然数据在不同卡上流转的时候,都需要自动将数据放到对应的卡上。



from accelerate import dispatch_model
# device_map设置为自动的最方便了,不用自己设计把模型的layer分配到哪个GPU
model = dispatch_model(model, device_map="auto")
# 打印device_map
print(model.hf_device_map)
print(f'memory_allocated {torch.cuda.memory_allocated()}')


分布式训练

下面是官方的例子,只需要更新几行代码即可开启分布式训练之旅啦!

代码块

import torch
import torch.nn.functional as F
from datasets import load_dataset
from accelerate import Accelerator

accelerator = Accelerator()
device = 'cpu'
device = accelerator.device

model = torch.nn.Transformer().to(device)
optimizer = torch.optim.Adam(model.parameters())
dataset = load_dataset('my_dataset')
data = torch.utils.data.DataLoader(dataset, shuffle=True)

model, optimizer, data = accelerator.prepare(model, optimizer, data)
model.train()

for epoch in range(10):
    for source, targets in data:
        source = source.to(device)
        targets = targets.to(device)

        optimizer.zero_grad()
        output = model(source)
        loss = F.cross_entropy(output, targets)

        loss.backward()
        accelerator.backward(loss)
        optimizer.step()

        # 等待所有进程达到一定程度后再执行指令
        accelerator.wait_for_everyone()

        # 只在主进程中保存模型
        if self._accelerator.is_main_process:
            unwrapped_model = accelerator.unwrap_model(model)
            accelerator.save(unwrapped_model, model_path)
            torch.save(unwrapped_model.state_dict(), "./model/accelerate.pt")