应用深度学习 | ADL TA Recitation: LLM LoRA Training 大型语言模型太大怎么调整呢?

LLM训练技巧与LoRA方法解析

媒体详情

上传日期
2025-06-07 14:18
来源
https://www.youtube.com/watch?v=eGQMzbhokg0
处理状态
已完成
转录状态
已完成
Latest LLM Model
gemini-2.5-pro-preview-06-05

转录

下载为TXT
speaker 1: 来继续来讲这个语言模型的有关大语言模型的那我们今天来讲就是loa的training。 那我们作业三应该就是做这个instruction tuning啊tuning我再训练一下我们这个台湾妈妈不好,应该是用7B的模型。 那请问有人开始做了吗? 如果有人开始做的话,可以举个手吗? 好,有有少数开始做了。 那有训。
speaker 2: 练完了吗?
speaker 1: 训练好没有回答,反正就是在有人开始做了。 好,那这个instruction tuning就是我们做作业三。 那其实很大一个问题就是你你可不可以你可不可以跑你可不可以跑得动。 呃,那因为大部分人大家应该都不会拿到A 100或是H 100的这个呃显示卡。 所以你如果在用这个呃家用级的显示卡的时候,你需要做一些把它做的啊或是呃一些做一些改动,那设定做一些改动。 那我们在因为其实现在的训练这个frawork是非常非常的容易的。 那助教应该有提供给你们相关的这个training school。
speaker 2: 那我到最后面会两页同影片友会跟你讲说怎么去训练哈那基本上你是完全不用写call了。
speaker 1: 你只要把资料整理成一个格式,然后呢其实安装套件写con就好了。 那我看到有面有人看到在在在看这张图,这张图是用那个gt产生的那我就把呃对我们原本那个图那个呃这个拉那他后来我就说么么之类的,后来没想到这个应该是我没有讲说在象山,那这个很明显的应该是在象山。 那还有很厉害的101,这没什么了不起的。 你看到101右边那个有一个威风男山,我觉得很厉害。 因为因为有有威风男山应该是这五年内才啊至少才凸起来的这个东西。 那里面应该是没有看到其他的呃显著的建筑物,没有看到世猫啊什么之类的,反正我都觉得非常非常的啊非常非常的厉害,没想到他们竟然这些英就图像更新到啊更新到这个这个这近五年了。 好,那我们回到就是如你可不可以跑啊,那其实我建议他去谷搜寻,就是。 Can you run m version? 他们就会告诉你去说你要去看哪一个模型,你可不可以可不可以训练,然后再把你的我放上去,比如说的啊可能4090A100等等等东西。 他就告诉你说如果用30 26B16或是Q它需要多少exactly多少的memory,就是这个minimum的这个啊requirement .
speaker 2: no .
speaker 1: hello好,就是他会告诉你最低最低要多少,那这个蛮蛮有用的哈,你不用自己去算,那自己去算也是可以,但是呃就会呃稍微麻烦一点点。 那你会想说,那这个four 32跟b four 16那到底要看哪一个呢? 如果你的话,你就看int four那个,那如果是你要four tun啊, 基本上是看B或16。 好,那这是推荐大家这个网站啊,大家就可以去看。 如果你要买显示卡的时候,也稍微看一下怎样你才是啊才符合你的需求。 好,那我们讲这个A它其实都都会多多少少听过。 那他一开始motivation是从啊飞A现在它一篇paper它就说interesting,就是你这个魔大模型的内涵的这个R啊就是矩阵的这个R其, 实是相当的低啊。 那这个有一个呃finding,就说呃finding就是说这个low rank很低,内在的rank很低。 但但这个是其实想象的rank不是真的,你去做啊这个operation或是color operation得到的这个independence。 但是它有一个呃呃影响,就是说现在的language model其实可以被少少的资料to to的原因是因为它里面那个rank很低,所以你只要有少资料去to那个小的R去解那个方程才是比会比较可行。 那另外一个的话就是我们其实那是不是可以把我们把矩阵做拆解,矩阵做拆解的话我们预算会比较快。 好,所以这个我们刚刚讲rank并不是真的去呃把模型的那个呃可能低by低的去做呃矩阵相乘,不是这样子做,或是也甚至不是做什么V D或是等等那种东西,它是比较脑中比较你想象出来的那个rank,它不不是,它只是啊生并不是真的线性代数里面讲的。 好,那我们回顾一下,我们上礼拜讲我们讲到这个transformer妈妈的模型总共大概是有organization zation,然后self attention最后是接了呃for network,那我们现在啊只通常都只用在self attention那边。
speaker 2: 那说self attention不是就是运算吗? 没有,self attention里面有四个矩阵,1WQWK、W B W O, 就是他这个原本的个进去这个self要过个同样度的。
speaker 1: 那边我们不会加bi的, 应该说整个transformer现在通常是不加bias的,就是同样维度的projection q kv做一次,然后最后output的时候也再做一次。 好,那我们来看一下这个loa它的这个这个是啊从hanface上面抓出来的这个这个动画原本的put原本的矩阵乘法复制两份,左边走啊pre位就是完全没有动,原本拉玛pre完怎样就是怎样。 右边的话是你新加的两个橘色的方程式啊的矩阵,然后两左边做矩阵乘法,右边做两次矩阵乘法后,直接把它们相加,这就是laa的ID那你说loa有什么好处呢? 因为原本左边的啊矩阵的话,你如果做低低维度到低啊啊英文字母这个D啊这个D D to d的这个protec的话,你的这个圈位的话是啊一定就是D百D嘛。 那如果你是用A的话,你可以两个矩阵去approximate,一个是d by R一个是R D那这个D呢通常是远远小于R是远远小于这个D因为D的话至少都什么512768,但是这个R呢通常是一啊248,是634,最常用就是4。 所以你可以看到可以训练的参数就比你减少掉很多了。 因为你这个低,如果是512的话,就是512乘512。 但是如果你啊是选成四的话,就是51 2乘4乘2,所以你需要训练的啊呃参数量就会显著的少很多。 所以大家用loa的话,就常常那个层次会跳出来说啊圈的部位的equal数,什么0.001的original。 就看到就很开心,因为就觉得说哎我们要训练的参数同时一下子变得好好少好少。 那还有lo拉还有另外一个好处了,就是它其实因为它这个维度,这个漏的跟off其实速度很快嘛。 那还有说你可以露的一个再漏的两个,再漏三个啊,你不一定啊,只能一个嘛,可好几个啊,但是好几个啊,这个比较多应用是在应用就是那个他们啊这个那个community的。 就他们会比如说训练在一个呃台湾的这个style,然他也是用训练的,然后再训练一个可能二次元的style,然后他把两个加起来就变台湾二次元的style这样子。 好,那A呢到底要去用在哪里?
speaker 2: 我们刚刚讲说Q K V O嘛,那如果你只用在啊一个的话,你可以瑞比较高,你用法。 那如果你用了两个的话,瑞可以比较就需要比较低,不然跑起来嘛,不然就是这个参数量其实也不不懂,不不太吻合。 那瑞果跑四个的话,你就有那2,那基本上他就测出来。
speaker 1: 大概现在大家都是用Q跟V至少会用两个Q跟V然后选4,那瑞到底要多少? 如果是124864,其实4864就呃这个呃这个边际效应就越来越递减了,所以基本上就用了4,不要用在一跟二会有点少哈。 因为你一跟二你再去做呃用就做矩阵乘法的时候,你就只是在跟他做就是向量相乘而已,就是有点太太低,没有去运用到这个硬体的特性。 好,那如果这个啊这我们。
speaker 2: 看generally啊q Lora and Lora都是一个啊parameter eff的fine ing的方式。 那pm还有之前讲过的,就比如说啊你只fine tunadapter啊或者fine tun什么。 Preing啊prom啊不是啊。
speaker 1: 只fine几。
speaker 2: 那这边就告你说不用就用就好了。 那因为其他的老。
speaker 1: 实说现在呃也许其他的方法可能会有在某一个东西会有好的好的用处,但是它比较不实用啊啊,其实比较啊其实比较简单。 然后performance就还可以这样子。 好,那我们看完A的时候,我们loa就是再回顾一下,就是分两路嘛,一路啊可以可以经过,一路就是有训练。
speaker 2: 一路没训练好。 但是你会想说lo拉的话,那有loa这么好,那为什么还要有Q A那问题就是在于现在的你去训,只用了就训练没有用的,你还是觉得啊还是常常记忆不够,还是有那问题不是出在于右边那个东西,因为右边的东西已经够小了,还是出在于原本的东西。 因为你现在的话,你虽然的时候不用去算左边那个大矩阵,但你的时候还是要左边那个大矩阵。 那左边那个大学生,如果你还是存在16变成32变的话。
speaker 1: 还是非常非常的大。 因为现在模型动不动就是什么13个B脸啊、34个B脸啊、70个B脸。 你看你连influence ference其实都有困难,更不用讲说to那个右边那个Lora wait,所以A的如何解决左边这个东西哈,还有记忆体啊非常的少的的问题,就是有人投提出来这个呃呃q loa那讲Q A之前我们要先讲一。
speaker 2: 下这个浮点数的格式。 一般人大家在讲这浮点数的格式就是four 32,那还有这个four 64了,那我们就不提,因为没比较现在比较少人在用在做啊深度学习相关的那还有另外一个就是T30,这个也还好,那或是说FD16,FD16呢呃它的精度跟FD32比精度下降锐下降。 然后但是这个有一个很大的问题,就是F16你在backword的的时候,其实你是要很大的range的。 你forward的时候是需要精度,你back的时候是需要range。 所以你啊十六用十六用来训练的时候,你的range常常会over。 那这个问题呢你就会出现,你会有你漏会有很多low Spike。 那meta的啊有一个呃模型meta出的叫meta opt,它也是有到175 billion.
speaker 1: 模型的参数。 那他到175 billion的时候,训练时候常常遇到就是常常。
speaker 2: 遇到low Spike,就是不不是flow,那它的问题就是出在16。 当大家知道这个问题的时候,大家全部现在业界的标准应该就是b four使用。 因为b four 6跟B36B你可以看到它的range都是八个B值,但是它的preci只只变七个B那我们就砍掉一些preci然后,换取啊足够的这个啊动数值的空间,让这种这。
speaker 1: 这些东西不要over flow。 好,那更激进的哈,现在呃4090跟H 100接下来的呃呃芯片会有呃资源V8FV8就是下面这两个哈呃啊exponent就是range比较多的是用来back然后比较小,比较多的是用来forward的那它还需要一些的技术,那有兴趣可以看这个的网站。 好,那我们回来讲loa哦,那我们这个拉不是用F P8,我们这里更甚至用到啊要4。 他这边就是这自己自定一个规格叫no Flo 4. 好,那A跟Q A比16变成transformer,变成4B的transformer。 还有另外。
speaker 2: 一个东西,就是它这个上面它叫做呃这个配这个然它其实东西就是调用提供的这个函函数库,然后来把那个state用做。 然后有候你但是你为把memory就帮你做这件事情。
speaker 1: 但是个非常非常的慢,所基本上是不要用,如果你机体能够负荷的话就要不要用。 好,那我们讲Q罗Q啦,它其实就是就是这样。
speaker 2: 这个这个第一条的含啊第五个啊equation,它这个Y啊就是就是上面这个原本这个的的这个上边的黄色上面这个这个填。 那它右边这一块X L one l two就是原本input乘上你的那个A第一个小矩阵l two再乘上第二个A的小矩阵。 那它这边都是用啊正常的精度,就是全部都6。
speaker 1: 那如果另外一侧呢就是它我们这个呃。
speaker 2: 呃这个work最重要的地方就是把减少腿圈位的这个精度嘛。 那他把它存在它的这个for ID的normal force.
speaker 1: 那它会去要做的话,原本是它存的时候,存在记忆体的时候是存在,但它真的资料流进来的时候,人家来的时候,他要去把它把它还原成16B的方式,就是用下面这条他要去两次,因为它是做了两个部分,第一个部分你想说他框台是做什么?
speaker 2: 他框台是原本啊这个x 30这个东西,它会去把它找出它里面值最大的。 比如它里面是啊-2000字最大的值,那你就哎取得绝对值变2000,然后把它压在127的这个range。 因为这个就是呃呃这个这个这个它这个八的这个range,然后他把它压在这里之后呢,然后去把它做就会得到一个这个127除以这个absolu的话。 你就可以得到一个C的这个的这个vec那啊这个呃的那如果你这个C存在M30的话,那他就可以去把月份的这个拿,然后再变。
speaker 1: 成就是你把它做网格这样子。 那他不只做一次这个框台,这是做一次框zation。 那他不只做这个框zation,他还去做刚刚那个C啊,因为那个C原本中间32B的那你他还去特别再去做啊更更更进一步的框框。 因为他不止想要啊,他是觉得那个三十太大了,他要继续做框。 那还有另外一个值得一提的就是他这边是讲black wise,就是因为他不是一一条直接去找啊。 最大因为如果你有一个啊极端值的话,你会让如果你有一个极端值是1亿,那你让其他的,但是大部分都是分布在一万之内,那你的你这个会变得非常非常大,所以你的值都会被你压的很低,那大家会压到0,那这样是很不好的。 所以他就他可能就是十个十个十个这样看就会比较数值会比较稳定。 好,所以就比的话be之后就是for fine tun当然是最好的。 那就比laa跟laa这个用four bit然后double quanti的话其实差不多差不多的效果,所以现在蛮多人都是啊可以用啊,如果你没法直接for fine的话,就直接用啊。 好,那最后两张投影片就是how to use laa很简单,大家上网give号的时候选x lot,那后这是它的githupage,那这现在蛮多啊这个open source community的人都是用用都是用这个。 那他们后面的开发者也蛮多,都还蛮有名的,很多都有被那个啊,如果A16Z如果大家做知道cr的话,应该知道A 16他是他们放就是有这些这些这些开发者。 好,如果然后你再点进去example拉to q点某,然后你就看到它有机,它就它就只有一个的,它没有它没有什么城市码,它城市码就帮你写好了。 然后你只要打开第一个load in bit,然后sequence这sequence这应该是adap最右边。 你可以调啊,就是我们刚刚讲那个4啊86 3那东,然后这个的话就是它的那个强度,它那个加起来强度或者你不要做,然后你要给我刚讲你的还是还是单一个都可以。 好,你把它设定完之后哦,还有这个data set,你把它改成那个啊啊我们这是训练,这是作业的data.
speaker 2: 我们训作业data set应该是。
speaker 1: gt的格式啊,大家可以再再看一下。 不过他资源很多格式了,那最后你就laacc然后test你的东西东西就完成了。 那所以现在现在啊这个是一个完全啊几乎是no code训练的方法了。 那如果啊大家还有想要掌握比较多底层的话,当还是可以用那个huface啊T的那个应该助教应该也是提供那个来去做训练。 好,那大家啊我们今天比较早,大家有什么问题吗? 就是任何的问题都可以问。 好,如果没有的话,我们今天就到这边。
speaker 2: 谢谢。 我们看一下上面。
speaker 1: 有没有看一下。

