大规模深度学习:并行模型训练

原文:towardsdatascience.com/deep-learning-at-scale-parallel-model-training-d7c22904b5a4?source=collection_archive---------9-----------------------#2024-04-05

概念与 Pytorch Lightning 示例

https://medium.com/@caroline.arnold_63207?source=post_page---byline--d7c22904b5a4--------------------------------https://towardsdatascience.com/?source=post_page---byline--d7c22904b5a4-------------------------------- Caroline Arnold

·发表于Towards Data Science ·阅读时间 7 分钟·2024 年 4 月 5 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9889f32b020f8d3fbe4ebe73db1d32fe.png

图片由作者使用 Midjourney 创建。

在大量 GPU 上进行并行训练是深度学习的前沿技术。开源图像生成算法 Stable Diffusion在 256 个 GPU 集群上进行了训练。Meta 的AI 研究超级集群包含超过 24,000 个 NVIDIA H100 GPU,用于训练像 Llama 3 这样的模型。

通过使用多个 GPU,机器学习专家减少了训练过程的墙时。训练 Stable Diffusion花费了 150,000 个 GPU 小时,相当于超过 17 年。并行训练将其减少到 25 天。

存在两种类型的并行深度学习

  • 数据并行性,将大型数据集分布到多个 GPU 上。

  • 模型并行性,将过大无法在单个 GPU 上运行的深度学习模型分布到多个设备上。

我们在这里将重点讨论数据并行性,因为模型并行性仅在非常大的模型(超过 500M 参数)时才相关

除了减少壁钟时间外,进行并行训练还有一个经济学上的理由:云计算提供商如AWS 提供单台机器,配备最多 16 个 GPU。并行训练可以利用所有可用的 GPU,从而让你用更少的钱获得更多的价值。

并行计算

并行性是高性能计算中的主流范式。程序员识别出可以独立执行的任务,并将它们分配到大量设备上。程序的串行部分负责分发任务并收集结果。

并行计算可以减少计算时间。一程序如果在四个设备上并行运行,相比于在单个设备上运行,理想情况下可以快四倍。实际上,通信开销限制了这种扩展。

打个比方,想象一群画家在画一面墙。通信开销出现在工头告诉每个人使用什么颜色、涂哪里时。涂画的过程可以并行进行,只有最后的收尾工作是串行的任务。

训练深度学习模型

训练深度学习算法需要数据和一个优化程序,如随机梯度下降。

训练数据被打乱并分成固定大小的批次。每批次,训练程序都会计算实际标签和预测标签之间的损失。模型参数会根据损失相对于模型参数的梯度进行调整。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9f2d4393572ca20cfa46824bd8c9d985.png

随机梯度下降。图片由作者制作。

当模型已经遍历过所有训练数据批次一次时,epoch就完成了。

分布式数据并行

下图描述了使用 3 个 GPU 进行深度学习模型训练的数据并行。未训练的模型副本被复制到每个 GPU 上。数据集被分成 3 个部分,每个部分在不同的 GPU 上并行处理。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2f7994943c709cc560310884b328f8f5.png

分布式数据,相同的模型。图片由作者制作。

请注意,每个模型副本看到的训练数据子集是不同的。完成一个 epoch 后,每个模型副本中的权重和偏差都会有所不同。

通过在所有模型实例之间平均权重来协调这三个模型副本。更新后的模型会广播到所有 3 个 GPU,训练继续进行到下一个 epoch。

分布式训练将有效批次大小改变为设备数量 * 原始批次大小。这可能会影响训练、收敛性和模型表现。

在 Pytorch Lightning 中的实现

数据并行需要以下几个要素:

  • 一个可以处理分布式训练的数据加载器

  • 一个all-reduce函数,用于协调模型副本

  • 一个用于不同并行部分之间相互通信的框架

在 PyTorch Lightning 中,Lightning Trainer 处理整个训练过程。通过指定以下关键字参数,它可以开箱即用地执行分布式数据并行训练:

  • 节点数量——你想要使用的云计算集群中的机器数量

  • 每个节点的设备数量(GPU)每个节点

  • 训练策略,这里是分布式数据并行。对于分布式训练,有不同的策略可供选择,它们负责调整训练过程。

对于在 2 个节点,每个节点有 2 个 GPU 的分布式数据并行(ddp)训练,请使用:

import lightning as L

trainer = L.Trainer(nodes=2, devices=2, strategy='ddp')
trainer.fit(model, dataloader)

默认情况下,Lightning Trainer 会在计算环境中使用所有可用的 GPU。这意味着,如果你只想在多 GPU 机器上使用单个 GPU,则需要明确指定。

实验:使用 Country211 数据集进行并行训练

