Accelerate documentation
启动 Accelerate 脚本
启动 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 与自定义 yaml 文件的位置一起传递给 accelerate launch 命令。
对于在单台机器上使用两个 GPU 并通过 fp16 进行混合精度训练,一个示例 yaml 可能如下所示:
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(主/主节点为 0),以及主进程的 IP 地址和端口。这是工作节点与主进程通信所必需的。之后,你可以将此配置文件复制或发送到所有节点,并将machine_rank更改为 1、2、3 等,从而避免在每个节点上重复运行该命令(或者也可以直接按照说明使用torchrun启动)。
完成上述操作后,您可以在所有节点上运行 accelerate launch(或 torchrun)来启动多节点训练任务。
It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command.
建议使用主节点的内网 IP 而非公网 IP,以获得更低的延迟。这是在主节点上运行
hostname -I时看到的192.168.x.x或172.x.x.x地址。
如需进一步了解多节点训练,请查看我们的使用 FSDP 进行多节点训练示例。
Update on GitHub