最新摘要 (详细摘要)

生成于 2025-06-07 14:21

概览/核心摘要 (Executive Summary)

本次技术分享详细阐述了在硬件资源(尤其是消费级显卡)有限的情况下,如何通过参数高效微调(PEFT)技术来训练大型语言模型(LLM)。核心内容围绕 LoRA (Low-Rank Adaptation)QLoRA (Quantized LoRA) 两种关键技术展开。

报告首先指出了直接微调LLM(如7B模型)面临的显存瓶颈问题,并推荐了查询模型VRAM需求的实用工具。随后,深入讲解了LoRA的原理:其动机源于大模型存在“内在低秩”的特性,通过在原有权重矩阵旁增加一个由两个低秩矩阵(A和B)构成的旁路,仅训练这个旁路,从而以极小的参数量(如原始模型的0.001%)实现高效微调。报告建议将LoRA应用于注意力机制的Q和V矩阵,并推荐使用Rank=4作为兼具效果与效率的配置。

然而,LoRA并未解决加载整个庞大基础模型所需的显存问题。为此,报告引入了QLoRA作为进阶方案。QLoRA的核心是将冻结的基础模型权重从16位(bfloat16)量化到4位(NF4格式),极大地降低了显存占用。同时,它在计算时动态地将4位权重反量化为16位,并结合“双重量化”和“分块量化”等技术,在大幅降低资源消耗的同时,实现了与全量微调几乎无差别的性能。最后,报告提供了使用开源工具库 axolotl 进行QLoRA训练的“零代码”实践指南,展示了该技术的高度易用性。

