Hugging Face开源库accelerate详解

Accelerate是HuggingFace的一个工具,它简化了在多GPU环境中的深度学习模型训练。该库自动处理设备放置、梯度累积、混合精度训练和分布式策略。用户可以通过初始化Accelerator对象并替换特定的训练步骤来适应GPU训练,如使用accelerator.backward()替代loss.backwards()。此外,Accelerate支持模型的保存和加载,以及在低资源环境下加载大型模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网:https://huggingface.co/docs/accelerate/package_reference/accelerator

Accelerate使用步骤

  1. 初始化accelerate对象accelerator = Accelerator()
  2. 调用prepare方法对model、dataloader、optimizer、lr_schedluer进行预处理
  3. 删除掉代码中关于gpu的操作,比如.cuda()、.to(device)等,让accelerate自行判断硬件设备的分配
  4. 将loss.backbard()替换为accelerate.backward(loss)
  5. 当使用超过1片GPU进行分布式训练时,在主进程中使用gather方法收集其他几个进程的数据,然后在计算准确率等指标

Accelerator对象初始化参数

  1. device_placement (bool, optional, defaults to True) — 是否让accelerate来确定tensor应该放在哪个device
  2. split_batches (bool, optional, defaults to False) — 分布式训练时是否对dataloader产生的batch进行split,如果True,那么每个进程使用的batch size = batch size / GPU数量,如果是False,那么每个进程使用就是batch size,总的batch size = batch size * GPU数量
  3. mixed_precision (str, optional) — 是否使用混合精度训练
  4. gradient_accumulation_steps (int, optional, default to 1) — 梯度累加的步数,也可以使用GradientAccumulationPlugin插件进行详细配置
  5. cpu (bool, optional) — 是否强制使用CPU执行
  6. deepspeed_plugin (DeepSpeedPlugin, optional) — 使用此参数调整与DeepSpeed相关的参数,也可以使用accelerate config直接配置
  7. fsdp_plugin (FullyShardedDataParallelPlugin, optional) — 使用此参数调整FSDP(Fully Sharded Data Parallel)相关参数,也可以使用accelerate config直接配置
  8. megatron_lm_plugin (MegatronLMPlugin, optional) — 使用此参数调整与MegatronLM相关的参数,可以使用accelerate config直接配置
  9. step_scheduler_with_optimizer (bool, *optional, defaults to True) – lr_scheduler是否和optimizer同步更新
  10. gradient_accumulation_plugin (GradientAccumulationPlugin, optional) — 梯度累积插件

Accelerate常用高阶用法

  1. accelerator.print()
    当使用多片GPU训练时,打印每个进程的信息,替换python的print函数,这样在每个server上只打印一次,其实就是先使用is_local_main_process判断的print。
    在这里插入图片描述
  2. accelerator.is_local_main_process
    可以当做装饰器使用,在一个具有多片GPU的server上只执行一次,local表示每台机器。与is_local_main_process对应的是is_main_process,is_local_main_process每个server上的主进程,is_main_process是所有server的主进程。
    在这里插入图片描述
    在这里插入图片描述
  3. wait_for_everyone()
    同步控制,确保在后续操作之前所有前提操作已完成
  4. accelerator.save_model() / load_state_dict /
    load_checkpoint_in_model
    模型保存,自动去除掉由于分布式训练在模型上做的包装(调用unwrap_model),保存state_dict,并且可以对大模型文件进行分块存储。并加载保存的模型
  5. Accelerate与Transformers库搭配使用进行模型保存
    在这里插入图片描述
    在这里插入图片描述
  6. 使用accelerator做梯度裁剪:
    在这里插入图片描述
    在这里插入图片描述
  7. 梯度累加gradient accumulation
    尤其对于超大规模的模型,模型参数本来就已经很大了,如果再用很大的batch size进行训练,硬件资源吃不消,但是如果用很小的batch size训练的话模型稳定性很差,所以梯度累加gradient accumulation是一个这种的解决方案,其实就是连续执行多次forward前向过程,在多次执行期间不进行反向传播,每次都是很小的batch size,多次就累积成了比较大的batch size,然后在累积的结果上做反向传播。Accelerate在梯度累加期间暂停在不同GPU之间的梯度同步,进一步减少了通信数据量。
    在这里插入图片描述
    GradientAccumulationPlugin提供了更灵活梯度累加操作,除了能指定累加的步数,还能指定在累计过程中是否更新lr_scheduler调节器。
    在这里插入图片描述
  8. autocast混合精度训练
    对处于with上下文管理中的模块使用混合精度训练
    在这里插入图片描述
  9. gather、gather_for_metrics
    分布式训练时,在不同进程之间回收结果数据
  10. Prepare
    为分布式训练和混合精度做准备,然后以相同的顺序返回它们。
  11. reduce:跨进程做tensor的reduce操作
  12. save_state / load_state:保存、加载模型的状态数据
  13. unscale_gradients:混合训练过程中不对梯度进行缩放
    在这里插入图片描述
  14. unwrap_model
    去掉模型上由prepare加上的用于做分布式训练的包装层,在保存模型的时候比较有用
    在这里插入图片描述

4、使用accelerate执行分布式训练

  • 执行accelerate config根据提问和实际硬件情况设置配置文件
  • 执行accelerate test --config_file path_to_config.yaml验证环境配置是否正常
  • 执行进行命令进行分布式训练,accelerate launch --config_file path_to_config.yaml path_to_script.py --args_for_the_script

5、使用Accelerate在低资源环境下加载大的模型

  • 参考:https://huggingface.co/docs/accelerate/usage_guides/big_modeling
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值