突破内存瓶颈,让一块4090预训练7B大模型

点击蓝字

关注我们

关注并星标

从此不迷路

计算机视觉研究院

4efb5cbd92187928252d8436f1fbd865.gif

91261307c5bd61d60dcfe9f2cbb60a34.gif

公众号ID计算机视觉研究院

学习群扫码在主页获取加入方式

5888c1b5f6bfd1d83fb3138d8966d1e0.png

论文地址:https://arxiv.org/abs/2403.03507

论文标题:GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection

计算机视觉研究院专栏

Column of Computer Vision Institute

只用 24G 显存,消费级 GPU 就能搞定大模型了。

28e2622d603c307a9c9307a08b6ba470.gif

上个月,Meta FAIR 田渊栋参与的一项研究广受好评,他们在论文《 MobileLLM: Optimizing Sub-billion Parameter Language Models for On-Device Use Cases》中开始卷 10 亿以下参数小模型,主打在移动设备上运行 LLM。

3 月 6 日,田渊栋又一项研究出炉,这次,他们主攻 LLM 内存效率。除了田渊栋本人,还有来自加州理工学院、德克萨斯大学奥斯汀分校以及 CMU 的研究者。

他们合作提出了 GaLore(Gradient Low-Rank Projection),这是一种允许全参数学习的训练策略,但比 LoRA 等常见的低秩自适应方法具有更高的内存效率。

该研究首次证明了在具有 24GB 内存的消费级 GPU(例如 NVIDIA RTX 4090)上预训练 7B 模型的可行性,无需模型并行、检查点或卸载策略。

接下来我们看看文章主要内容。

现阶段,大语言模型(LLM)在多个学科中表现出令人深刻的印象,然而大家又不得不面对这样一个问题,预训练和微调 LLM 不仅需要大量计算,而且还需要大量内存。

LLM 对内存的需求不仅包括以亿计算的参数,还包括梯度和 Optimizer States(例如 Adam 中的梯度动量和方差),这些参数可能大于存储本身。举例来说,使用单个批大小且从头开始预训练的 LLaMA 7B ,需要至少 58 GB 内存(14 GB 用于可训练参数,42 GB 用于 Adam Optimizer States 和权重梯度,2 GB 用于激活)。这使得训练 LLM 在消费级 GPU(例如具有 24GB 内存的 NVIDIA RTX 4090)上变得不可行。

为了解决上述问题,研究人员不断开发各种优化技术,以减少预训练和微调期间的内存使用。

该方法在 Optimizer States 下将内存使用量减少了 65.5%,同时还能保持在 LLaMA 1B 和 7B 架构上使用最多 19.7B token 的 C4 数据集进行预训练的效率和性能,以及在 GLUE 任务上微调 RoBERTa 的效率和性能。与 BF16 基准相比,8-bit GaLore 进一步减少了优化器内存达 82.5%,总训练内存减少了 63.3%。

看到这项研究后,网友表示:「是时候忘记云、忘记 HPC 了,有了 GaLore,所有的 AI4Science 都将在 2000 美元的消费级 GPU 上完成。」

a0000e5beda3a8ea225f5dc73df3cd33.png

田渊栋表示:「有了 GaLore,现在可以在具有 24G 内存的 NVidia RTX 4090s 中预训练 7B 模型了。

我们没有像 LoRA 那样假设低秩权重结构,而是证明权重梯度自然是低秩的,因此可以投影到(变化的)低维空间中。因此,我们同时节省了梯度、Adam 动量和方差的内存。

因此,与 LoRA 不同,GaLore 不会改变训练动态,可用于从头开始预训练 7B 模型,无需任何内存消耗的预热。GaLore 也可用于进行微调,产生与 LoRA 相当的结果」。

eada6a54f70cec17e2fb0f54de654ed7.png

方法介绍

前面已经提到,GaLore 是一种允许全参数学习的训练策略,但比常见的低秩自适应方法(例如 LoRA)更节省内存。GaLore 关键思想是利用权重矩阵 W 的梯度3c2c7602dc4c99a0f1fe3d84b87d00f1.png缓慢变化的低秩结构,而不是试图将权重矩阵直接近似为低秩形式。

本文首先从理论上证明了梯度矩阵 G 在训练过程中会变成低秩,在理论的基础上,本文用 GaLore 来计算两个投影矩阵 460d2a9e3af9ef1af217b7b883633ed3.png15d0840be5a64e8401a88feb9578ebc9.png将梯度矩阵 G 投影成低秩形式 P^⊤GQ。在这种情况下,依赖于组件梯度统计的 Optimizer States 的内存成本可以大大减少。如表 1 所示,GaLore 的内存效率比 LoRA 更高。实际上,与 LoRA 相比,在预训练期间,这可减少高达 30% 的内存。

32b98f169a0be363fb179ea198fa0371.png

本文证明了 GaLore 在预训练和微调方面表现良好。当在 C4 数据集上预训练 LLaMA 7B 时,8-bit GaLore 结合了 8-bit 优化器和逐层权重更新技术,实现了与全秩相当的性能,并且 optimizer state 的内存成本不到 10%。

值得注意的是,对于预训练,GaLore 在整个训练过程中保持低内存,而不需要像 ReLoRA 那样进行全秩训练。得益于 GaLore 的内存效率,这是首次可以在具有 24GB 内存的单个 GPU(例如,在 NVIDIA RTX 4090 上)上从头开始训练 LLaMA 7B,而无需任何昂贵的内存卸载技术(图 1)。

