当前位置: 首页 > news >正文

深度学习并行训练算法一锅炖: DDP, TP, PP, ZeRO

前言

本文会介绍几种流行的深度学习并行方法,包括

  • 数据并行(data parallel)
  • 模型并行(model parallel)
    • tensor并行
    • pipeline并行
    • Sequence并行
  • Zero Redundancy Data Parallelism (ZeRO)

下图给出了这些并行方法的示意图,非常直观好懂。

 

不过在介绍各种并行训练方法之前,我们首先对一些概念做一个声明,方便后面理解

模型训练过程中涉及到的参数主要包含两大类,model data 和 non-model data,具体表示如下:

  • model data
    • 模型权重
    • 模型权重的梯度
    • 优化器的状态
  • non-model data
    • 模型逐层的特征向量(也叫作activations)

1. Data parallelism (DP)

经典的数据并行算法是在多个设备上都拷贝一份完整的模型参数,彼此之间可以独立计算,所以每个设备传入的输入数据不一样​,这也是为什么叫数据并行。只不过,每隔一段时间(比如一个batch或者若干个batch)后需要彼此之间同步模型权重的梯度​。随着模型大小不断增大,单个GPU的内存已经无法容纳现如今的大模型,所以便有了后面会介绍的模型并行​。

2. Model Parallelism (MP)

2.1 Pipeline Parallelism (PP)

pipeline parallelism是比较常见的模型并行算法,它是模型做层间划分,即inter-layer parallelism。以下图为例,如果模型原本有6层,你想在2个GPU之间运行pipeline,那么每个GPU只要按照先后顺序存3层模型即可。

 

 

已经有很多Pipeline相关的研究工作了,例如PipeDream,GPipe,和Chimera。它们的主要目的都是降低bubble time。这里不做过多介绍。

2.2 Tensor Parallelism (TP)

前面介绍的Pipeline Parallelism是对模型层间做划分,叫inter-layer parallelism。那么另一种方式则是对模型层内做划分,即intra-layer Parallelism,也叫Tensor Parallelism。

 

对于土豪公司,可以使用NVLink来连接GPU(如下图a),从而提供高带宽来降低通信开销。但是土豪终归是少数的,大部分公司和个人是没法承担这昂贵的硬件费用,因此比较常见的GPU连接方式是下图b,即节点内花点钱实现NVLink连接,节点之间通过PCIe连接。

 

 

 

2.2.5 小结

1D Tensor并行每一层的输出是不完整的,所以在传入下一层之前都需要做一次All-gather操作,从而使得每个GPU都有完整的输入,如下图a所示。

2D/2.5D/3D Tensor 并行算法因为在一开始就对输入进行了划分, 所以中间层不需要做通信,只需要在最后做一次通信即可。在扩展到大量设备(如GPU)时,通信开销可以降到很小。这3个改进的Tensor并行算法可以很好地和Pipeline并行方法兼容。

2.3 Sequential Parallelism

Tensor parallelism主要是为了解决由 model data (模型权重,梯度和优化器状态)导致的内存瓶颈,但是 non-model data也可能成为性能瓶颈。比如像AlphaFold和NAS任务中会存在很多中间特征值(也叫activations)。

以DARTS算法为例,它的模型参数量其实并不多,但是它有很多分支,所以activations会消耗大量GPU内存,这也是为什么很多NAS算法只能在CIFAR-10上搜索到合适的模型结构后,再做人工扩展,最后应用到ImageNet上做性能验证。

同样地,在使用Transformer训练语言模型时,由于Transformer层中的Self-attention机制的复杂度是�(�2),其中 � 是序列长度。换言之,长序列数据将增加中间activation内存使用量,从而限制设备的训练能力。

Sequential Parallelism (SP)就为了解决non-model data导致的性能瓶颈而提出的。下图给出了SP在Transform并行训练上的应用,具体的原理可以查看原论文[7]。

3. Zero Redundancy Data Parallelism (ZeRO)

训练过程中GPU内存开销主要包含以下几个方面:

  • 模型状态内存(Model State Memory):
    • 梯度
    • 模型参数
    • 优化器状态:当使用像Adam这样的优化器时,优化器的状态会成为GPU内存开销的大头。前面介绍的DP,TP, PP算法并没有考虑这个问题。
  • 激活内存(Activation Memory):在优化了模型状态内存之后,人们发现激活函数也会导致瓶颈。激活函数计算位于前向传播之中,用于支持后向传播。
  • 碎片内存(Fragmented Memory):深度学习模型的低效有时是由于内存碎片所导致的。在模型之中,每个张量的生命周期不同,由于不同张量寿命的变化而会导致一些内存碎片。由于这些碎片的存在,会导致即使有足够的可用内存,也会因为缺少连续内存而使得内存分配失败。ZeRO 根据张量的不同寿命主动管理内存,防止内存碎片。

 

 

 

 

 

 如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。


👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。


1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓


http://www.mrgr.cn/news/60258.html

相关文章:

  • Mysql之视图创建
  • 顺序表总结
  • python基于django线上视频学习系统设计与实现_j0189d4x
  • Python数据分析——Numpy
  • react18中使用redux管理公共数据仓库实现数据immutable更新
  • 构建自然灾害预警决策一体化平台,筑牢工程安全数字防线
  • 鸿蒙开发融云demo录制语音消息
  • 转换手机录音文件为文本
  • 鸿蒙生态开发以及技术栈介绍
  • 第三十二篇:TCP协议粘包和滑动窗口,TCP系列七
  • 贷款有门道:白名单和黑名单,线上线下申请,你都知道吗?
  • [mysql]多行子查询(只包含不相关子查询案例)
  • Kotlin学习第三课
  • Linux 重启命令全解析:深入理解与应用指南
  • 【代码优化Tip】关于结构
  • 设计模式——备忘录模式
  • gitlab如何重置密码
  • APP闪退原因
  • 【Spring MVC】请求参数的传递
  • 算力中心四大类型
  • 污水处理厂可视化系统:提升运营效率与环境监测能力
  • 电机---2电机的转速、扭矩、力矩之间的关系
  • CRC-DCO数据合规官:企业合规建设如何开展
  • 2024 Rust现代实用教程:变量与常见数据类型
  • QT linux 打包时库和插件如何生成
  • 行为识别SlowFast