我的大语言模型微调踩坑经验分享

news2024/11/24 22:52:02

由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处理,往往这一步就难住很多同学,无从下手,更别说 training。

然后再对模型进行 finetuning 来更好满足自己的下游任务。那么对于如果要训练一个专家模型。预训练也是必不可缺的工作。不管是预训练还是 finetuning(微调),无论选用何种方案,都避免不了训练中产生的灾难性遗忘问题,那么怎么减少和避免这种情况的发生,也是本文想讲的一个重点。对于推理,在 GPU 资源不富裕的情况,如何最小化的利用内存,提升推理效率,也是可以讨论的内容。

模型选择

先看一下最好的模型有哪些,以下数据是最新 LLM 排行,来自 UC 伯克利 [1]

图片

当然这里前 3 名都闭源模型,后面开源模型,大多数也都是英文的模型。如果 GPU 资源充足(至少 A100*8),这里也可以基于开源模型做中文的预训练,最后再 finetuning 。但我们没有 GPU 资源, 我们可以选择开源的中文模型直接做微调。

具体有哪些中文模型可以选择,可以参考这两个地址 中文语言理解测评基准(CLUE)[2] 和 SuperCLUE 琅琊榜 [3]。开源领域 ChatGLM,LLAMA,RWKV 主要就是这 3 种模型, 中文好一点就是 ChatGLM,潜力最好的就是 LLAMA,RNN 架构决定 RWKV 有很好的推理效率(随输入长度内存占比线性自增,而 LLAMA 则是指数增加) 和 Length Extrapolation (关于长度外推性,可以参考苏神的文章 [4])。

当然 MPT-7B-StoryWriter-65k+ [5] 模型也有较长的外推能力,主要在于,注意力这块使用了 ALIBI [6]。要拥有什么样的长度,取决你的需求。对于对话模型,往往不需要那么长的外推能力。但对于想做知识库领域相关的应用, 需要模型能够看更多的内容,是有这个需求的。

这里不做推荐,一切来自你的具体需求和 GPU 资源,不知道怎么样选择,可以将您的需求和资源情况留言,我给你做一个选择。

模型大小选择

当然对于模型参数的选择,往往是参数越大效果越好。如果资源充足,当然是推荐 30B 以上的模型。不管是 6B, 7B 和 13B 同样的训练数据,同样训练参数,模型参数量大效果则优于低参数的模型。那么根据模型参数,如何预估我们的训练所需的内存开销,这里有一个简单的方法 比如 6B 模型,60 亿规模参数,根据以下公式计算:

模型参数 + 梯度参数 + 优化器参数 = 6B * 1bytes + 6GB + 2*6GB = 24GB

以上是全量预训练,当然如果采用 lora 这种方法,则会有更低内存占用。当然我们还可以对模型进行量化,来提高内存效率。

注意:参数多量化低的模型要优于参数低量化高的模型,举例 :33B-fb4 模型要优于 13b-fb16 模型.

数据处理

对于 LLM 训练,数据质量很重要。预训练时,我们可以将数据先进行预处理,比如对数据进行一定规则的筛选,数据去重,去除一些低质量的数据。同时,我们可能面临各种类型的数据,PDF,Word,HTML,代码文件等等,对于这种不同类型的数据我们需要都处理成文本,同时还过滤掉一些干扰项或乱码的数据。

当然,我们也可以利用一些工具去处理,比如 justext [7],trafilatura [8],来提取文档主要内容,减少数据的噪音。对于空的文档或文档长度低于 100 进行过滤,进一步减少噪音。

对于一些机器生成的文本或 OCR 识别错误的文本,质量不高,由没有什么逻辑性,虽然比较难以检测,但是还是会有一些工具能做这样的事情,比如 ctrl-detector [9]。当然对于一些有毒的或带有偏见的数据,可以采用 PerspectiveAPI [10] 或垃圾邮件检测的办法来过滤。

我们还不得不考虑数据的一些隐私风险,也需要考虑,比如身份证号,银行卡等信息,比如 presidio 和 pii-codex 等工具提供了检测、分析和处理文本数据中的个人身份信息的能力。

指令微调数据,我们可以使用 PromptSource [11] 来创建微调数据。当然我们还可以让 GPT4 给我们标注一些数据,这样蒸馏知识,可以让数据质量进一步提升。这里我分享一个我使用的 Prompt 工程:

