type
status
date
slug
summary
tags
category
icon
password
之前跑多卡并行一直用的 DaraParallel,存在负载不均衡的问题。从师兄那里了解到 Accelerate 库,折腾了一阵子,解决了多卡并行负载均衡和混合精度训练的问题。在此将配置的详情和踩过的坑作以记录。
Accelerate 是一个 PyTorch 的分布式训练库,可以实现多卡并行和混合精度训练。它的优点是简单易用,只需要在原有代码的基础上添加几行代码即可实现多卡并行和混合精度训练。其实现原理是通过 torch.distributed 库实现的,但是 Accelerate 库对 torch.distributed 库进行了封装,使得使用起来更加方便。(本段由 Copilot 生成)

一、安装

或者

二、配置

安装完成后,首先需要运行 accelerate config,通过 CLI 交互完成配置,之后会在 ~/.cache/huggingface/accelerate 目录下生成 default_config.json 文件。配置的详细过程如下:

三、使用

关于这部分可以参考 Accelerate 官方文档,文档里有一个很方便的 QuickTour常用代码片段,包含了各种常见用法,这里只是简单的记录一下。
官方宣传的是,只要在原有 Pytorch 代码基础上添加四行代码就行了。主要的改动就是定义好 model 等之后交给 accelerator 实例进行打包,在反向传播时使用 accelerator.backward 代替 loss.backward
不过在实际使用中,难免要遇到一些问题:
  1. 半精度训练
在半精度训练时,遇到了 Halffloat 类型不匹配的报错。这就需要把 loss 的计算用 accelerator.autocast 包裹起来,类似于 torch.cuda.amp.autocast 的用法。
  1. 梯度累积
如果要使用梯度累计,需要在初始化 accelerator 时传入需要累积的步数,然后把每个 batch 的计算包裹在 accelerator.accumulate 中。
  1. 训练中输出中间变量
如果需要在训练过程中保存一些图片,一定要指定在主进程中进行,否则会出现非标准的行为。
类似的,更新 tqdm 进度条也需要在主进程中进行:
假如只是需要打印一些 log,可以简单的改用 accelerator.print
服务器快速配置速查谁来吃最后一块炸鸡?