GPipe就可以减少参数模型对内存的占用

简介:

模型的训练是深度学习应用程序生命周期中的一个部分,在模型达到一定的规模之前,我们认为它不会遇到什么挑战性。虽然在实验过程中训练基本模型是较为平常的工作,但复杂度与模型的质量和大小成线性关系。例如,2014年ImageNet视觉识别挑战赛(ImageNet visual recognition challenge)的获胜者是GoogleNet,它以400万个参数获得了74.8%的Top-1准确率;而仅仅在三年之后,2017年ImageNet挑战赛的获胜者则成了Squeeze-and-Excitation Networks(SENet),它用了1.458亿个(是之前的36倍以上)参数获得了82.7%的Top-1准确率。然而,在同一时期,GPU的内存只增加了大约3倍。
 

 
随着模型的发展,为了达到更高的精确度,这些模型的训练变得越来越具有挑战性。前面提到的例子表明,仅仅依靠GPU硬件设施的改进来实现更好的训练效果是不可持续的。相反,我们需要分布式的计算方法,将不同节点上的训练工作负载并行化,以便进行扩展训练。可并行化训练的概念听起来可能比较简单,但实际上却是极其复杂的工作。如果你思考一下,我们将要讨论通过跨不同节点来划分模型的知识获取部分,并在完成之后将这些部分再重新组合成为一个模型。然而,为了扩展深度学习模型,必须进行并行训练。为了应对这些挑战,微软和谷歌投入了数月进行研究和设计,分别发布了GPipe 和PipeDream。
 
GPipe(Google)
 
GPipe专注于扩展深度学习应用程序的训练负载。从基础设施的角度来看,训练过程的复杂性是在深度学习模型中经常被忽视的因素。训练数据集越来越大,就越复杂。例如,在医疗保健领域,经常会遇到需要使用数百万高分辨率的图像进行训练的模型。因此,训练过程通常需要很长的时间才能完成,并且由于内存和CPU的消耗而导致付出非常高的代价。
 
对于深度学习模型并行性的一种有效思考方法是将其划分为数据并行和模型并行的方式。数据并行方式使用大型的计算机集群来分割所输入的数据。模型并行性则是试图将模型转移到加速器上,GPU或TPU,它们具有加速模型训练的特殊硬件。在较高的层次上,几乎所有的训练数据集都可以按照一定的逻辑进行并行化工作,但在模型上却不一定是这样的。例如,一些深度学习模型是由可独立进行训练的并行分支组成的。在这种情况下,典型的策略是将计算任务划分到多个分区,并将不同的分区分配给不同的分支。然而,这种策略在按顺序进行层堆叠的深度学习模型中存在着很大不足,这就给高效的并行计算带来了挑战。
 
GPipe通过一种叫做流水线的技术将数据并行和模型并行相结合起来。从概念上讲,GPipe是一个分布式机器学习库,它使用同步随机梯度下降和流水线并行的方式进行训练,适用于任何由多个有序的层组成的深度神经网络(Deep Neural Networks, DNN)。Gpipe通过跨不同的加速器来分割模型,并自动将一小批训练示例划分成更小的批量。该模型允许GPipe的加速器进行并行操作,最大限度地提高了训练过程中的可扩展性。
 
下图说明了具有多个有序层的神经网络的GPipe模型被划分到了四个加速器上。Fk是kth分区的复合正向计算函数。Bk是其相对应的反向传播函数。Bk依赖于来自上层的Bk+1和Fk的中间激活函数。在上面的模型中,我们可以看到网络的顺序性是如何导致资源利用不足的。图中的下半部分显示了GPipe方法,在该方法中,输入的小批量示例被划分为更小的微批量,这些微批量可以由加速器同时处理。
 

 
PipeDream(微软)
 
几个月以前,微软研究院宣布了Fiddle项目的创立,其包括了一系列的旨在简化分布式深度学习的研究项目。PipeDreams是Fiddle发布的第一个侧重于深度学习模型并行训练的项目之一。
 