3c2b211353028222f755e775a4ffb531.png

作为一种梯度投影方法,GaLore 与优化器的选择无关,只需两行代码即可轻松插入现有优化器,如算法 1 所示。

7649d0e87b38812edebe5a101ec74314.png

下图为将 GaLore 应用于 Adam 的算法:

554d0c6698bf713deddc4f5fc5a60982.png

实验及结果

研究者对 GaLore 的预训练和 LLM 的微调进行了评估。所有实验均在英伟达 A100 GPU 上进行。

为了评估其性能,研究者应用 GaLore 在 C4 数据集上训练基于 LLaMA 的大型语言模型。C4 数据集是 Common Crawl 网络抓取语料库的一个巨大的净化版本,主要用于预训练语言模型和单词表征。为了最好地模拟实际的预训练场景,研究者在不重复数据的情况下,对足够大的数据量进行训练,模型大小范围可达 70 亿个参数。

本文沿用了 Lialin 等人的实验设置,采用了基于 LLaMA3 的架构,带有 RMSNorm 和 SwiGLU 激活。对于每种模型大小,除了学习率之外,他们使用了相同的超参数集,并以 BF16 格式运行所有实验,以减少内存使用,同时在计算预算相同的情况下调整每种方法的学习率,并报告最佳性能。

此外,研究者使用 GLUE 任务作为 GaLore 与 LoRA 进行内存高效微调的基准。GLUE 是评估 NLP 模型在各种任务中性能的基准,包括情感分析、问题解答和文本关联。

本文首先使用 Adam 优化器将 GaLore 与现有的低秩方法进行了比较,结果如表 2 所示。

d3e869e891a0b6c0c1192dc120c8be25.png

研究者证明,GaLore 可以应用于各种学习算法,尤其是内存高效的优化器,以进一步减少内存占用。研究者将 GaLore 应用于 AdamW、8 bit Adam 和 Adafactor 优化器。他们采用一阶统计的 Adafactor,以避免性能下降。

实验在具有 10K 训练步数的 LLaMA 1B 架构上对它们进行了评估,调整了每种设置的学习率,并报告了最佳性能。如图 3 所示,下图表明,GaLore 可适用于流行的优化器,例如 AdamW、8-bit Adam 和 Adafactor。此外,引入极少数超参数不会影响 GaLore 的性能。

3c93c64fd5de4ee15da3afa91961fea0.png

如表 4 所示,在大多数任务中,GaLore 都能以更少的内存占用获得比 LoRA 更高的性能。这表明,GaLore 可以作为一种全栈内存高效训练策略,用于 LLM 预训练和微调。

57c5c2ce66e997be109dd788484b1dd4.png

如图 4 所示,与 BF16 基准和 8  bit Adam 相比,8 bit GaLore 所需的内存要少得多,在预训练 LLaMA 7B 时仅需 22.0G 内存,且每个 GPU 的 token 批量较小(最多 500 个 token)。

bbf915d1da94623a10f4b4a6cd555563.png

更多技术细节,请阅读论文原文。

0ec485c7eff5a0de5420a5de60a15005.gif

END

c7367bed24faa103eedef24bf7c417d0.gif

922f3e5629f646664c95ec3cc77cf6c8.gif

转载请联系本公众号获得授权

1e91af272d3775c5501f945e6c5124df.gif

计算机视觉研究院学习群等你加入!

ABOUT

计算机视觉研究院

计算机视觉研究院主要涉及深度学习领域,主要致力于目标检测、目标跟踪、图像分割、OCR、模型量化、模型部署等研究方向。研究院每日分享最新的论文算法新框架,提供论文一键下载,并分享实战项目。研究院主要着重”技术研究“和“实践落地”。研究院会针对不同领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

5cc5adb3cbaa9ccd635fdde6fe252a87.png

 往期推荐 

🔗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
训练LLMAM2-7B模型时,我们可以通过增量预训练来进一步优化模型的性能。增量预训练是在已有的预训练模型基础上,使用新的数据集进行额外的预训练。 首先,我们需要准备新的数据集。这些数据可以是任务相关的、特定领域的或类似任务的数据集。例如,在增量预训练中,我们可以使用与LLMAM2-7B模型任务相似的数据集,这样可以更好地适应新任务的需求。 接下来,我们将新的数据集与现有的预训练模型结合,以进行增量预训练。具体而言,我们可以采用两种常见的增量预训练方法:微调和多阶段预训练。 微调是指将新的数据集与预训练模型一起进行训练。我们可以通过降低学习速率和增加迭代次数,以确保模型在新数据上进行充分的学习。通过微调,我们可以在保持预训练模型的丰富知识的同时,为新任务或领域提供更好的适应性。 而多阶段预训练则是在已有的预训练模型之上,进行多轮的增量预训练。具体来说,我们先利用新数据集进行一轮微调,然后将微调后的模型再次用于下一轮微调,以此类推。通过多阶段预训练,我们可以逐步地提升模型在新任务上的性能。 无论选择微调还是多阶段预训练,增量预训练都有助于模型在新数据上进行进一步的优化与适应。通过使用新数据进行增量预训练,我们可以提高LLMAM2-7B模型在特定任务或领域上的性能,并且更好地应对任务的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值