大型语言模型微调的挑战与背景

  • 核心问题:硬件资源限制

    • 在进行课程作业(如Instruction Tuning一个7B模型)时,学生面临的最大挑战是个人设备(如家用级显卡)是否具备足够的显存来运行训练。
    • 多数用户无法使用A100或H100等专业级GPU,因此需要在消费级硬件上寻找解决方案。
  • 实用建议:评估硬件能力

    • 主讲人建议通过在线工具(谷歌搜索 "Can you run LLM")来查询特定模型在不同精度(如FP32, bfloat16, int4)下所需的最小显存。
    • 精度选择指南
      • 进行微调 (Fine-tuning) 时,应参考 bfloat16 的显存需求。
      • 进行推理 (Inference) 时,可参考 int4 的需求。

LoRA (低秩适应) 技术详解

  • 核心动机:模型的“内在低秩”

    • LoRA的理论基础来源于一个重要发现:大型语言模型内部的权重矩阵具有很低的“内在秩 (intrinsic rank)”。
    • 这是一种概念上的秩,意味着模型可以用少量的数据进行有效调整,并且矩阵分解可以加速运算。
  • 工作原理与架构

    • LoRA通过在模型(通常是Transformer的自注意力层)的权重矩阵旁添加一个可训练的“旁路”来实现微调。
    • 结构
      1. 主路:原始的、预训练好的权重矩阵被冻结 (frozen),不参与训练。
      2. 旁路:新增两个低秩矩阵(例如,一个 D x R 矩阵和一个 R x D 矩阵,其中 R 远小于 D)。输入数据会同时流经主路和旁路。
      3. 合并:两条路径的输出结果直接相加。
    • 显著优势
      • 参数量巨减:仅需训练旁路的两个小矩阵,可训练参数量通常仅为原始模型的极小一部分(例如 0.001%)。
      • 灵活性高:可以加载和组合多个不同的LoRA适配器,以实现模型风格的融合(例如,将“台湾风格”和“二次元风格”的LoRA结合)。
  • 实践应用与配置

    • 应用位置:LoRA通常应用于自注意力机制的四个关键投影矩阵:WQ, WK, WV, WO
    • 推荐配置
      • 目标模块:至少应用于 QV 矩阵。
      • 秩 (Rank)R=4 是最常用的选择。R=12 效果稍差,而 R 值过高(如16、64)会出现边际效应递减。

