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
传递给 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
)来开始你的多节点训练运行。
建议使用主节点的内网 IP 而不是公网 IP,以获得更好的延迟。这是你在主节点上运行 hostname -I
时看到的 192.168.x.x
或 172.x.x.x
地址。
为了更好地了解多节点训练,请查看我们的 使用 FSDP 进行多节点训练 示例。
< > 在 GitHub 上更新