首页 > 其他分享 >大模型微调方法总结

大模型微调方法总结

时间:2023-10-17 09:45:40浏览次数:49  
标签:总结 weight LoRA 模型 微调 参数 lora

大模型微调方法总结

参考链接:https://blog.csdn.net/v_JULY_v/article/details/132116949

前言:随着chatGPT的备受欢迎,大模型异常火爆,各大厂商相继推出自己的大模型。

  二级公司和用户需要根据自身的垂直领域微调这些具有语义理解能力的大模型,以满足特定领域的业务需求,如医疗,法律咨询等。

  但是当微调这一类比较大的模型时,更新所有参数不太可行。以 GPT-3 175B 为例——部署微调模型的独的成本极其昂贵。

 

huggingface上的框架。  如 1 指令微调 huggingface有PEFT  2 强化学习的human feedback  , huggingface有TRL框架

1 1 中 有6种方法, LORA, p-tuning-V1, p-tuning-V2等

2 TRL框架

   详细使用方法待后续补充

 一 LoRA:

1 低(秩)rank 自适应微调方法

2 背景及本质

  大模型的参数更新耗费大量现存为此, 微软的研究者们于2021年通过论文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》提出了低秩适应LoRA

  •   它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到 Transformer 架构的每一层中,大大减少了下游任务的可训练参数的数量

    We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks.

  
      与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数数量减少 10,000 倍,GPU 内存需求减少 3 倍

Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times.

                 

3 大致操作总览

  1 正向推理 的所有参数 结果

  2 反向梯度的所有结果

  3 反向梯度更新的计算, sGD不带状态的会相对省内存,但是adam 就会记录过往若干梯度参数。

  

      

 

  训练:

  图 W0+Lora层结果

    lora=w1 正态分布+w2 全0

       推理:lora层需要merge会W0,即w1*w2+w0即可。

 

4 实际操作

  4.1 微软DeepSpeed-Chat中对LoRA微调的实现

  # TODO 待补充--->>>>>>

  代码中体现

F.linear(input, self.weight, self.bias) + (self.lora_dropout(input)
@ self.lora_right_weight @ self.lora_left_weight) * self.lora_scaling

 加号左侧为原结构支路,加号右侧为新增支路,self.lora_right_weight self.lora_left_weight 分别为两个新引入线性层的参数.

  4.2 Huggingface上PEFT库对LoRA

  更详细使用方法

  # TODO 待补充--->>>>>>

5 另外应用

lora层可针对某一层参数,可插拔

对stable diffusion 也可用。

 

二 QLora微调方法

  2.1 前言

     QLoRA于今23年5月份通过此篇论文《QLORA: Efficient Finetuning of Quantized LLMs》被提出,本质是对LoRA的改进,相比LoRA进一步降低显存消耗。

  • 因为LoRa为LLM的每一层添加了少量的可训练参数(适配器),并冻结了所有原始参数。这样对于微调,只需要更新适配器权重,这可以显著减少内存占用
  • 而QLoRa更进一步,引入了4位量化、双量化和利用nVidia统一内存进行分页。

  所有这些对比Lora,进一步降低了显存消耗。

  下图总结了不同的微调方法及其内存需求,其中的QLoRA通过将模型量化到4位精度并使用分页优化器管理内存峰值来改进LoRA.

      

 

  2.2 模型量化

  原理:将浮点数值转化为定点数值,同时尽可能减少计算精度损失的方法。

    这样就减小了模型, 在计算时,最后再将定点数据反量化为浮点数据得到最终的结果。

      

   

  综合而言,我们可以对模型参数(weight)、激活值(activation)或者梯度(gradient)做量化。通常而言,模型的参数分布较为稳定,因此对参数 weight 做量化较为容易(比如,QLoRA便是对weight做量化)
至于模型的激活值往往存在异常值,直接对其做量化,会降低有效的量化格点数,导致精度损失严重,因此,激活值的量化需要更复杂的处理方法(如SmoothQuant)

  更多内容详见: 《zhouyi量化白皮书》

三 P-tuning V1/V2