Country211 数据集包含来自 211 个国家的地理标签图像。在我的实验中,我使用了一个预训练的视觉 Transformer,并在 Country211 数据集上微调此模型。代码可在GitHub上获取。

## 如何在卫星数据上微调预训练的视觉 Transformer

PyTorch Lightning 中的逐步教程

towardsdatascience.com

共有 31,650 张训练图像。我在整个过程中使用了批量大小为 256,并且实验了 GPU 数量,从单个节点上的单个 GPU 到分布在四个节点上的八个 GPU。我应用了提前停止条件,如果验证准确率在五个轮次内没有改善,则停止训练。

训练的墙时间,即训练模型所需的总时间,随着使用的 GPU 数量增加而减少。在单个 GPU 上,墙时间为 45 分钟,而在使用 8 个 GPU 时,墙时间降至 11 分钟。

理想的扩展性应为 45 分钟 / 8 个 GPU = 5.6 分钟,但在更多 GPU 上训练时,由于通信开销和训练轮次增多,我们无法达到这一最优值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e288058bf56d71bc57ef28cd0c8acbe3.png

不同数量设备的墙时间。图像由作者创建。

为了比较泛化能力,我计算了所有训练模型的测试集准确率。在单一设备上的单个 GPU 训练时,获得了最佳的测试集准确率,但即便如此,模型在泛化方面仍然存在问题:测试集准确率仅为 15%。

面板展示了不同数量 GPU 下准确率的下降,相对于最佳结果。使用的设备越多,应用到测试集时模型的准确性就越差。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/28b987cf516ae749486725807cc19f5d.png

测试集准确率。图像由作者创建。

准确率的变化可能是由于有效批次大小的变化——请注意,依据训练策略,我们不会得到完全相同的模型。

在本次实验中,泛化准确性与速度之间存在权衡。使用 8 个 GPU 训练比单设备训练快了四倍,但准确性比单设备训练低了 11%。

平行训练概述

在训练日志文件中,你将看到像这样的行:

Initializing distributed: GLOBAL_RANK: 2, MEMBER: 3/4
Initializing distributed: GLOBAL_RANK: 0, MEMBER: 1/4
Initializing distributed: GLOBAL_RANK: 3, MEMBER: 4/4
Initializing distributed: GLOBAL_RANK: 1, MEMBER: 2/4
----------------------------------------------------------------------------------------------------
distributed_backend=nccl
All distributed processes registered. Starting with 4 processes
----------------------------------------------------------------------------------------------------
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]
LOCAL_RANK: 1 - CUDA_VISIBLE_DEVICES: [0,1]
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]
LOCAL_RANK: 1 - CUDA_VISIBLE_DEVICES: [0,1]

并行训练过程必须能够互相通信。这里的通信后端是 NVIDIA 集体通信库(nccl),根据平台会自动初始化。

我们请求了两个节点,每个节点有两个 GPU,共四个并行进程。它们通过全局排名(0–3)进行枚举。在每个节点上,本地排名标识了使用的 GPU(0 或 1)。

当模型很大时,all-reduce 操作可能会花费很长时间。计算集群通过高效的网络连接 GPU,但发送整个模型副本会加重通信负担。

模型并行

Lightning 提供了模型并行的策略。请注意,这仅应在具有数十亿参数的非常大模型中探索,其中模型参数和梯度超过了 GPU 内存。

总结

并行训练可以加速训练过程,帮助你充分利用计算资源。

我们区分了数据并行,其中模型的副本在训练过程中看到数据的子集,以及模型并行,其中模型本身分布在多个设备上。

使用 PyTorch Lightning,数据并行训练就像指定分布式数据并行策略以及每个节点和设备(GPU)的数量一样简单。

数据并行训练减少了壁钟时间并改变了有效批次大小。使用不同数量设备训练的模型可能表现不同,因此建议进行仔细评估。

模型并行训练应该仅在非常大的模型(超过 5 亿参数)中考虑。

重现实验的代码可以在我的 GitHub 上找到:

[## GitHub - crlna16/pretrained-vision-transformer: 使用 PyTorch 的预训练 Vision Transformer…

使用 PyTorch Lightning 的预训练 Vision Transformer - crlna16/pretrained-vision-transformer

github.com

参考文献

  • Tal Ben-Nun ,“揭秘并行和分布式深度学习:深入的并发分析”,2018,arxiv.org/abs/1802.09941

  • OpenAI Country211 数据集:sourceYFCC100M 的子集)和 license

  • Vision Transformer 模型:Dosovitskiy 等,一张图片值 16x16 个词:用于大规模图像识别的变换器,ICLR,2021。 Paper 和代码

  • 用于数据并行训练的 PyTorch Lightning 项目:docs

  • Will Falcon 讲解分布式训练 (TDS, 2019)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值