PipeDream采用一种有别于其它方法的方式,利用称为“流水线并行”的技术来扩展深度学习模型的训练。这种方式试图解决当前数据和模型并行技术所面临的一些挑战,例如在Gpipe中使用的一些技术。通常来说,当在云基础设施上进行训练的时候,数据并行方法在规模上承受着很高的通信成本,另外也可以随着时间的推移来提高GPU的计算速度。类似地,模型并行技术经常会通过无效地硬件资源利用,同时给程序员带来不必要负担的情况下,来确定如何在给定硬件部署环境的情况下进行特定模型的拆分。
 

 
PipeDream试图通过一种叫做流水线并行的技术来克服数据模型并行方法上的一些挑战。在概念上,流水线并行计算技术涉及将DNN模型的层划分为多个阶段,每个阶段是由模型中的一组连续的层组成的。每个阶段都被映射到一个单独的GPU上,该GPU对当前阶段中的所有层将执行前向传递和后向传递。
 
给定一个特定的深度神经网络,PipeDream会根据在单个GPU上执行的一个简短的评测运行,自动确定如何划分DNN模型的操作者,并在不同阶段之间均衡计算的负载,同时也会最小化目标平台的通信任务。即使存在模型的多样化(计算和通信)和平台的多样化(互连拓扑和分层带宽),PipeDream也能有效地进行负载均衡。PipeDream的并行训练方法对比数据模型并行方法提供了一些额外的优势。首先,PipeDream在工作节点之间需要更少的通信,因为在管道执行中的每个工作节点只需传递梯度和输出激活的子集,给其它的单个工作节点。此外,PipeDream以一种更容易并行的方式来分离计算和通信任务。
 

 
并行训练方法是构建更庞大、更精确的深度学习模型的关键挑战之一。作为深度学习社区中的一个非常活跃的研究领域,并行训练方法需要将有效的并发编程技术与深度学习模型的本质相结合起来。虽然仍处于初期阶段,但谷歌的GPipe和微软的PipeDream作为两种最具创造性的技术,为深度学习的开发人员提供了并行训练方法。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
2月前
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
53 2
|
27天前
|
机器学习/深度学习 算法 物联网
大模型进阶微调篇(一):以定制化3B模型为例,各种微调方法对比-选LoRA还是PPO,所需显存内存资源为多少?
本文介绍了两种大模型微调方法——LoRA(低秩适应)和PPO(近端策略优化)。LoRA通过引入低秩矩阵微调部分权重,适合资源受限环境,具有资源节省和训练速度快的优势,适用于监督学习和简单交互场景。PPO基于策略优化,适合需要用户交互反馈的场景,能够适应复杂反馈并动态调整策略,适用于强化学习和复杂用户交互。文章还对比了两者的资源消耗和适用数据规模,帮助读者根据具体需求选择最合适的微调策略。
111 5
|
3月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
35 2
|
3月前
|
机器学习/深度学习 数据采集 PyTorch
构建高效 PyTorch 模型:内存管理和优化技巧
【8月更文第27天】PyTorch 是一个强大的深度学习框架,被广泛用于构建复杂的神经网络模型。然而,在处理大规模数据集或使用高性能 GPU 进行训练时,有效的内存管理对于提升模型训练效率至关重要。本文将探讨如何在 PyTorch 中有效地管理内存,并提供一些优化技巧及代码示例。
151 1
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
106 8
|
4月前
|
机器学习/深度学习 自然语言处理 算法
ICML 2024:零阶优化器微调大模型,大幅降低内存
【7月更文挑战第14天】ICML 2024研究表明,零阶优化用于大模型微调能大幅降低内存需求。该论文通过避免反向传播,减少LLM(大型语言模型)微调的内存开销,提出新方法,适用于资源受限环境。虽然性能可能不及一阶优化器,但为高效NLP计算开辟了新途径。论文链接:[arxiv.org/abs/2402.11592](https://arxiv.org/abs/2402.11592)**
87 3
|
4月前
|
存储 缓存 监控
Flink内存管理机制及其参数调优
Flink内存管理机制及其参数调优
|
4月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
50 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
379 0
|
26天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
56 1