如何在GPU资源受限情况下微调超大模型
提问:模型大小超过GPU 容量怎么办?
本文的灵感来自于Yandex数据分析学院教授的“高效深度学习系统”课程。
预备知识:假设读者已经了解神经网络的前传递和后向传递的工作原理,这对理解本文内容至关重要。文中使用PyTorch作为框架。
开始吧!
当试图使用大型模型(即aka gpt-2-xl),它带有 5亿多个参数,而你的GPU 资源受限,无法将它安装到GPU上运行,或者在模型训练期间无法实现论文中定义的批大小,此时该怎么办?也许可以选择放弃,使用一个更轻量级版本的模型,或者减小训练的批大小,这样的话,便无法获得论文中描述的训练结果。
但是,有一些技术可以帮助解决上述问题。
下面来讨论一些方法,即如何利用这些方法来微调带有15亿个参数的GPT-2-XL模型。
问题的核心
首先,来了解一下将模型加载到GPU中所需GPU内存问题的实质。
假设模型具有 个FP32(32位浮点)参数,需要在GPU上训练这个模型,例如,运行Adam优化器。
通过计算,结果令人震惊。
假设已有一块带有12 GB内存的NVIDIA GeForce RTX 3060。首先, 1e9个FP32参数约占4 GB的GPU内存。
同样,对于梯度,也将保留相同数量的内存。所以,总共已经保留了8 GB的内存,由于还没有开始训练,也没有加载优化器,加载优化器也同样需要一定数量的内存。Adam优化器需要为每个参数存储第一备份和第二备份,即需要8 GB额外内存。算下来,必须有大约16 GB的GPU内存,才能正确地将模型加载到GPU上,在本文的例子中,GPU只有12 GB的空闲内存。看起来很不妙,对吧?
然而,可以通过一些方法来尝试解决这个问题,以下是相关内容:
- 梯度积累/微批量;
- 梯度检查点;
- 模型并行训练;
- 管道作业;
- 张量并行化
- 混合精度训练;
- 内存卸载;
- 优化器8位量化。
接下来,将详细解读这些技术。
开始
提问:模型比GPU容量大,怎么办?
- 简单模式:无法适配批大小为1
- 专业模式:参数也没办法适配
概述
如果模型大于GPU容量,即便将批大小设为1都不够,那该怎么办呢?有一个解决方案,即设置梯度检查点,下面来看看这个概念。对于一个简单的包含n层的前馈神经网络来说,梯度的计算图如下:
神经网络层的激活对应于用f标记的节点,在正向传递期间,按顺序对所有这些节点进行计算。对应于这些层的激活和参数的损失梯度用b标记的节点表示。在反向传递期间,所有这些节点都以相反的顺序进行计算。f个节点的计算结果用于计算b个节点,因此所有f个节点在向前传递后都保存在内存中。只有当反向传播进展到足够计算出f节点的所有依赖关系时,它才能从内存中擦除。这意味着:简单的反向传播所需的内存随神经网络层数n的变化呈线性增长。
下面是这些节点的计算顺序,紫色阴影圆圈表示在给定时间里需要将哪个节点保存到内存之中。
梯度检查点
如上所述的简单反向传播在计算方面是最优的:它只计算每个节点一次。但是,如果重新计算节点,可能会节省大量内存。例如,可以简单地重新计算每个节点。执行的顺序和所使用的内存如下图所示:
这种策略在内存方面是最优的。但是,请注意,节点计算的数量进行了n²次缩放,而先前的缩放系数为n:每个n个节点都按n次顺序重新计算。由于计算速度较慢,这种方法并不适用于深度学习。
为了在内存和计算之间取得平衡,需要提出一种策略,允许重新计算节点,但次数不要太频繁。在这里使用这样一种策略:将神经网络激活的一个子集标记为检查点节点。
在本示例中,选择将第sqrt(n)个节点标记为检查点。这样,检查点节点的数量和检查点之间的节点数量都在sqrt(n)之间,这意味着:所需的内存量也按n的顺序进行了缩放。该策略所需的额外计算量相当于网络单次前向传递所需的计算量。
例程:
在学习了梯度检查点的细节之后,来看看如何在PyTorch中应用这个概念,看起来并不太难:
梯度累积/微批次
概述
深度学习模型正在越变越大,很难在GPU内存中安装这样大型的神经网络。因此,被迫在训练时选用较小的批大小,它可能导致较慢的收敛和较低的准确性。
什么是梯度累积?
在训练神经网络时,通常会将数据分批量处理,神经网络预测批处理标签,用于计算相对于实际目标的损失。接下来,执行反向传递计算出梯度,更新模型权值。梯度累积对训练过程的最后一步进行了修正:在继续下一个小批之前,保存梯度值,并将新的梯度添加到之前保存的梯度中,用这种方法取代更新每个小批的网络权重。只有在模型处理了几个小批次后,才会更新权重。梯度积累模拟了一个更大的批大小,如果想在一个小批中使用64张图像,如果批大小超过了8,则会报“CUDA内存出错…”。在这种情况下,可以使用8批图像,并在模型处理64/8=8批后更新一次权重。如果你从这8个批次中积累每一个梯度,结果将是(几乎)相同的,这样便能够执行训练啦!
例程:
没有梯度累积的标准训练环通常为:
在PyTorch中,梯度累积可以很容易地完成。模型利用accumulation_steps处理完成小批之后,便可以执行优化。还可以利用accumulation_steps根据损失函数的性质来划分运行损失:
真漂亮,对吗?当调用loss.backward() 时计算梯度,并由PyTorch累积,直到调用optimizer.zero_grad()时停止。
重点
某些网络体系结构使用专用的批处理操作,如BatchNorm,当使用相同的批大小时,结果可能会略有不同。
混合精度训练
概述
混合精度训练是指将部分或全部FP32参数转换为更小的格式,如FP16、TF16(浮点张量)或BF16(浮点字节)。
主要优势
混合精度训练的主要优势是:
- 减少内存使用;
- 性能提速(更高的算术强度或更小的通信占用);
- 使用专用硬件进行更快地计算。
目前只对第一个优势感兴趣——减少内存的使用量,来看看如何使用PyTorch模型实现它。
例程:
结果,在完成.half()操作之后,模型变小了2倍。将模型转换为不同的格式(即BF16,TF16)后的缩放损失,将在后续的文章中讨论。有些操作在FP16中是无法完成的,如Softmax。PyTorch可利用torch.autocast 来处理这些特殊情况。
8位优化器
增加模型尺寸是获得更佳性能的有效途径。然而,训练大模型时需要存储模型、梯度和优化器的状态(例如,Adam的指数平滑和及先前梯度的平方和),所有这些都存储在数量有限的可用内存之中。
将32位优化器降到8位优化器,将数值的范围从2³²减少到仅2⁸=256,会对优化器预留的内存数量产生巨大的影响。
研究人员提出了一种新的8位Adam优化器,论文作者在文中这么说: “它将32位的性能维持到部分原始内存中”。
8位优化器有三个组成部分:(1)块级量化,隔离异常值,将误差均匀地分配给每一个比特;(2)动态量化,高精度地量化小值和大值;(3)稳定的嵌入层,以提高词嵌入优化模型的稳定性。
有了这些组件,可直接使用8位状态执行优化。将8位优化器状态量化为32位,执行更新,然后再将状态量化为8位进行存储。在寄存器中逐元素进行8位到32位的转换,无需慢速复制到GPU内存或额外的临时内存中执行量化和去量化。对于GPU来说,这意味着8位优化器要快于常规的32位优化器。
来看看使用8位Adam之后,鼓舞人心的结果:
可以看出,使用量化的Adam可以节省大约8.5 GB的GPU内存,看起来相当棒!
理解了它的可用性之后,再来看看如何用python实现它。
由Facebook提供的Bitsandbytes 包是一个围绕CUDA自定义函数的轻量级包装器,封装了 8位优化器和量化函数,利用它可以实现8位Adam的使用。
例程:
如上所述,量化优化器的使用非常简单,结果也不错。
综合上述全部方法,对GPU上的GPT-2-XL进行微调。
最后,在掌握了上述方法之后,利用这些方法来解决实际问题,对拥有15亿个参数的GPT-2-XL模型进行微调。显然,无法将它加载到12 GB内存的NVIDIA GeForce RTX 3060 GPU之上。列出可以使用的全部方法:
- 梯度检查点;
- 混合精度训练(我设了一个技巧:使用相同模型的两个样本。首先,用.half将它加载到GPU上,将其命名为gpu_model;其次,在CPU上,将其命名为cpu_model。评估好GPU模型之后,将 gpu_model的梯度加载到cpu_model中,运行optimizer.step(),将更新后的参数加载到gpu_model上);
- 使用batch_size=64,minibatch_size=4的梯度累积,需要通过 accumulation_steps来缩放损失;
- 8位Adam优化器。
把以上方法全部利用起来,查看一下代码:
利用上述所有方法之后,在GPU上实现了对16GB的GPT-2-XL模型微调,绝了!
结论
在本博中,给出了高效使用内存的关键概念,它适用于多种艰巨的任务,如上文所述。将在后续的文章中讨论其他概念。衷心感谢,拨冗阅读本文!
以上是如何在GPU资源受限情况下微调超大模型的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

