田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

meta fair 田渊栋参与的研究项目在上个月获得了广泛好评。在他们的论文《mobilellm: optimizing sub-billion parameter language models for on-device use cases》中,他们开始探讨如何优化10亿以下参数的小型模型,旨在实现在移动设备上运行大型语言模型的目标。

3 月 6 日,田渊栋团队发布了最新的研究成果,这次专注于提高LLM内存的效率。除了田渊栋本人,研究团队还包括来自加州理工学院、德克萨斯大学奥斯汀分校以及CMU的研究人员。这项研究旨在进一步优化LLM内存的性能,为未来的技术发展提供支持和指导。

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

这项研究首次表明,在配备 24GB 内存的消费级 GPU(例如 NVIDIA RTX 4090)上,可以成功地进行 7B 模型的预训练,而无需使用模型并行、检查点或卸载策略。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

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

盘古大模型 盘古大模型

华为云推出的一系列高性能人工智能大模型

盘古大模型 35 查看详情 盘古大模型

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

当前,大型语言模型(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 上完成。」

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

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

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

方法介绍

前面已经提到,GaLore 是一种允许全参数学习的训练策略,但比常见的低秩自适应方法(例如 LoRA)更节省内存。GaLore 关键思想是利用权重矩阵 W 的梯度田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型缓慢变化的低秩结构,而不是试图将权重矩阵直接近似为低秩形式。

本文首先从理论上证明了梯度矩阵 G 在训练过程中会变成低秩,在理论的基础上,本文用 GaLore 来计算两个投影矩阵 田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型将梯度矩阵 G 投影成低秩形式 P^⊤GQ。在这种情况下,依赖于组件梯度统计的 Optimizer States 的内存成本可以大大减少。如表 1 所示,GaLore 的内存效率比 LoRA 更高。实际上,与 LoRA 相比,在预训练期间,这可减少高达 30% 的内存。

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

实验及结果

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

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

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

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

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型

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

以上就是田渊栋等人新作:突破内存瓶颈,让一块4090预训练7B大模型的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/425770.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
怎样查看360浏览器的缓存文件位置
上一篇 2025年11月7日 11:34:29
Spring Boot 查询 SQL 为空,为何 IDEA 返回空结果,Navicat 却能成功查询?
下一篇 2025年11月7日 11:34:33

相关推荐

  • JavaScript 闭包:理解闭包原理与内存泄漏问题

    闭包是函数访问其外部作用域变量的能力,即使外部函数已执行完毕。如 inner 函数引用 outer 中的 count,形成闭包,使变量持久存在。闭包本身无害,但可能因延长变量生命周期导致内存泄漏,例如事件监听器引用大对象时。若未及时清理 DOM 事件或定时器,闭包会阻止垃圾回收,造成内存占用过高。解…

    2026年5月10日
    000
  • Golang如何提升TCP长连接处理效率_Golang TCP长连接处理性能优化实践详解

    答案:通过非阻塞I/O、单Goroutine双工模型、sync.Pool对象复用、TCP_NODELAY优化及高效心跳管理,结合系统调优,可显著提升Golang百万级TCP长连接处理效率。 在高并发网络服务场景中,TCP长连接的处理效率直接影响系统的吞吐能力和资源消耗。Golang凭借其轻量级Gor…

    2026年5月10日
    000
  • Golang 文件IO操作与性能优化实践

    合理使用Go标准库并优化IO策略可显著提升文件处理性能。1. 使用bufio减少系统调用,适合小块读写;2. 大文件用流式读取避免OOM,小文件可一次性加载;3. 并发分片读取大文件并配合预读提升吞吐;4. 结合系统调优如O_DIRECT、关闭atime等防止IO瓶颈。 Go语言在文件IO操作上提供…

    2026年5月10日
    000
  • Python Pandas:高效合并多工作簿多工作表 Excel 数据

    本教程详细指导如何使用 Python Pandas 库高效合并来自多个 Excel 文件中指定工作表的数据。文章将解释如何遍历文件目录、正确加载 Excel 文件、识别并解析特定工作表,并将来自不同文件的同名工作表数据智能地整合到一个 Pandas DataFrame 字典中,同时提供完整的示例代码…

    2026年5月10日
    000
  • C++怎么使用静态库和动态库_C++链接静态库与动态库的方法与区别

    静态库在编译时链接,生成独立可执行文件;动态库运行时加载,节省内存。1. 静态库用ar打包.o文件为.a,编译时通过-L和-l链接;2. 动态库需-fPIC编译生成.so,运行前配置LD_LIBRARY_PATH或系统路径;3. 静态库体积大但部署方便,动态库共享内存利于更新。 在C++项目开发中,…

    2026年5月10日
    000
  • JavaScript DOM操作:点击关联元素获取目标文本内容的教程

    本教程详细介绍了如何通过JavaScript处理用户点击事件,并结合DOM的 closest() 和 querySelector() 方法,从复杂的HTML结构中准确获取目标元素的文本内容。文章强调了使用 addEventListener() 进行事件绑定、避免重复ID以及高效DOM遍历的最佳实践,…

    2026年5月10日
    000
  • 如何优化JavaScript代码的性能以避免运行时瓶颈?

    优化JavaScript性能需减少DOM操作,通过缓存查询、使用DocumentFragment和合并样式修改来降低重排重绘;2. 采用事件委托减少内存占用并提升绑定效率;3. 拆分长任务,利用requestIdleCallback、Web Worker和requestAnimationFrame避…

    2026年5月10日
    000
  • XML流式解析的优势是什么?

    流式解析能高效处理超大XML文件,因它边读边处理,内存占用低。SAX事件驱动、性能高但状态管理复杂;StAX拉模式灵活可控,适合复杂逻辑。挑战包括上下文维护、错误恢复难、验证集成和无随机访问,需用栈管理、索引或混合模式应对。 XML流式解析的优势在于它能够以极低的内存消耗处理任意大小的XML文档,尤…

    2026年5月10日
    000
  • PHP递归和迭代哪个快_PHP递归与迭代执行效率对比评测

    递归因函数调用开销大、内存消耗高,在PHP中执行效率通常低于迭代;以斐波那契数列为例,朴素递归时间复杂度达O(2^n),迭代为O(n),带缓存的递归可优化至O(n)但仍慢于迭代;通过microtime和memory_get_usage对比测试可验证该结论;启用OPcache等环境优化可提升整体性能,…

    2026年5月10日
    000
  • C# 如何高效读取超大xml文件

    使用 XmlReader 流式读取超大 XML 文件,避免内存溢出。1. 通过 XmlReader 逐节点解析,仅读取所需数据;2. 遇到 Record 节点时提取 Id 属性及 Name 元素值;3. 可结合 ReadSubtree 对局部子树使用 LINQ to XML 解析;4. 设置 Xml…

    2026年5月10日
    000
  • Go语言中基于Channel的并发快速排序:原理、实现与性能分析

    本文深入探讨了go语言中利用channel实现并发快速排序的机制。我们将分析其代码结构,阐明channel如何作为数据输入输出的管道,以及并发goroutine如何协同工作。同时,文章将重点评估这种实现方式的性能特点,指出其在展示go并发模型优雅性的同时,相比传统排序算法可能存在的性能开销与内存占用…

    2026年5月10日
    000
  • javascript闭包如何保存富文本状态

    javascript闭包如何保存富文本状态javascript闭包如何保存富文本状态javascript闭包如何保存富文本状态javascript闭包如何保存富文本状态

    闭包在富文本编辑器中扮演“守门人”和“隔离器”的角色,1. 它通过封装私有变量(如内容、撤销栈、选区)确保状态不被外部直接访问;2. 每个编辑器实例拥有独立的作用域,实现状态隔离;3. 提供公共方法作为唯一操作接口,保障数据一致性;4. 支持模块化与可维护性,便于测试与扩展;5. 需注意内存泄漏、过…

    2026年5月10日 用户投稿
    000
  • 如何计算C++结构体的大小?解析结构体内存对齐原则

    如何计算C++结构体的大小?解析结构体内存对齐原则如何计算C++结构体的大小?解析结构体内存对齐原则如何计算C++结构体的大小?解析结构体内存对齐原则如何计算C++结构体的大小?解析结构体内存对齐原则

    结构体内存对齐的原则包括:1. 结构体成员对齐,每个成员按自身大小对齐;2. 结构体整体对齐,整体大小需是对齐系数(通常为最大成员大小)的倍数;3. 填充字节插入以满足上述规则。例如,struct mystruct { char a; int b; char c;} 默认情况下会因填充导致大小为12…

    2026年5月10日 用户投稿
    000
  • Golang的函数字面量如何使用 讲解匿名函数的定义与调用方式

    Golang的函数字面量如何使用 讲解匿名函数的定义与调用方式Golang的函数字面量如何使用 讲解匿名函数的定义与调用方式Golang的函数字面量如何使用 讲解匿名函数的定义与调用方式Golang的函数字面量如何使用 讲解匿名函数的定义与调用方式

    go语言中的函数字面量(匿名函数)是一种无需命名即可直接定义和使用的函数,它能提升代码灵活性和表达力。1. 它可赋值给变量并调用;2. 可立即执行(iife);3. 可作为参数传递给其他函数;4. 适用于goroutine并发任务;5. 支持闭包,捕获外部变量形成“记忆体”。使用时需注意循环变量捕获…

    2026年5月10日 用户投稿
    100
  • Golang指针与结构体组合使用优化技巧

    使用指针指向结构体可避免复制开销,提升性能。在传递大型结构体时,传指针仅传递地址,减少内存占用和复制时间。如User和Image结构体示例所示,值传递会复制整个结构体,导致性能下降,而指针传递高效且能修改原数据。此外,处理嵌套指针时需检查nil,防止空指针异常,如Employee结构体中先判空emp…

    2026年5月10日
    000
  • 如何通过 JavaScript 的 File API 在浏览器中实现文件的分片上传?

    答案:浏览器文件分片上传通过File API将大文件切片,利用FormData逐个发送,结合并发控制与断点续传提升稳定性。具体为:1. 使用File.slice()按字节分割文件;2. 每片携带索引、总片数、fileId等信息通过fetch上传;3. 限制并发请求数避免资源耗尽,使用Promise控…

    2026年5月10日
    100
  • php opcache是如何工作的?PHP Opcache工作原理与配置

    PHP Opcache通过缓存编译后的操作码,避免重复解析编译,提升执行效率。启用后,首次请求生成Opcode并存入共享内存,后续请求直接加载缓存,跳过解析步骤。关键指标如opcache.hit_rate反映缓存命中率,理想值应达95%以上。通过phpinfo()或opcache_get_statu…

    2026年5月10日
    000
  • Golang缓存机制提升访问效率实践

    使用sync.Map实现内存缓存,结合TTL过期与LRU淘汰策略,可有效提升高并发下Golang服务性能,减少数据库压力。 在高并发服务场景中,频繁访问数据库或远程接口会显著影响响应速度和系统负载。Golang 作为高性能语言,天然适合构建高效缓存机制来减少重复计算和外部依赖调用。通过合理使用内存缓…

    2026年5月10日
    000
  • 怎样使用Node.js流处理数据?

    Node.js流处理通过可读、可写、双工和转换流实现高效数据处理,利用pipe()方法连接流并自动管理背压,结合stream.pipeline进行错误处理,适用于大文件、网络通信等场景,提升内存和时间效率。 在Node.js中处理数据,尤其当面对大量信息时,直接把所有内容加载到内存里往往不是一个好主…

    2026年5月10日
    100
  • python怎么读取文件中的数据 python文件读取read方法实战

    python中使用read方法读取文件的主要步骤包括:1. 使用with语句打开文件,确保文件正确关闭;2. 调用read方法读取文件内容,可指定读取字符数;3. 处理大文件时,使用readline或迭代器逐行读取;4. 读取不同编码的文件时,需指定编码;5. 优化读取性能时,可考虑缓存或使用特定格…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信