干货 大模型LLM-微调经验分享总结_chatglm-6b alpaca-chinese数据集微调

导读

本文总结了作者在ChatGLM-6B模型微调的经验,并汇总了目前开源项目&数据。

写在前面

大型语言模型横行,之前非常焦虑,现在全面拥抱。目前也有很多开源项目进行大模型微调等,笔者也做了一阵子大模型了,特此来介绍一下ChatGLM-6B模型微调经验,并汇总了一下目前开源项目&数据。笔者与很多人微调结论不同,本人在采用单指令上进行模型微调,发现模型微调之后,「并没有出现灾难性遗忘现象」

项目地址:https://github.com/liucongg/ChatGLM-Finetuning

ChatGLM-6B模型微调

模型越大对显卡的要求越高,目前主流对大模型进行微调方法有三种:Freeze方法、P-Tuning方法和Lora方法。笔者也通过这三种方法,在信息抽取任务上,对ChatGLM-6B大模型进行模型微调。为了防止大模型的数据泄露,采用一个领域比赛数据集-汽车工业故障模式关系抽取(https://www.datafountain.cn/competitions/584),随机抽取50条作为测试集。

详细代码见上面的GitHub链接,并且也被ChatGLM官方收录。

Freeze方法

Freeze方法,即参数冻结,对原始模型部分参数进行冻结操作,仅训练部分参数,以达到在单卡或不进行TP或PP操作,就可以对大模型进行训练。

微调代码,见finetuning_freeze.py,核心部分如下:

for name, param in model.named_parameters():  if not any(nd in name for nd in ["layers.27", "layers.26", "layers.25", "layers.24", "layers.23"]):  param.requires_grad = False  

针对模型不同层进行修改,可以自行修改。训练代码均采用DeepSpeed进行训练,可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text等,可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_freeze.py --num_train_epochs 5 --train_batch_size 2  

三元组抽取的推理代码,见predict_freeze.py,其他任务可以根据自己的评价标准进行推理预测。

PT方法

PT方法,即P-Tuning方法,参考ChatGLM官方代码(https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md) ,是一种针对于大模型的soft-prompt方法。

  • P-Tuning(https://arxiv.org/abs/2103.10385),仅对大模型的Embedding加入新的参数。

  • P-Tuning-V2(https://arxiv.org/abs/2110.07602),将大模型的Embedding和每一层前都加上新的参数。

微调代码,见finetuning_pt.py,核心部分如下:

config = ChatGLMConfig.from_pretrained(args.model_dir)  
config.pre_seq_len = args.pre_seq_len  
config.prefix_projection = args.prefix_projection  model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir, config=config)  for name, param in model.named_parameters():  if not any(nd in name for nd in ["prefix_encoder"]):  param.requires_grad = False  

当prefix_projection为True时,为P-Tuning-V2方法,在大模型的Embedding和每一层前都加上新的参数;为False时,为P-Tuning方法,仅在大模型的Embedding上新的参数。

可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text、pre_seq_len、prompt_text等, 可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_pt.py --num_train_epochs 5 --train_batch_size 2 --pre_seq_len 16  

三元组抽取的推理代码,见predict_pt.py,其他任务可以根据自己的评价标准进行推理预测。

Lora方法

Lora方法,即在大型语言模型上对指定参数增加额外的低秩矩阵,并在模型训练过程中,仅训练而外增加的参数。当“秩值”远小于原始参数维度时,新增的低秩矩阵参数量很小,达到仅训练很小的参数,就能获取较好的结果。

  • Lora论文:https://arxiv.org/abs/2106.09685

  • 官方代码:https://github.com/microsoft/LoRA

  • HuggingFace封装的peft库:https://github.com/huggingface/peft

微调代码,见finetuning_lora.py,核心部分如下:

model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir)  
config = LoraConfig(r=args.lora_r,  lora_alpha=32,  target_modules=["query_key_value"],  lora_dropout=0.1,  bias="none",  task_type="CAUSAL_LM",  inference_mode=False,  )  model = get_peft_model(model, config)  

可设置参数包含train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir、prompt_text、lora_r等,可根据自己的任务配置。

CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_lora.py --num_train_epochs 5 --train_batch_size 2 --lora_r 8  

三元组抽取的推理代码,见predict_lora.py,其他任务可以根据自己的评价标准进行推理预测。

注意:对于结果需要保持一致的任务(即关掉dropout,解码关掉do_sample),需要保存模型的adapter_config.json文件中,inference_mode参数修改成false,并将模型执行model.eval()操作。主要原因是chatglm模型代码中,没有采用Conv1D函数。

三元组抽取实验结果

  • 模型训练时,最大长度为768,Batch大小为2,训练轮数为5,fp16训练,采用DeepSpeed的Zero-1训练;

  • PT为官方的P-Tuning V2训练方法,PT-Only-Embedding表示仅对Embedding进行soft-prompt,Freeze仅训练模型后五层参数,Lora采用低秩矩阵方法训练,秩为8;

  • 由于之前训练PT在48G-A40显卡上会出现OOM,因此之前进行PT实验时对模型开启了gradient_checkpointing_enable,使得模型显存占用变小,但训练时长增加。

  • 训练示例:

prompt_text:你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:  
输入:故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。  
输出:发动机_部件故障_水温高\n风扇_部件故障_低速转动  

时间换空间,可用很好的解决显卡的资源问题,简单玩玩还可以,如果想要模型达到最优效果或可用快速看到效果,还不如租张A100卡,快速实验,推理阶段再用自己的小破卡。

笔者找到一家新的算力平台-揽睿星舟,单张A100仅要6.4元/小时,我翻了一圈,算是便宜的了(反正比AutoDL便宜一点,便宜一点是一点吧)。

下面实验结果均是在租的80G-A100上进行的实验,与Github里用的A40的实验结果会有些差异,主要在训练时长(纯训练速度,剔除模型保存的时间)。说实话,真的要训练一个大模型,多个A100是必不可少的,可以减少很多模型并行的操作,效果上也更好把控一些。

微调方法PT-Only-EmbeddingPTFreezeLora
显卡占用37G56G24G39G
总参数6.259B7.211B6.255B6.259B
可训练参数占比0.0586%13.26%16.10%0.0586%
训练耗时20min52min46min25min
测试结果F10.00.62830.56750.5359

结果分析:

  • 效果为PT>Freeze>Lora>PT-Only-Embedding;

  • 速度为PT-Only-Embedding>Lora>Freeze>PT;

  • PT-Only-Embedding效果很不理想,发现在训练时,最后的loss仅能收敛到2.几,而其他机制可以收敛到0.几。分析原因为,输出内容形式与原有语言模型任务相差很大,仅增加额外Embedding参数,不足以改变复杂的下游任务;

  • PT方法占用显存更大,因为也增加了很多而外参数;

  • 测试耗时,采用float16进行模型推理,由于其他方法均增加了额外参数,因此其他方法的推理耗时会比Freeze方法要高。当然由于是生成模型,所以生成的长度也会影响耗时;

  • 模型在指定任务上微调之后,并没有丧失原有能力,例如生成“帮我写个快排算法”,依然可以生成-快排代码;

  • 由于大模型微调都采用大量instruction进行模型训练,仅采用单一的指令进行微调时,对原来其他的指令影响不大,因此并没导致原来模型的能力丧失;

  • 上面测试仅代表个人测试结果。

很多同学在微调后出现了灾难性遗忘现象,但我这边并没有出现,对“翻译任务”、“代码任务”、“问答任务”进行测试,采用freeze模型,可以用test_forgetting.py进行测试,具体测试效果如下:

  • 翻译任务

  • 代码任务

  • 问答任务

后面会把生成任务、分类任务做完,请持续关注Github,会定期更新。(太忙了,会抓紧时间更新,并且官方代码也在持续更新,如遇到代码代码调不通的情况,请及时联系我,我在github也给出了我的代码版本和模型版本)

中文开源大模型&项目

虽然出来很多大模型,但Open的&中文可直接使用的并不多,下面对中文开源大模型、数据集和项目进行一下汇总。

中文开源大模型

直接可微调,无需指令增量训练:

  • ChatGLM-6B:https://huggingface.co/THUDM/chatglm-6b

  • ChatYuan-large-v2:https://huggingface.co/ClueAI/ChatYuan-large-v2

原始模型多语言or英文,需要中文指令数据集增量训练:

  • BloomZ:https://huggingface.co/bigscience/bloomz

  • LLama:https://github.com/facebookresearch/llama

  • Flan-T5:https://huggingface.co/google/flan-t5-xxl

  • OPT:https://huggingface.co/facebook/opt-66b

中文开源指令数据

下面中文指令集,大多数从Alpaca翻译而来,请看下面项目中data目录。目前通过ChatGPT或者GPT4作为廉价标注工为自己的数据进行数据标注一个不错的思路。

  • [1]:https://github.com/LC1332/Chinese-alpaca-lora

  • [2]:https://github.com/hikariming/alpaca_chinese_dataset

  • [3]:https://github.com/carbonz0/alpaca-chinese-dataset

  • [4]:https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM

  • [5]:https://github.com/LianjiaTech/BELLE

  • [6]:https://huggingface.co/datasets/JosephusCheung/GuanacoDataset

开源项目

总结下面较火的开源项目:

  • BELLE:https://github.com/LianjiaTech/BELLE

  • ChatGLM:https://github.com/THUDM/ChatGLM-6B

  • Luotuo-Chinese-LLM:https://github.com/LC1332/Luotuo-Chinese-LLM

  • stanford_alpaca:https://github.com/tatsu-lab/stanford_alpaca

总结

目前各大厂的大模型陆陆续续放出,堪称百家争鸣!个人玩家也是全面拥抱,想尽一切办法来训练微调大模型。只愿大家以后可以实现“大模型”自由。愿再无“model-as-a-service”。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费或点击下方蓝色字 即可免费领取↓↓↓

**读者福利 |** 👉2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享 **(安全链接,放心点击)**

在这里插入图片描述

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

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

相关文章

aspose如何获取PPT放映页“切换”的“持续时间”值

文章目录 项目场景问题描述问题1:从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2:aspose的依赖包中,所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混淆对象中的字段2、获取ppt切换的持续时间…

获取vue.config.js里代理的路径

vue.config.js 主要用于配置 Vue CLI 的构建和开发服务器选项,不能直接拿到里面的值,如果是自己重新写的config,引入到页面就可以拿到 下面说,我的解决办法,如果有更好的,一定要给我说啊 在public目录下创…

设计者模式之策略模式

前言 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都写在对象中,将会使对象变得异常复杂;而且有时候支持不频繁使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算…

分布式事务-SpringBoot集成Seata

1.本地事务和分布式事务概念 事务四大特性 原子性:事务不可再分一致性:数据改变前后,总量必须一致隔离性:事务之间相互隔离,互不干扰持久性:事务一旦提交,数据就会持久化到磁盘,不…

深入探讨钉钉与金蝶云星空的数据集成技术

钉钉报销数据集成到金蝶云星空的技术案例分享 在企业日常运营中,行政报销流程的高效管理至关重要。为了实现这一目标,我们采用了轻易云数据集成平台,将钉钉的行政报销数据无缝对接到金蝶云星空的付款单系统。本次案例将重点介绍如何通过API接…

【MATLAB源码-第200期】基于matlab的鸡群优化算法(CSO)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 鸡群优化算法(Chicken Swarm Optimization,简称CSO)是一种启发式搜索算法,它的设计灵感来源于鸡群的社会行为。这种算法由Xian-bing Meng等人于2014年提出,旨在解决…

优阅达携手 Aiven 亮相新加坡科技周,推动企业多云数据管理与开源技术创新

助力企业在任何云上提高数据管理效率,开发个性化的创新技术解决方案。 10 月中旬, 2024 年新加坡科技周在 Marina Bay Sands 盛大举行,吸引了超过 25,000 名科技领袖、500 多家参展商和 600 多位演讲者,共同展示了全球前沿的技术…

【AIGC】国内AI工具复现GPTs效果详解

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯前言💯本文所要复现的GPTs介绍💯GPTs指令作为提示词在ChatGPT实现类似效果💯国内AI工具复现GPTs效果可能出现的问题解决方法解决后的效果 &#x1…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

解决linux mint22安装VMware虚拟机报错

涉及版本范围 linux内核6.8x-6.9.x vmware版本17.5.2 解决办法 wget https://github.com/nan0desu/vmware-host-modules/archive/refs/heads/tmp/workstation-17.5.2-k6.9.1.zip unzip workstation-17.5.2-k6.9.1.zip cd vmware-host-modules-tmp-workstation-17.5.2-k6.9.1…

vue echarts左右间距调整 左右空白

咱就说这样的左右间距丑不丑。。 经过调整后,嗯,好看了很多。页面也协调多了! 直接上代码:添加以下配置数据: grid: {x: 50,y: 25,x2: 30,y2: 35 }, this.chart.setOption({width: 100%,xAxis: {show: false,type: ca…

基于梧桐数据库的实时数据分析解决方案

一、背景 在当今信息时代,数据的价值不言而喻。然而,处理海量数据并将其转化为有意义的洞察力是一项艰巨的任务。传统的数据处理方法已经无法满足我们日益增长的需求。为了满足这一挑战,实时数据处理系统应运而生。 ​ 实时数据处理系统是一…

一个git相关的cve:CVE-2024-32002

最近听说一个与自己相关的CVE, CVE-2024-32002 文章目录 前言Description二、PATCH总结 前言 cve git windows hook submodule 利用submodule和hook,实现对.git目录注入hook的目标。 影响windows和mac os下的大部分git版本。 提示:以下是本篇文章正文内…

电商API:开启电商新时代的关键钥匙

一、电商API:定义与发展 电商API,即应用程序编程接口,是连接不同软件系统的桥梁,在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代,当时电子商务刚刚兴起,企业开始意识到通过A…

科技成果跃然“屏”上,虚拟展厅引领科技展示新风尚

一、沉浸式互动体验增强吸引力 虚拟科技展厅利用虚拟现实等先进技术,为科技成果打造了一个沉浸式的展示空间。用户可以通过手机、平板、电脑等设备,身临其境地浏览科技成果,感受其独特魅力。与传统的线下展厅相比,虚拟展厅不受物…

Linux学习笔记

九月二十六号: 三种网络连接的区别: 克隆的虚拟机文件可以放在另一台电脑上一样使用 LINUX目录结构: 查看linux IP地址的指令: ifconfig 查看ens33对应的 通过Xshell输入reboot会使linux重启 vim使用: 关机&重启命令&用户登录和注销: 用户管理: pwd: 显示当前在哪个…

数字信号处理-FPGA插入不同误码率的模拟源

module data_error_injector (input clk, // 时钟信号,50MHzinput reset, // 复位信号,高有效input DIN_EN, // 数据输入使能,高有效input [7:0] ERROR_LEVEL, // 错误等级…

华为OD机试 - 学生排名(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

快速学习Django框架以开发Web API

简介 Django是一个高级Python Web框架,它鼓励快速开发和简洁实用的设计。由经验丰富的开发者构建,Django可以为你处理大量的Web开发任务,使你能够专注于编写应用的关键组件。Django的模块化设计、可复用性和广泛的社区支持,使其成为开发Web应用和API的理想选择。 在本文中…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台,通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力,为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验,今天笔者与您深入探讨 zCloud 在数据库…