first_prompt = """
作为一位专业的xxxx,您的任务是从给定的上下文回答问题。
给定的上下文:
"""
last_prompt = """
请综合上述信息,你给出的回复需要包含以下三个字段:
1.questions: 基于上下文内容,提出与这个内容相关的问题,至少两个以上。
2.answers: 然后根据问题,分别给出每个问题的答案,请用 markdown 格式。
3.instruction: 给出上下文内容的总结,尽量精简,用 markdown 格式。
请按照以下JSON格式来回答:
前括号
      "questions": [
          "<内容相关问题1>",
          "<内容相关问题2>"
      ],
      "answers": [
           "<内容相关问题1的答案>",
           "<内容相关问题2的答案>"
      ],
      instruction: "<总结性的内容>"
后括号
注意:如果碰到上下文内容信息不够,无法回答问题的情况,answers和questions可以返回空。
最后强调一下:你的回复将直接用于javascript的JSON.parse解析,所以注意一定要以标准的JSON格式做回答,不要包含任何其他非JSON内容,否则你将被扣分!!!
"""

微调方案

目前对于 LLM 微调方案有很多,我将常用的一些方案和相关资料做一个列举。

  • Prefix-Tuning(P-Tuning v2)[12]

  • Prompt Tuning [13]

  • Lora / QLora [14]

根据实际经验,这里推荐采用 Lora 或 QLora。简单介绍一下 QLoRA,重点改进是将模型采用 4bit 量化后加载,训练时把数值反量化到 bf16 后进行训练,利用 LoRA 可以锁定原模型参数不参与训练,只训练少量 LoRA 参数的特性使得训练所需的显存大大减少。例如 33B 的 LLaMA 模型经过这种方式可以在 24GB 的显卡上训练,也就是说消费级单卡都可以实现,大大降低了微调的门槛。

英文模型需要做词表扩充吗?

对于像 LLaMA 模型的词表大小是 32K,其主要针对英语进行训练(具体详见 LLaMA 论文 [15]),对多语种支持不是特别理想(可以对比一下多语言经典模型 XLM-R 的词表大小为 250K)。

通过初步统计发现,LLaMA 词表中仅包含很少的中文字符,所以在切词时会把中文切地更碎,需要多个 byte token 才能拼成一个完整的汉字,进而导致信息密度降低。比如,在扩展词表后的模型中,单个汉字倾向于被切成 1 个 token,而在 LLaMA 中可能就需要 2-3 个才能组合成一个汉字,显著降低模型的推理效率。

如何避免灾难遗忘

通常我们有以下方式,可以减少或避免灾难性遗忘问题

  • 将重要的权重冻结 - 像 Lora 就是采用的这种方案,只学习部分网络权重。但这里 Lora 的配置其实是要注意一下,如果你是用 Lora 做预训练,lora 训练模块可以配上 q_proj,v_proj,k_proj,o_proj 如果是微调则只需要训练 q_proj,v_proj lora_rank 的设置也有讲究,初始设 lora_ran 为 8,训练存在遗忘时,可以将 lora_rank 改为 64(原因是与原模型数据领域相差较大的话,需要更大的秩,原论文有说明)。

  • 复习 - 跟人一样,在预训练或微调时,回看之前训练的数据。还可以专门把特征图存起来,量化以后放在一个类似于记忆库的地方,之后在新任务上训练的时候从这个记忆库里重构出记忆和新数据一起训练。感兴趣可以看这篇论文 [16]。

  • MoE - 稀疏门控制的专家混合层,最近爆出 GPT4 是由 8 个 220B 的模型组合。关于 Moe 相关资料 [17] 大家自行了解。

推理加速

对于推理,一般我们采用量化方案,这里有两个办法。第一个则是采用 ggml 工具,比如 llama.cpp [18] 针对 llama 模型,将模型量化运行在 cpu 或 gpu 上,也可以 cpu 和 gpu 一起跑,内存则大大减少,推理速度有极大的提高。

图片

▲ image.png

这里如果将 llama.cpp 运行在 gpu 上, 编译时一定要加 LLAMA_CUBLAS=1,同时推理的时候,指定 --gpu-layers|-ngl 来分配运行在 gpu 上的层数,当然越大,占用 gpu 的内存会越多。

