Optimum 文档

多节点训练

您正在查看 版本,需要从源代码安装. 如果你想使用 pip 进行常规安装,请查看最新稳定版本 (v1.23.1).
Hugging Face's logo
加入 Hugging Face 社区

并获取增强版文档体验

开始使用

多节点训练

使用多个 Gaudi 服务器进行多节点训练非常容易。本指南介绍如何

  • 设置多个 Gaudi 实例
  • 设置您的计算环境
  • 启动多节点运行

设置多个 Gaudi 实例

两种配置方式可供选择

  • 使用 Gaudi NIC 或主机 NIC 进行扩展(本地)
  • 使用 AWS DL1 实例进行扩展

本地

要在本地设置服务器,请查看 Habana Gaudi 文档中的 安装分布式训练 页面。

AWS DL1 实例

执行以下步骤以正确设置您的 DL1 实例。

1. 设置启用 EFA 的安全组

要允许所有实例相互通信,您需要设置一个安全组,如 AWS 在 此链接 中步骤 1 中所述。完成此操作后,它应该如下所示

Rules of the security group 在 AWS DL1 实例上进行多节点训练的安全组

2. 启动实例

从 AWS EC2 控制台启动实例时,您可以选择要设置的节点数量。

我们建议您为您的 AWS DL1 实例使用 Habana 深度学习基础 AMI。它是一个启用 EFA 的 AMI,因此您不需要安装 EFA 软件(如果您使用的是其他 AMI,则可能需要安装 EFA 软件,安装说明 此处)。

然后,在 *网络设置* 中,选择您在上一步骤中创建的 *安全组*。您还需要选择特定的 *子网* 以解锁 *高级网络配置*,您可以在其中启用 *弹性结构适配器*。

要设置的最后一个参数是 *高级详细信息* 中的 *放置组*。如果您没有任何放置组,则可以创建一个。*放置策略* 应设置为 *集群*。

它应该如下所示

Rules of the security group 启动启用 EFA 的 AWS 实例的参数。要设置的重要参数以红色圆圈标出。为了清晰起见,并非所有参数都已显示。

更多信息 此处

启动多节点运行

一旦您的 Gaudi 实例准备就绪,您需要

  1. 在您的实例上启用无密码 SSH,以便它们可以相互通信。这里解释了如何操作.
  2. 在 AWS 上,要通过 EFA 进行训练,应该安装 hccl_ofi_wrapper这里是如何操作.
  3. 在 AWS 上,您需要设置以下环境变量(最简单的方法是按照 这里 所述编写一个 .deepspeed_env 文件)
  • HCCL_OVER_OFI=1
  • LD_LIBRARY_PATH=path_to_hccl_ofi_wrapper:/opt/amazon/openmpi/lib:/opt/amazon/efa/lib,其中 path_to_hccl_ofi_wrapper 是您在上一步骤中安装的 hccl_ofi_wrapper 文件夹的路径。
  • (可选) HCCL_SOCKET_IFNAME=my_network_interface。如果未设置,将使用第一个名称不以 lodocker 开头的网络接口。更多信息 这里.

为了简化操作,我们提供了一个 Dockerfile 这里。您只需要将主节点的公钥复制到所有其他节点的 ~/.ssh/authorized_keys 文件中,即可启用无密码 SSH。

然后,您需要编写一个 hostfile,其中包含您的节点的地址和设备数量,如下所示

ip_1 slots=8
ip_2 slots=8
...
ip_n slots=8

最后,有两种方法可以在多个节点上运行您的训练脚本

  1. 使用 gaudi_spawn.py 脚本,您可以运行以下命令
python gaudi_spawn.py \
    --hostfile path_to_my_hostfile --use_deepspeed \
    path_to_my_script.py --args1 --args2 ... --argsN \
    --deepspeed path_to_my_deepspeed_config

其中 --argX 是要运行的脚本的参数。

  1. 使用 DistributedRunner,您可以在脚本中添加此代码片段
from optimum.habana.distributed import DistributedRunner

distributed_runner = DistributedRunner(
    command_list=["path_to_my_script.py --args1 --args2 ... --argsN"],
    hostfile=path_to_my_hostfile,
    use_deepspeed=True,
)

环境变量

如果您需要为所有节点设置环境变量,可以在 .deepspeed_env 文件中指定它们,该文件应位于您执行的本地路径或您的主目录中。格式如下

env_variable_1_name=value
env_variable_2_name=value
...

您可以在 这里 找到 AWS 实例的示例。

建议

  • 强烈建议在多节点运行中使用梯度检查点,以获得最高的速度提升。您可以在 这些示例 中使用 --gradient_checkpointing 启用它,或在您的 GaudiTrainingArguments 中使用 gradient_checkpointing=True 启用它。
  • 更大的批次大小应该会导致更高的速度提升。
  • 不推荐使用多节点推理,因为它可能会提供不一致的结果。
  • 在 AWS DL1 实例上,使用 --privileged 标志运行您的 Docker 容器,以便 EFA 设备可见。

示例

在这个示例中,我们在 WikiText 数据集 上微调一个预训练的 GPT2-XL 模型。我们将使用 Github 存储库中提供的因果语言建模示例

第一步是使用以下命令在多个节点上训练模型

python ../gaudi_spawn.py \
    --hostfile path_to_hostfile --use_deepspeed run_clm.py \
    --model_name_or_path gpt2-xl \
    --gaudi_config_name Habana/gpt2 \
    --dataset_name wikitext \
    --dataset_config_name wikitext-2-raw-v1 \
    --do_train \
    --output_dir /tmp/gpt2_xl_multi_node \
    --learning_rate 4e-04 \
    --per_device_train_batch_size 16 \
    --gradient_checkpointing \
    --num_train_epochs 1 \
    --use_habana \
    --use_lazy_mode \
    --throughput_warmup_steps 3 \
    --deepspeed path_to_deepspeed_config

评估不会在同一个命令中执行,因为我们目前不建议执行多节点推理。

模型训练完成后,我们可以使用以下命令对其进行评估。参数 --model_name_or_path 应该等于先前命令中的参数 --output_dir

python run_clm.py \
    --model_name_or_path /tmp/gpt2_xl_multi_node \
    --gaudi_config_name Habana/gpt2 \
    --dataset_name wikitext \
    --dataset_config_name wikitext-2-raw-v1 \
    --do_eval \
    --output_dir /tmp/gpt2_xl_multi_node \
    --per_device_eval_batch_size 8 \
    --use_habana \
    --use_lazy_mode
< > 在 GitHub 上更新