Accelerate 文档

启动 Accelerate 脚本

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

启动 Accelerate 脚本

在上一个教程中,我们介绍了如何修改你当前的训练脚本以使用 Accelerate。该代码的最终版本如下所示

from accelerate import Accelerator

accelerator = Accelerator()

model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    accelerator.backward(loss)
    optimizer.step()
    scheduler.step()

但是你如何运行此代码并使其利用可用的专用硬件呢?

首先,你应该将上面的代码重写为一个函数,并使其可以作为脚本调用。例如

  from accelerate import Accelerator
  
+ def main():
      accelerator = Accelerator()

      model, optimizer, training_dataloader, scheduler = accelerator.prepare(
          model, optimizer, training_dataloader, scheduler
      )

      for batch in training_dataloader:
          optimizer.zero_grad()
          inputs, targets = batch
          outputs = model(inputs)
          loss = loss_function(outputs, targets)
          accelerator.backward(loss)
          optimizer.step()
          scheduler.step()

+ if __name__ == "__main__":
+     main()

接下来,你需要使用 accelerate launch 启动它。

建议你在使用 accelerate launch 之前运行 accelerate config,以便根据你的喜好配置你的环境。否则,Accelerate 将根据你的系统设置使用非常基本的默认值。

使用 accelerate launch

Accelerate 有一个特殊的 CLI 命令,可通过 accelerate launch 帮助你在系统中启动代码。此命令封装了在各种平台上启动脚本所需的所有不同命令,而无需你记住每个命令是什么。

如果你熟悉自己在 PyTorch 中启动脚本(例如使用 torchrun),你仍然可以这样做。不强制使用 accelerate launch

你可以使用以下命令快速启动脚本

accelerate launch {script_name.py} --arg1 --arg2 ...

只需将 accelerate launch 放在命令的开头,然后像往常一样将其他参数和参数传递给你的脚本即可!

由于这会运行各种 torch spawn 方法,因此所有预期的环境变量也可以在此处修改。例如,以下是如何将 accelerate launch 与单个 GPU 一起使用

# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...

你也可以在不先执行 accelerate config 的情况下使用 accelerate launch,但你可能需要手动传入正确的配置参数。在这种情况下,Accelerate 将为你做出一些超参数决策,例如,如果 GPU 可用,它将默认使用所有 GPU 而不使用混合精度。以下是如何使用所有 GPU 并禁用混合精度进行训练

accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...

或者通过指定要使用的 GPU 数量

accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

要获得更具体的信息,你应该自己传入所需的参数。例如,以下是如何在两个 GPU 上使用混合精度启动同一脚本,同时避免所有警告

accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

有关你可以传入的完整参数列表,请运行

accelerate launch -h

即使你的代码中没有使用 Accelerate,你仍然可以使用启动器来启动你的脚本!

为了可视化这种差异,早期的多 GPU 上的 accelerate launch 使用 torchrun 看起来像这样

MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...

你还可以将启动 CLI 用作 Python 模块本身来启动脚本,从而能够传入其他特定于 Python 的启动行为。为此,请使用 accelerate.commands.launch 而不是 accelerate launch

python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

如果你想使用任何其他 Python 标志执行脚本,你也可以像 -m 一样传入它们,例如,以下示例启用了非缓冲的 stdout 和 stderr

python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

你也可以在 CPU 上运行你的代码!这对于在玩具模型和数据集上进行调试和测试很有帮助。

accelerate launch --cpu {script_name.py} {--arg1} {--arg2}

为什么你应该始终使用 accelerate config

为什么它如此有用,以至于你应该始终运行 accelerate config 呢?

还记得之前对 accelerate launch 以及 torchrun 的调用吗?配置后,要使用所需的部分运行该脚本,你只需直接使用 accelerate launch,而无需传入任何其他内容

accelerate launch {script_name.py} {--arg1} {--arg2} ...

自定义配置

正如前面简要提到的,accelerate launch 主要应通过结合使用 accelerate config 命令设置的配置。这些配置保存到 Accelerate 缓存文件夹中的 default_config.yaml 文件中。此缓存文件夹位于(优先级降序排列)

  • 你的环境变量 HF_HOME 的内容,后缀为 accelerate
  • 如果它不存在,则为你的环境变量 XDG_CACHE_HOME 的内容,后缀为 huggingface/accelerate
  • 如果这也不存在,则为文件夹 ~/.cache/huggingface/accelerate

要拥有多个配置,可以将标志 --config_file 传递给 accelerate launch 命令,并配对自定义 yaml 的位置。

以下 yaml 示例可能类似于在单台机器上使用两个 GPU 并使用 fp16 进行混合精度的配置

compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: false

从该自定义 yaml 文件的位置启动脚本如下所示

accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

多节点训练

使用 Accelerate 进行多节点训练类似于 使用 torchrun 进行多节点训练。启动多节点训练运行的最简单方法是执行以下操作

  • 将你的代码库和数据复制到所有节点。(或将它们放在共享文件系统上)
  • 在所有节点上设置你的 Python 包。
  • 首先在主单节点上运行 accelerate config。在指定节点数后,系统将要求你指定每个节点的 rank(对于主/master 节点,这将为 0),以及主进程的 IP 地址和端口。这是工作节点与主进程通信所必需的。之后,你可以跨所有节点复制或发送此配置文件,将 machine_rank 更改为 1、2、3 等,以避免必须运行该命令(或直接按照他们的说明进行操作,以便也使用 torchrun 启动)

完成此操作后,你可以通过在所有节点上运行 accelerate launch(或 torchrun)来开始你的多节点训练运行。

必须在所有节点上运行该命令才能启动所有内容,而不仅仅是从主节点运行。你可以使用 SLURM 或其他进程执行器来封装此要求并从单个命令调用所有内容。

建议使用主节点的内网 IP 而不是公网 IP,以获得更好的延迟。这是你在主节点上运行 hostname -I 时看到的 192.168.x.x172.x.x.x 地址。

为了更好地了解多节点训练,请查看我们的 使用 FSDP 进行多节点训练 示例。

< > 在 GitHub 上更新