3.1 P-Tuning V1:将自然语言的离散模版转化为可训练的隐式prompt (连续参数优化问题)

   

3.2 P-Tuning V2:在输入前面的每层加入可微调的参数

 

 

-----------------------对于NPU

总结各种微调

微调后的模型 在SDK的使用

背景

  各个厂商的差异化场景落地势必会基于大模型的微调,

  微调后的模型可能产生zhouyi 的sdk 不适配情况。

  总结了主流的微调方法。以及后续会对sdk适配这些微调模型进行验证。

参考链接:

标签:总结,weight,LoRA,模型,微调,参数,lora
From: https://www.cnblogs.com/lx63blog/p/17627664.html

相关文章

  • 10月14日例会总结
    目录例会总结代码以及知识点例会总结代码以及知识点"""类和对象在程序中先有类,再有对象"""#类classlei:#定义一个类需要用class关键字#类属性school='fuyang'#对象的绑定方法def__init__(self,name,age):#初始化方法self.n......
  • 10 月 16 日模拟赛总结
    Before本文章在洛谷博客同步发布Contest-Link预期\(30+0+0+20=50\)。实际\(30+0+100+60=190\)。挂分\(-140\)。rk2/totrk7,行。看T1,单调栈,不会,写暴力溜。看T2,挺线段树的,但好像维护不了,写暴力溜。看T3,不会怎么还不会啊,挺K的一个树形DP,没拿暴力30分......
  • 每日总结
    今天一大早被闹钟叫醒,心情还算不错。洗漱完毕后,我在桌上放了一个面包、一杯咖啡和一本书,然后开始了这一天的旅程。第一件事情是打开电脑,检查一下昨晚关掉的那些程序是否仍在运行中就会占用电脑的资源,让我启动其他应用变得缓慢。检查完运行中的程序后,我开始回忆昨天晚上做了什么,......
  • 2023.10.16——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.DIV+CSS明日计划:学习......
  • R语言中的Stan概率编程MCMC采样的贝叶斯模型|附代码数据
    原文链接:http://tecdat.cn/?p=11161最近我们被客户要求撰写关于贝叶斯模型的研究报告,包括一些图形和统计输出。概率编程使我们能够实现统计模型,而不必担心技术细节。这对于基于MCMC采样的贝叶斯模型特别有用R语言中RStan贝叶斯层次模型分析示例stan简介Stan是用于贝叶斯推理......
  • jsonpath模块的知识点总结
    jsonpath模块$表示根节点.表示子节点..表示内部任意位置1,如何通过jsonpath取json里面的值导入jsonpath模块:fromjsonpathimportjsonpathdict={"key1":{"key2":{"key3":{"key4":{"key5":"request"}}}}}#1,普通的提取方式print(dict[&......
  • Pytest_知识点总结
    pytest编写的规则:1、测试文件以test_开头(以_test结尾也可以)2、测试类以Test开头,并且不能带有__init__方法3、测试函数以test_开头4、断言必须使用assertpytest.main(['-s','-v']):用来执行测试用例-s打印print语句到控制台-v显示测试方法执行的详情-m标签名:测试分组的执行fix......
  • Unittest单元测试框架-知识点总结
    unittest单元测试框架1.导入unittest包========================================================================2.创建类的时候要继承与unittest.TestCase类2.1,setUp方法是在类中测试执行前的初始化工作2.2,tearDown方法是在类中测试执行后的清除工作2.3,测试用例函数以test开头......
  • 今日总结
    今天尝试着不看任何视频,自己手把手构建elementplus,虽然成功展示出表格来了,但是巨痛苦,因为Vue3的写法跟之前完全不一样,因此组件的代码也跟之前不一样。 ......
  • 每日总结20231016
    代码时间(包括上课)3h代码量(行):20行博客数量(篇):1篇相关事项:1、今天是周一,一周里面最容易犯困的一天,但是这次没有那么困,这次还算是学了不少的,今天上的是软件设计模式和人机交互技术。2、软件设计模式这次讲了三种模式,中介者模式、备忘录模式、观察者模式,人机交互技术讲的是盒子模......