QLoRA: 应对内存瓶颈的进阶方案

  • LoRA的局限性

    • 虽然LoRA减少了可训练参数,但它并没有减少加载整个基础模型所需的显存。对于13B、34B、70B等更大规模的模型,仅加载模型本身就是一个巨大的挑战。
  • QLoRA的核心思想

    • QLoRA通过量化 (Quantization) 冻结的基础模型权重来解决显存瓶颈。它将权重从标准的16位浮点数(bfloat16)压缩至一个自定义的4位浮点数格式 (NormalFloat4, NF4)
  • 关键技术点

    1. 4位量化:将基础模型的权重以4位格式存储在显存中。
    2. 动态反量化:在进行前向传播计算时,将4位的权重即时地 (on-the-fly) 恢复(反量化)到bfloat16精度进行矩阵运算,而LoRA适配器本身保持在bfloat16精度。
    3. 双重量化 (Double Quantization):为了进一步节省空间,QLoRA对用于反量化的“量化常数”本身再次进行量化。
    4. 分块量化 (Block-wise Quantization):为避免极端值(outliers)影响整体量化精度,QLoRA采用分块处理的方式(例如,每次处理10x10的权重块),使数值计算更加稳定。
  • 性能对比

    • 主讲人指出,使用QLoRA(4-bit配合双重量化)得到的效果与进行完整的bfloat16微调“差不多”,因此是目前在资源受限情况下的首选方案。