想象一下,一个人工智能模型,不仅拥有超越传统计算的能力,还能以更低的成本实现更高效的性能。这不是科幻,DeepSeek-V2[1],全球最强开源MoE模型来了。DeepSeek-V2是一个强大的专家混合(MoE)语言模型,具有训练经济、推理高效的特点。它由236B个参数组成,其中21B个参数用于激活每个标记。与DeepSeek67B相比,DeepSeek-V2性能更强,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,最大生成吞吐量提高到5.76倍。DeepSeek是一家探索通用人工智

在iPhone上面临滞后,缓慢的移动数据连接?通常,手机上蜂窝互联网的强度取决于几个因素,例如区域、蜂窝网络类型、漫游类型等。您可以采取一些措施来获得更快、更可靠的蜂窝互联网连接。修复1–强制重启iPhone有时,强制重启设备只会重置许多内容,包括蜂窝网络连接。步骤1–只需按一次音量调高键并松开即可。接下来,按降低音量键并再次释放它。步骤2–该过程的下一部分是按住右侧的按钮。让iPhone完成重启。启用蜂窝数据并检查网络速度。再次检查修复2–更改数据模式虽然5G提供了更好的网络速度,但在信号较弱

波士顿动力Atlas,正式进入电动机器人时代!昨天,液压Atlas刚刚「含泪」退出历史舞台,今天波士顿动力就宣布:电动Atlas上岗。看来,在商用人形机器人领域,波士顿动力是下定决心要和特斯拉硬刚一把了。新视频放出后,短短十几小时内,就已经有一百多万观看。旧人离去,新角色登场,这是历史的必然。毫无疑问,今年是人形机器人的爆发年。网友锐评:机器人的进步,让今年看起来像人类的开幕式动作、自由度远超人类,但这真不是恐怖片?视频一开始,Atlas平静地躺在地上,看起来应该是仰面朝天。接下来,让人惊掉下巴

