全参数微调的显存运用量和推理一样多,大模型不再只是大型科技公司的玩具了。

在大模型方向上,科技巨子在训更大的模型,学界则在想办法搞优化。最近,优化算力的办法又上升到了新的高度。

大型语言模型(LLM)彻底改变了自然语言处理(NLP)范畴,展现了出现、顿悟等非凡才能。但是,若想构建出具有一定通用才能的模型,就需要数十亿参数,这大幅提高了 NLP 研讨的门槛。在 LLM 模型调优进程中一般又需要昂贵的 GPU 资源,例如 880GB 的 GPU 设备,这使得小型试验室和公司很难参与这一范畴的研讨。

最近,人们正在研讨参数高效的微调技能(PEFT),例如 LoRA 和 Prefix-tuning,为利用有限资源对 LLM 进行调优供给了解决计划。但是,这些办法并没有为全参数微调供给有用的解决计划,而全参数微调已被公认为是比参数高效微调更强壮的办法。

在上周复旦大学邱锡鹏团队提交的论文《Full Parameter Fine-tuning for Large Language Models with Limited Resources》中,研讨人员提出了一种新的优化器 LOw-Memory Optimization(LOMO)。

经过将 LOMO 与现有的内存节约技能集成,与规范办法(DeepSpeed 解决计划)比较,新办法将内存运用量削减到了之前的 10.8%。因此,新办法能够在一台具有 8RTX 3090 的机器上对 65B 模型进行全参数微调,每个 RTX 3090 具有 24GB 内存。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

论文链接:arxiv.org/abs/2306.09…

在该工作中,作者分析了 LLM 中内存运用的四个方面:激活、优化器状况、梯度张量和参数,并对练习进程进行了三方面的优化:

  1. 从算法的角度从头考虑了优化器的功能,发现 SGD 在微调 LLM 完好参数方面是一种很好的代替品。这使得作者能够删去优化器状况的整个部分,因为 SGD 不存储任何中间状况。
  2. 新提出的优化器 LOMO 将梯度张量的内存运用量削减到 O (1),相当于最大梯度张量的内存运用量。
  3. 为了运用 LOMO 安稳混合精度练习,作者集成了梯度归一化、丢失缩放,并在练习期间将某些核算转换为全精度。

新技能让内存的运用等于参数运用加上激活和最大梯度张量。全参数微调的内存运用被面向了极致,其仅等同于推理的运用。这是因为 forward+backward 进程的内存占用应该不会比单独的 forward 进程少。值得注意的是,在运用 LOMO 节约内存时,新办法保证了微调进程不受影响,因为参数更新进程依然等同于 SGD。

该研讨评价了 LOMO 的内存和吞吐量功能,标明借助 LOMO,研讨者在 8 个 RTX 3090 GPU 上就能够练习 65B 参数的模型。此外,为了验证 LOMO 在下流使命上的功能,他们运用 LOMO 来调优 SuperGLUE 数据集集合上 LLM 的全部参数。成果标明了 LOMO 对具有数十亿参数的 LLM 进行优化的有用性。

办法介绍

在办法部分,本文具体介绍了 LOMO(LOW-MEMORY OPTIMIZATION)。一般而言,梯度张量表明一个参数张量的梯度,其大小与参数相同,这样一来内存开支较大。而现有的深度学习结构如 PyTorch 会为一切参数存储梯度张量。现阶段,存储梯度张量有两方面原因:核算优化器状况以及归一化梯度。

因为该研讨选用 SGD 作为优化器,因此没有依赖于梯度的优化器状况,而且他们有一些梯度归一化的代替计划。

他们提出了 LOMO,如算法 1 所示,LOMO 将梯度核算与参数更新交融在一个进程中,然后避免了梯度张量的存储。

下图为 SGD 和 LOMO 在反向传达和参数更新阶段的比较。Pi 为模型参数,Gi 为 Pi 对应的梯度。LOMO 将梯度核算和参数更新交融到一个进程中,使梯度张量最小。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

LOMO 对应的算法伪代码:

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

具体而言,该研讨将 vanilla 梯度下降表明为

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

,这是一个两步进程,首先是核算梯度,然后更新参数。交融版别为

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