浮点数格式的重要性

  • FP16 vs. bfloat16
    • FP16:虽然精度较高,但其表示的数值范围 (range) 有限。在反向传播时,梯度值可能超出其表示范围,导致溢出(overflow)和训练不稳定,出现“loss spike”现象。
    • bfloat16:被认为是当前的业界标准。它牺牲了一部分精度 (precision),但换来了与FP32相同的数值范围,能有效避免溢出问题,使训练过程更稳定。
  • FP8
    • 这是一种更新的格式,在4090和H100等新一代芯片上得到支持,为前向和后向传播提供了不同特性的版本。

实践指南:如何使用QLoRA进行训练

  • 推荐工具:axolotl

    • 这是一个在开源社区非常流行的训练框架,其GitHub背后有许多知名开发者。
  • “零代码”训练流程

    1. 从GitHub克隆 axolotl 的代码库。
    2. 找到并修改一个示例配置文件(如 qlora.yml)。
    3. 关键配置项
      • load_in_4bit: true:启用4位量化。
      • lora_r: 设置LoRA的秩,如 48
      • lora_alpha: LoRA的缩放因子。
      • lora_target_modules: 指定应用LoRA的模块,如 [q_proj, v_proj]
      • dataset: 指定你的训练数据集路径。
    4. 使用 accelerate launch 命令启动训练脚本。
  • 备选方案

    • 对于希望有更多底层控制的用户,也可以使用Hugging Face transformers 库提供的原生训练脚本。

结论

LoRA和QLoRA是当前极为强大和实用的参数高效微调(PEFT)方法。QLoRA通过巧妙地结合低秩适应与4位量化技术,使得在消费级GPU上微调大型语言模型成为可能,并且能够达到接近全量微调的优异性能。随着axolotl等工具的普及,这些先进技术的应用门槛已大幅降低,为广大开发者和研究者提供了便利。