本月初,来自MIT等机构的研究者提出了一种非常有潜力的MLP替代方法——KAN。KAN在准确性和可解释性方面表现优于MLP。而且它能以非常少的参数量胜过以更大参数量运行的MLP。比如,作者表示,他们用KAN以更小的网络和更高的自动化程度重现了DeepMind的结果。具体来说,DeepMind的MLP有大约300,000个参数,而KAN只有约200个参数。KAN与MLP一样具有强大的数学基础,MLP基于通用逼近定理,而KAN基于Kolmogorov-Arnold表示定理。如下图所示,KAN在边上具

哭死啊,全球狂炼大模型,一互联网的数据不够用,根本不够用。训练模型搞得跟《饥饿游戏》似的,全球AI研究者,都在苦恼怎么才能喂饱这群数据大胃王。尤其在多模态任务中,这一问题尤为突出。一筹莫展之际,来自人大系的初创团队,用自家的新模型,率先在国内把“模型生成数据自己喂自己”变成了现实。而且还是理解侧和生成侧双管齐下,两侧都能生成高质量、多模态的新数据,对模型本身进行数据反哺。模型是啥?中关村论坛上刚刚露面的多模态大模型Awaker1.0。团队是谁?智子引擎。由人大高瓴人工智能学院博士生高一钊创立,高

特斯拉机器人Optimus最新视频出炉,已经可以在厂子里打工了。正常速度下,它分拣电池(特斯拉的4680电池)是这样的:官方还放出了20倍速下的样子——在小小的“工位”上,拣啊拣啊拣:这次放出的视频亮点之一在于Optimus在厂子里完成这项工作,是完全自主的,全程没有人为的干预。并且在Optimus的视角之下,它还可以把放歪了的电池重新捡起来放置,主打一个自动纠错:对于Optimus的手,英伟达科学家JimFan给出了高度的评价:Optimus的手是全球五指机器人里最灵巧的之一。它的手不仅有触觉

目标检测在自动驾驶系统当中是一个比较成熟的问题,其中行人检测是最早得以部署算法之一。在多数论文当中已经进行了非常全面的研究。然而,利用鱼眼相机进行环视的距离感知相对来说研究较少。由于径向畸变大,标准的边界框表示在鱼眼相机当中很难实施。为了缓解上述描述,我们探索了扩展边界框、椭圆、通用多边形设计为极坐标/角度表示,并定义一个实例分割mIOU度量来分析这些表示。所提出的具有多边形形状的模型fisheyeDetNet优于其他模型,并同时在用于自动驾驶的Valeo鱼眼相机数据集上实现了49.5%的mAP

最近,军事圈被这个消息刷屏了:美军的战斗机,已经能由AI完成全自动空战了。是的,就在最近,美军的AI战斗机首次公开,揭开了神秘面纱。这架战斗机的全名是可变稳定性飞行模拟器测试飞机(VISTA),由美空军部长亲自搭乘,模拟了一对一的空战。5月2日,美国空军部长FrankKendall在Edwards空军基地驾驶X-62AVISTA升空注意,在一小时的飞行中,所有飞行动作都由AI自主完成!Kendall表示——在过去的几十年中,我们一直在思考自主空对空作战的无限潜力,但它始终显得遥不可及。然而如今,