如果是 RWKV 模型,则考虑采用 rwkv.cpp [19],此方法与 llama.cpp 类似,使用方式也是类似的。

还有 Llama 模型还可以考虑使用 exllama [20] 纯 GPU 的加速,虽然还不够完善,但也可以值得一试。

另一个,采用 LLM Accelerator [21],LLM 存在大量的相似性推理,基于此,可以做一些优化加速推理,具体请看论文。最后采用架构上的调整,faster transformer [22] 要优于传统的 transformer 架构。

总结

最后总结几条原则:

  • 参数多量化低的模型要优于参数低量化高的模型

  • 模型质量与训练数据质量是存在相关性的

  • 扩充中文词表有助于提高推理效率

  • 微调推荐采用 Lora QLora 方案

  • 模型加速必然需要对模型进行量化

技术交流群

建了技术答疑、交流群!想要进交流群的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

方式①、添加微信号:mlc2060,备注:技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:技术交流

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件夹还在,里面文件没了?问题这样解决

文件夹还在但文件无故消失怎么办&#xff1f;文件的消失对于我们来说可能是个令人沮丧且困惑的问题。有时候&#xff0c;我们可能会发现文件夹依然存在&#xff0c;但其中的文件却消失了。在这篇文章中&#xff0c;我们将探讨为什么电脑文件会无故消失的原因&#xff0c;并提供…

【Kafka】基本概念

文章目录 一、消息队列的流派1.1 有Broker1.1.1 重topic1.1.2 轻topic 1.2 无Broker 二、kafka安装三、kafka基本术语四、发送消息五、消费消息六、单播消息七、多播消息八、查看消费组的详细信息九、主题topic十、分区十一、kafka中消息⽇志⽂件中保存的内容 一、消息队列的流…

微信-Native支付(扫二维码支付)工具类 2023最新保姆教程

0、照着微信开发文档 取到证书、秘钥等 好几个key 1、获取商户号merchantId 账户中心->商户信息->微信支付商户号 3、获取商户证书序列号merchantSerialNumber 账户中心->API安全->API证书管理 5、获取appID 产品中心->AppID账号管理 1、这个链接教你获取各…

1220*2440mm建筑模板木工板:桥梁工程中的覆膜板选择

在桥梁工程中&#xff0c;选择合适的建筑模板木工板至关重要。其中&#xff0c;1220*2440mm规格的建筑模板木工板作为一种常见的选择&#xff0c;特别适用于混凝土工程和桥梁建设。本文将重点介绍这种规格的木工板作为覆膜板在桥梁工程中的应用。 1220*2440mm建筑模板木工板是一…

RISC Zero zkVM架构

1. 引言 RISC Zero zkVM为&#xff1a; 基于 FRI PLONK 构建的采用Von Neumann架构的ZK Machine将RISC-V微控制器 具化为 某基于STARK的证明系统&#xff0c;的微架构和编码机制。 2. Row (Time) Structure 一个cycle对应1个memory transaction&#xff0c;对用户传入的程…

嵌入式Linux HID多指触控/触摸设备报表描述符

这里只做一下简单记录&#xff0c;更为详细的修改流程后续的文章再介绍。 报表描述符 0x05, 0x0D, // Usage Page (Digitizer) 0x09, 0x04, // Usage (Touch Screen) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0…

jbase实现业务脚本化

经过晚上和早上的努力&#xff0c;终于补上框架最后一块了&#xff0c;业务脚本侦听变化后自动编译jar包和调用&#xff0c;实现维护成本低&#xff0c;开发效率高的框架的基本体系。 实现自动编译jar包的类 package appcode;import org.w3c.dom.Document; import org.w3c.do…

Android 数据恢复的顶级软件分享

人们经常向我们询问有关 Android 数据恢复软件的信息以及它们是否有用。而且&#xff0c;我们给他们讲了两个朋友的故事——凯伦和亚历克斯。他们都丢失了 Android 手机上的一些重要数据。 丢失数据确实是一个令人心碎的时刻&#xff0c;根据丢失的文件&#xff0c;可能会让您…

Linux高级命令(扩展)三

