Py之accelerate:accelerate的简介、安装、使用方法之详细攻略
目录
(1)、可以在任何类型的单节点或分布式节点设置:向任何标准的PyTorch训练脚本添加5行代码
accelerate的简介
Accelerate 是一个为 PyTorch 用户设计的库,旨在帮助简化分布式训练和混合精度训练的过程。它提供了一种简单且灵活的方式来加速和扩展您的 PyTorch 训练脚本,而无需编写冗长的样板代码。使用户能够更轻松地利用大规模计算资源并加速模型训练过程。
2023年2月,Huggingface发布了Accelerate库,它可以在任何类型的设备上运行你的原始PyTorch训练脚本。accelerate的易于集成的特点如下所示:
>> Accelerate是为PyTorch用户设计的,它们喜欢编写PyTorch模型的训练循环,但不愿意编写和维护使用多GPU/TPU/fp16所需的样板代码。
>> Accelerate仅抽象与多GPU/TPU/fp16相关的样板代码,并保持其余代码不变。
当您希望在分布式环境中轻松运行您的训练脚本而又不希望放弃对训练循环的完全控制时,您应该使用Accelerate。这不是一个在PyTorch之上的高级框架,只是一个薄包装,因此您不必学习一个新的库。事实上,Accelerate的整个API只有一个类,即Accelerator对象。
但是,如果您不想自己编写训练循环,那么您就不应该使用Accelerate。有很多在PyTorch之上的高级库可以提供这个功能,但Accelerate不是其中之一。
1、Accelerate 提供的主要功能和优势:
分布式训练支持: Accelerate 可以帮助您在单个节点或多个节点上进行分布式训练,包括多CPU、多GPU和TPU设置。它抽象出了与分布式训练相关的样板代码,使您可以专注于训练逻辑而不必担心通信和同步问题。
混合精度训练支持: Accelerate 提供了与混合精度训练(如半精度浮点数)相关的工具和优化。通过使用混合精度训练,您可以在几乎不降低模型性能的同时减少内存使用和计算成本。
设备放置和管理: Accelerate 可以自动处理设备放置,将数据和模型移动到正确的设备上,以便充分利用可用的计算资源。这简化了跨设备进行训练的过程,并帮助您避免手动管理设备分配的复杂性。
高度集成: Accelerate 可与 PyTorch 生态系统中的其他工具和库无缝集成。它与常用的 PyTorch 数据加载器和优化器兼容,并且可以与诸如 DeepSpeed、Megatron-LM 和 PyTorch Fully Sharded Data Parallel (FSDP) 等扩展一起使用。
可配置的 CLI 工具: Accelerate 还提供了一个命令行界面 (CLI) 工具,使您能够方便地配置和测试训练环境,而无需手动编写启动脚本。
2、构建在Accelerate之上的框架和库
如果您喜欢Accelerate的简洁性,但希望在其功能上建立一个更高级的抽象层,一些构建在Accelerate之上的框架和库列在下面:
Animus | Animus是一个运行机器学习实验的简约框架。Animus突出了ML实验中常见的“断点”,并为它们提供了一个统一的界面。 |
Catalyst | Catalyst是一个用于深度学习研究和开发的PyTorch框架。它专注于可重现性、快速实验和代码重用,以便您可以创建新的东西,而不是编写另一个训练循环。Catalyst提供了一个Runner,用于连接实验的所有部分:硬件后端、数据转换、模型训练和推理逻辑。 |
fastai | fastai是一个用于深度学习的PyTorch框架,它通过现代最佳实践简化了快速训练和准确的神经网络。fastai提供了一个Learner,用于处理深度学习算法的训练、微调和推理。 |
Finetuner | Finetuner是一个服务,可以为语义搜索、视觉相似性搜索、跨模态文本<->图像搜索、推荐系统、聚类、重复检测、异常检测或其他用途创建更高质量的嵌入。 |
InvokeAI | InvokeAI是稳定扩散模型的创意引擎,提供业界领先的WebUI、终端使用支持,并作为许多商业产品的基础。 |
Kornia | Kornia是一个可微分的库,可以将经典计算机视觉集成到深度学习模型中。Kornia提供了一个Trainer,专门用于训练和微调库中支持的深度学习算法。 |
Open Assistant | Open Assistant是一个基于聊天的助手,能够理解任务、与其它系统进行交互,并动态检索信息以完成任务。 |
pytorch-accelerated | pytorch-accelerated是一个轻量级的训练库,具有围绕通用Trainer的简化功能集,非常注重简单性和透明性;使用户可以了解底层发生了什么,但无需自己编写和维护样板代码! |
Stable Diffusion web UI | Stable Diffusion web UI是一个基于Gradio库的开源浏览器界面,用于稳定扩散。 |
torchkeras | torchkeras是一个简单的工具,可以以keras风格训练pytorch模型,在notebook中提供了一个动态且美观的绘图,用于监视您的损失或指标。 |
accelerate的安装
1、安装
本存储库在Python 3.8+和PyTorch 1.10.0+上进行了测试,建议在虚拟环境中安装Accelerate
首先,使用您要使用的Python版本创建一个虚拟环境并激活它。
然后,您将需要安装PyTorch:请参阅官方安装页面以了解适用于您平台的特定安装命令。然后,可以使用pip安装Accelerate,如下所示:
pip install accelerate
(1)、支持的集成
仅CPU
单个节点(机器上的多CPU)
多个节点(机器上的多CPU)
单个GPU
单个节点上的多GPU(机器上的多GPU)
多个节点上的多GPU(机器上的多GPU)
TPU
FP16/BFloat16混合精度
具有Transformer Engine的FP8混合精度
DeepSpeed支持(实验性)
PyTorch Fully Sharded(实验性)
2、启动脚本
>> Accelerate还提供了一个可选的命令行工具,允许您在启动脚本之前快速配置和测试您的训练环境。无需记住如何使用torch.distributed.run或编写特定的TPU训练启动器!在您的机器上只需运行:
accelerate config
然后回答所提出的问题。这将生成一个配置文件,将在执行以下命令时自动使用以正确设置默认选项:
accelerate launch my_script.py --args_to_my_script
例如,以下是如何在MRPC任务上运行GLUE示例(从repo的根目录):
accelerate launch examples/nlp_example.py
此CLI工具是可选的,您仍然可以根据需要使用python my_script.py或python -m torchrun my_script.py。
3、使用MPI启动多CPU运行
这是另一种使用MPI启动多CPU运行的方法。您可以在此页面上了解如何安装Open MPI。您也可以使用Intel MPI或MVAPICH。一旦在您的集群上设置了MPI,只需运行:
mpirun -np 2 python examples/nlp_example.py
4、使用DeepSpeed启动训练
Accelerate支持使用DeepSpeed在单个/多个GPU上进行训练。要使用它,您不需要更改训练代码中的任何内容;您可以使用accelerate config来设置所有内容。但是,如果您希望从Python脚本中调整DeepSpeed相关参数,我们为您提供了DeepSpeedPlugin。
from accelerate import Accelerator, DeepSpeedPlugin
# deepspeed需要预先知道梯度累积步数,所以不要忘记传递它。请记住,您仍然需要自己进行梯度累积,就像您在没有使用deepspeed时所做的那样
deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2)
accelerator = Accelerator(mixed_precision='fp16', deepspeed_plugin=deepspeed_plugin)
# 如何保存您的Transformer?
accelerator.wait_for_everyone()
unwrapped_model = accelerator.unwrap_model(model)
unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model))
注意:目前DeepSpeed支持处于实验阶段。如果遇到问题,请提出问题。
5、从notebook启动训练
Accelerate还提供了一个notebook_launcher函数,您可以在笔记本中使用它来启动分布式训练。这对于具有TPU后端的Colab或Kaggle笔记本特别有用。只需在一个训练功能中定义您的训练循环,然后在您的最后一个单元格中添加:
from accelerate import notebook_launcher
notebook_launcher(training_function)
您可以在此notebook中找到一个示例。在Colab中打开
accelerate的使用方法
1、基础用法
(1)、可以在任何类型的单节点或分布式节点设置:向任何标准的PyTorch训练脚本添加5行代码
如您在这个例子中所见,通过向任何标准的PyTorch训练脚本添加5行代码,您现在可以在任何类型的单节点或分布式节点设置(单CPU,单GPU,多GPU和TPU),以及带或不带混合精度(fp16)下运行。
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()
特别地,相同的代码可以在本地机器上进行调试,也可以在您的训练环境中运行,而无需修改。
(2)、处理设备放置
Accelerate甚至为您处理设备放置(这需要对您的代码进行一些更改,但通常更安全),因此您甚至可以进一步简化训练循环:
import torch
import torch.nn.functional as F
from datasets import load_dataset
+ from accelerate import Accelerator
- device = 'cpu'
+ accelerator = Accelerator()
- model = torch.nn.Transformer().to(device)
+ model = torch.nn.Transformer()
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()