该研讨的关键思维是在核算梯度时当即更新参数,这样就不会在内存中存储梯度张量。这一步能够经过在向反向传达中注入 hook 函数来完成。PyTorch 供给了注入 hook 函数的相关 API,但却无法用当前的 API 完成准确的即时更新。相反,该研讨在内存中最多存储一个参数的梯度,并跟着反向传达逐个更新每个参数。本文办法削减了梯度的内存运用,从存储一切参数的梯度到只存储一个参数的梯度。

大部分 LOMO 内存运用与参数高效微调办法的内存运用共同,这标明 LOMO 与这些办法相结合只会导致梯度占用内存的轻微增加。这样就能够为 PEFT 办法调优更多的参数。

试验成果

在试验部分,研讨者从三个方面评价了他们提出的办法,即内存运用情况、吞吐量和下流功能。假如不作进一步解说,一切的试验都是用 7B 到 65B 的 LLaMA 模型进行的。

内存运用情况

研讨者首先剖析了,在不同设置下,练习期间的模型状况和激活的内存运用情况。如表 1 所示,与 AdamW 优化器比较,LOMO 优化器的运用导致内存占用大幅削减,从 102.20GB 削减到 14.58GB;与 SGD 比较,在练习 LLaMA-7B 模型时,内存占用从 51.99GB 削减到 14.58GB。内存用量的大幅削减首要归因于梯度和优化器状况的内存需求削减。因此,在练习进程中,内存大部分被参数占有,与推理进程中的内存用量相当。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

如图 2 所示,假如选用 AdamW 优化器进行 LLaMA-7B 练习,相当大比例的内存(73.7%)被分配给优化器状况。用 SGD 优化器替换 AdamW 优化器能够有用削减优化器状况占用内存的百分比,然后减轻 GPU 内存运用(从 102.20GB 削减到 51.99GB)。假如运用 LOMO,参数更新和 backward 会被交融到一个进程中,进一步消除优化器状况对内存的需求。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

吞吐量

研讨者比较了 LOMO、AdamW 和 SGD 的吞吐功能。试验是在一台装备了 8 个 RTX 3090 GPU 的服务器进步行的。

对于 7B 的模型,LOMO 的吞吐量出现显著优势,超越 AdamW 和 SGD 约 11 倍。这一重大改进可归功于 LOMO 在单个 GPU 上练习 7B 模型的才能,这削减了 GPU 间的通讯开支。与 AdamW 比较,SGD 的吞吐量略高,这可归因于 SGD 排除了动量和方差的核算。

至于 13B 模型,因为内存的约束,它无法在现有的 8 个 RTX 3090 GPU 上用 AdamW 练习。在这种情况下,模型的并行性对 LOMO 来说是必要的,LOMO 在吞吐量方面依然优于 SGD。这一优势归功于 LOMO 的内存高效特性,以及只需要两个 GPU 以相同的设置来练习模型,然后降低了通讯成本,提高了吞吐量。此外,在练习 30B 模型时,SGD 在 8 个 RTX 3090 GPU 上遇到了内存不足(OOM)的问题,而 LOMO 在只有 4 个 GPU 的情况下体现杰出。

最后,研讨者运用 8 个 RTX 3090 GPU 成功练习了 65B 模型,完成了 4.93 TGS 的吞吐量。利用这样的服务器装备和 LOMO,模型在 1000 个样本上的练习进程(每个样本包括 512 个 token)大约需要 3.6 小时。

下流功能

为了评价 LOMO 在微调大型语言模型方面的有用性,研讨者进行了一系列广泛的试验。他们将 LOMO 与其他两种办法进行比较,一种是不需要微调的 Zero-shot,另一种是目前很盛行的参数高效微调技能 LoRA。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

表 3 成果显现:

  • LOMO 的体现明显好于 Zero-shot;
  • 在大多数试验中,LOMO 普遍优于 LoRA;
  • LOMO 能够有用扩展至 650 亿参数的模型。

LOMO 和 LoRA 在本质上是彼此独立的。为了验证这一说法,研讨者运用 LLaMA-13B 在 BoolQ 和 MultiRC 数据集进步行了试验。成果如图 3 所示。

他们发现,LOMO 在持续增强 LoRA 的功能,不管 LoRA 取得的成果有多高。这标明,LOMO 和 LoRA 选用的不同微调办法是互补的。具体来说,LOMO 专心于微调预练习模型的权重,而 LoRA 则调整其他模块。因此,LOMO 不会影响到 LoRA 的功能;相反,它有助于对下流使命进行更好的模型调优。

650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了

更多细节拜见原论文。