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