Accelerate documentation
检查点
入门指南
教程
操作指南
Accelerate
训练
梯度累积本地 SGD低精度(FP8)训练DeepSpeed使用 DeepSpeed 搭配多个模型DDP 通信钩子完全分片数据并行Megatron-LMAmazon SageMakerApple M1 GPUIntel CPUIntel Gaudi编译
推理
概念与基础
Accelerate 的内部机制将大型模型加载到内存中比较不同分布式配置下的性能执行和延迟任务梯度同步FSDP 与 DeepSpeedFSDP1 与 FSDP2上下文并行序列并行低精度训练方法在 TPU 上进行训练
参考
You are viewing main version, which requires installation from source. If you'd like
regular pip install, checkout the latest stable version (v1.15.0).
检查点
使用 Accelerate 训练 PyTorch 模型时,您可能经常需要保存并继续训练状态。这需要保存和加载模型、优化器、RNG 生成器以及 GradScaler。Accelerate 内部提供了两个便捷函数来快速实现此功能:
- 使用 save_state() 将上述所有内容保存到文件夹位置
- 使用 load_state() 加载之前通过
save_state保存的所有内容
为了进一步自定义通过 save_state() 保存状态的位置和方式,可以使用 ProjectConfiguration 类。例如,如果启用了 automatic_checkpoint_naming,则每个保存的检查点都将位于 Accelerator.project_dir/checkpoints/checkpoint_{checkpoint_number}。
需要指出的是,预期这些状态来自同一个训练脚本,而不是来自两个独立的脚本。
- 通过使用 register_for_checkpointing(),您可以注册自定义对象,以便自动将其存储或从上述两个函数中加载,前提是该对象具有
state_dict和load_state_dict功能。这可以包括学习率调度器等对象。
下面是一个使用检查点(checkpointing)在训练过程中保存和重新加载状态的简要示例:
from accelerate import Accelerator
import torch
accelerator = Accelerator(project_dir="my/save/path")
my_scheduler = torch.optim.lr_scheduler.StepLR(my_optimizer, step_size=1, gamma=0.99)
my_model, my_optimizer, my_training_dataloader = accelerator.prepare(my_model, my_optimizer, my_training_dataloader)
# Register the LR scheduler
accelerator.register_for_checkpointing(my_scheduler)
# Save the starting state
accelerator.save_state()
device = accelerator.device
my_model.to(device)
# Perform training
for epoch in range(num_epochs):
for batch in my_training_dataloader:
my_optimizer.zero_grad()
inputs, targets = batch
inputs = inputs.to(device)
targets = targets.to(device)
outputs = my_model(inputs)
loss = my_loss_function(outputs, targets)
accelerator.backward(loss)
my_optimizer.step()
my_scheduler.step()
# Restore the previous state
accelerator.load_state("my/save/path/checkpointing/checkpoint_0")恢复 DataLoader 的状态
从检查点恢复后,如果状态是在一个 epoch 的中间保存的,可能还需要从当前 DataLoader 的特定位置继续。您可以使用 skip_first_batches() 来实现这一点。
from accelerate import Accelerator
accelerator = Accelerator(project_dir="my/save/path")
train_dataloader = accelerator.prepare(train_dataloader)
accelerator.load_state("my_state")
# Assume the checkpoint was saved 100 steps into the epoch
skipped_dataloader = accelerator.skip_first_batches(train_dataloader, 100)
# After the first iteration, go back to `train_dataloader`
# First epoch
for batch in skipped_dataloader:
# Do something
pass
# Second epoch
for batch in train_dataloader:
# Do something
pass