Accelerate 文档
启动 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` 命令。
一个示例 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`)来开始您的多节点训练运行。
建议使用主节点的内网 IP 而不是公网 IP 以获得更好的延迟。这是您在主节点上运行 `hostname -I` 时看到的 `192.168.x.x` 或 `172.x.x.x` 地址。
要更好地了解多节点训练,请查看我们关于使用 FSDP 进行多节点训练的示例。
< > 在 GitHub 上更新