一、date命令 1、date命令的作用 date命令的主要作用&#xff1a;用于获取计算机操作系统的系统时间 2、获取计算机的系统时间 # date 3、定制时间格式 # date "%F %T %Y %m %d %H %M %S" %F : 2020-04-03 %T : 09:45:36 %Y : 年 %m : 月 %d : 日 %H : 小时 %M…

这个超实用的门禁技巧,让办公楼安全更简单高效!

门禁监控是现代社会中不可或缺的一部分&#xff0c;用于确保安全和管理进出某个区域的人员。随着科技的不断发展&#xff0c;门禁监控已经远离了传统的机械锁和钥匙&#xff0c;变得更加智能化和高效。 客户案例 企业办公大楼 无锡某大型企业在其办公大楼内部部署了泛地缘科技…

【机器学习 | PipeLine】机器学习通用管道最佳实践!!(无论什么问题都能套上,确定不来看看?)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

任正非说:只有“有为”才会“有位”,任何组织只有在流程中创造价值,才可能获得成长的机会。

你好&#xff01;这是华研荟【任正非说】系列的第28篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、所有一切要符合未来的作战需要&#xff0c;组织是为了作战而存在的&#xff0c;而不是作战服从组织的。 来源于任正非先生…

RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗中文输入法

RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗输入法&#xff08;适用于所有基于Ubuntu的UI桌面系统&#xff09; 一、添加中文语言支持输入法平台fcitx 1.安装fcitx sudo apt-get install fcitx 2.然后设置fcitx为开机自启动 sudo cp /usr/share/applications/fc…

Python进阶之推导式与生成器

文章目录 一、推导式1.列表推导式2.字典推导式3.集合推导式4.元组推导式&#xff08;生成器推导式&#xff09; 二、生成器1.生成器表达式2.生成器函数3.send函数 结束语 &#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联…

【数智化人物展】华院计算董事长、创始人宣晓华:通用大模型只是起点,尚需结合专业知识方能解决行业核心问题...

宣晓华 本文由华院计算董事长、创始人宣晓华投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 大模型的出现&#xff0c;正在开启着国内新一轮AI热潮。 某种程度上&#xff0c;真正在当下决定企业成败的&#…

22款奔驰S400L升级原厂 360全景影像 高清环绕的视野

您是否经历过这种场面呢&#xff1f; 停车位&#xff0c;狭窄障碍停车困难 避免盲区&#xff0c;倒车盲区危及生命安全 狭窄路段&#xff0c;无法判断是否安全通过 视角盲区&#xff0c;小孩站在视野盲区看不到 360度无缝3D全车可见&#xff0c;解决各个视角盲区&#xff…

开发一款直播弹幕游戏需要多少钱?

开发一款直播弹幕游戏需要多少钱&#xff1f;有好多朋友在咨询过弹幕游戏的开发价格后&#xff0c;都会比较吃惊&#xff0c;一款体量这么小的游戏为什么动辄就要几万块甚至十几万&#xff1f; 我来给你们说分析一下原因&#xff0c;这种游戏如果脱离开直播间&#xff0c;可以…

算法通关村第五关-黄金挑战LRU问题

大家好我是苏麟 , 今天聊聊LRU问题 , 相信学过操作系统的小伙伴并不陌生 . LRU问题 LRU的含义 LRU是Least Recently Used的缩写&#xff0c;即最近最少使用&#xff0c;是一种常用的页面置换算法&#xff0c;选择最近最久未使用的页面予以淘汰。 图解 : 如果再有其他元素就依…

ST表与RMQ(倍增表)

【概述】 RMQ : Range Maximum/minimum Query 这就是指区间最大或最小值&#xff08;区间最值&#xff09; ST表&#xff1a;Spars Table&#xff0c;一种可以解决 RMQ 的&#xff0c;基于倍增的数据结构&#xff0c;利用 ST 算法预处理打出的表&#xff0c;称为 ST 表。 …

EMC Unity存储系统如何查看SSD的使用寿命

为什么要写这个博客&#xff1f; 客户对老的EMC unity的存储系统要扩容&#xff0c;如何确定SSD磁盘是全新的还是拆机二手的&#xff1f;很多时候客户还有一个奇葩的要求&#xff0c;就是要和5年前的磁盘PN一致&#xff0c;甚至要求固件版本一致&#xff0c;最关键的还要求是全…