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 方法,因此所有预期的环境变量也可以在此处修改。例如,以下是如何使用单个 GPU 与 accelerate launch

CUDA_VISIBLE_DEVICES="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 --num_machines=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 一样将它们传入,例如以下示例启用未缓冲的标准输出和标准错误:

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。在指定节点数量后,系统会要求您指定每个节点的排名(对于主/主节点,这将为 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 上更新