HPC Pack 中的分布式 AI 模型训练

背景

在当今,AI 模型正在不断发展,变得更加实质性,需要对高级硬件和计算机群集的需求不断增加,以便进行高效的模型训练。 HPC Pack 可以有效地简化模型训练工作。

PyTorch 分布式数据并行 (又名 DDP)

若要实现分布式模型训练,必须利用分布式训练框架。 框架的选择取决于用于生成模型的框架。 在本文中,我将指导你如何继续在 HPC Pack 中使用 PyTorch。

PyTorch 提供了多种分布式训练方法。 其中,分布式数据并行 (DDP) 因其简单性以及当前单机训练模型所需的代码更改最少而广为首选。

为 AI 模型训练设置 HPC Pack 群集

可以使用本地计算机或在 Azure 上) 虚拟机 (VM 设置 HPC Pack 群集。 只需确保这些计算机都配备了 (本文中的 GPU,我们将使用 Nvidia GPU) 。

通常,一个 GPU 可以有一个进程用于分布式训练工作。 因此,如果你有两台计算机 (计算机群集中的节点) ,每个计算机都配备了四个 GPU,则可以实现 2 * 4,这相当于 8 个并行进程,用于单个模型训练。 与单个进程训练相比,此配置可能会将训练时间减少到大约 1/8,省略进程之间同步数据的一些开销。

在 ARM 模板中创建 HPC Pack 群集

为简单起见,可以在 GitHub 上的 ARM 模板中在 Azure 上启动新的 HPC Pack 群集。

选择模板“适用于 Linux 工作负载的单头节点群集”,并单击“部署到 Azure”

选择 ARM 模板

请参阅 先决条件 ,了解如何制作和上传证书以使用 HPC Pack。

请注意:

  1. 应选择标记为“HPC”的计算节点映像。 这表示已在映像中预安装了 GPU 驱动程序。 如果不这样做,需要在以后的阶段在计算节点上手动安装 GPU 驱动程序,由于 GPU 驱动程序安装的复杂性,这可能是一项具有挑战性的任务。 可 在此处找到有关 HPC 映像的详细信息。

    选择 HPC 节点映像

  2. 应选择具有 GPU 的计算节点 VM 大小。 这是 N 系列 VM 大小

    使用 GPU 选择 VM 大小

在计算节点上安装 PyTorch

在每个计算节点上,使用 命令安装 PyTorch

pip3 install torch torchvision torchaudio

提示:可以利用 HPC Pack“运行命令” 跨一组群集节点并行运行命令。

设置共享目录

在运行训练作业之前,需要一个可供所有计算节点访问的共享目录。 目录用于训练代码和数据 (输入数据集和输出训练模型) 。

可以在头节点上设置 SMB 共享目录,然后使用 cifs 将其装载到每个计算节点上,如下所示:

  1. 在头节点上,在 下%CCP_DATA%\SpoolDir创建一个目录app,默认情况下,HPC Pack 已将其共享为 CcpSpoolDir

  2. 在计算节点上,装载目录, app

    sudo mkdir /app
    sudo mount -t cifs //<your head node name>/CcpSpoolDir/app /app -o vers=2.1,domain=<hpc admin domain>,username=<hpc admin>,password=<your password>,dir_mode=0777,file_mode=0777
    

    注意:

    • 可以在 password 交互式 shell 中省略 选项。 在这种情况下,系统将提示你输入它。
    • dir_modefile_mode 设置为 0777,以便任何 Linux 用户可以读取/写入它。 受限权限是可能的,但要配置起来更为复杂。
  3. (可选)通过在 中添加行 /etc/fstab 来永久安装,例如

    //<your head node name>/CcpSpoolDir/app cifs vers=2.1,domain=<hpc admin domain>,username=<hpc admin>,password=<your password>,dir_mode=0777,file_mode=0777 0 2
    

    此处为 password 必填项。

运行训练作业

假设现在有两个 Linux 计算节点,每个节点都有四个 NVidia v100 GPU。 我们已在每个节点上安装了 PyTorch。 我们还设置了共享目录“app”。 现在,我们可以开始训练工作了。

在这里,我使用的是基于 PyTorch DDP 构建的简单玩具模型。 可以在 GitHub 上获取代码

将以下文件下载到头节点上的共享目录中%CCP_DATA%\SpoolDir\app

  • neural_network.py
  • operations.py
  • run_ddp.py

然后创建一个作业,其中 Node 作为资源单元,为该作业创建两个节点,例如

作业详细信息

使用 GPU 显式指定两个节点,例如

作业资源选择

然后添加作业任务,例如

编辑作业任务

任务的命令行都是相同的,例如

python3 -m torch.distributed.run --nnodes=<the number of compute nodes> --nproc_per_node=<the processes on each node> --rdzv_id=100 --rdzv_backend=c10d --rdzv_endpoint=<a node name>:29400 /app/run_ddp.py
  • nnodes 指定训练作业的计算节点数。
  • nproc_per_node 指定每个计算节点上的进程数。 它不能超过节点上的 GPU 数。 也就是说,一个 GPU 最多可以有一个进程。
  • rdzv_endpoint 指定充当 Rendezvous 的节点的名称和端口。 训练作业中的任何节点都可以工作。
  • “/app/run_ddp.py”是训练代码文件的路径。 请记住, /app 是头节点上的共享目录。

提交作业并等待结果。 可以查看正在运行的任务,例如

查看作业任务

请注意,如果结果太长,“结果”窗格会显示截断的输出。

就是这样。 我希望你得到积分,HPC Pack 可以加快你的训练工作。