本文介绍大语言模型的微调,包括全参数微调和使用LoRA的参数高效微调方法,采用HuggingFace实现,最后通过一个具体的证件关键信息提取实例对本文方法进行应用,当然也可以用到别的任务上去,使用的LLM是EleutherAI的pythia系列模型以及Llama3-8b(也可以使用其他模型)。
通过本文可以学习到:
-
如何准备微调大语言模型(LLM)的数据集、指令微调数据集格式
-
什么是tokenization以及如何使用tokenizer
-
如何批量加载数据
-
如何采用Huggingface的Transformers库实现LLM的全参数微调和LoRA高效微调
-
在资源有限的情况下如何使用bitsandbytes量化参数以便于微调较大的LLM
同时每部分都提供录制视频,通过notebook一行行敲代码实现,即使没有接触过LLM也没有任何难度。
预备知识
为了照顾初学者更加顺畅地理解后面内容,可以先了解一下几个预备知识:tokenization、嵌入层、pytorch中的Dataset和DataLoader,如果对这部分已经很熟悉了,可以直接跳过进入后续章节。
Tokenization
其作用是将文本分割成更小的单元,这些单元通常是单词、短语或符号,这个过程被称为分词(tokenization)。在不同的上下文中,Tokenizer可以有不同的形式和功能。
-
分词:将文本字符串分割成一系列的词元(tokens),词元可以是单词、短语、符号或其他语言单位。
-
词元化:是分词的过程,通过这个过程,文本被转换成一系列可以被计算机处理的词元。
-
词元:分词后得到的单个元素,是文本分析的基本单位。
下面这个视频演示了如何使用Huggingface的Transformers库进行Tokenize操作。
Dataset&DataLoader
pytorch提供了非常简便的数据处理方法,主要有Dataset、DataLoader(包括sampler、collate_fn等),其中Dataset类主要有三个方法:__init__、len__和__getitem__,分别用来初始化、计算数据集长度(可以调用len())和取出给定索引的数据,只返回一个样本。
DataLoader获取给定batch size大小的数据,其中sampler定义采样策略,collate_fn实现batch数据的聚合和处理方式。通常情况下,只需要自定义Dataset,DataLoader使用默认设定即可,但本例在微调LLM时为了获取batch size大于1的批量数据需要修改一下collate_fn,主要有以下原因:
-
每条文本长度不一,通过tokenizer得到的token长度不一,如果批大小为1则没有问题,当batch size不为1时不同长度的张量无法垂直拼接。
-
虽然可以将每个tokenized后的张量填充到最大长度,但是会十分冗余。
解决方法就是,Dataset返回原始文本,通过collate_fn对整批文本进行tokenize操作,填充到当前batch的最大长度,大部分batch的最大长度是小于整体最大长度的。
下面视频演示Dataset、DataLoader的应用,以及如何通过自定义collate_fn函数实现批量操作。
Embedding/嵌入层
嵌入层接受的输入张量大小为(B, T), 其中B是批大小,T是步长,也就是序列长度,这也是通过tokenize之后得到的格式;通过嵌入层(embedding)得到的张量大小为(B, T, Emb_size),即将用一个整数表示的token转换为长度为Emb_size的向量,比如下面这个模型中Embedding层的词典大小为50304,向量长度为1024。
下图是Llama 3 8b的模型结构:
下面的视频演示了Embedding层的输入输出数据的大小。
全量参数微调
本节介绍如何使用Transformers的Trainer进行大语言模型全量参数的微调,Pythia系列模型参数量从14M到12B(如下图),可以先在少量参数的模型上进行调试,代码没有问题再切换为更大的模型,非常方便扩展和探索性开发。
首先看一下数据集格式,用于LLM指令微调的数据集与预训练数据集不一样,指令微调需要输入输出或者提问和回答的格式。比如本文方法应用于证件关键信息提取的任务上,输入文本是通过OCR得到的文本框和文本内容,输出结果是JSON格式,通过Jsonlines进行存储,每一行是一个字典,定义了输入和输出。
jsonl格式文件可以通过jsonlines操作。
也可以直接通过json进行操作。
同时可以提供指令模板,将输入和输出嵌入其中,如下图是在KIE中的例子:
最后的text就是模型的输入文本了。
训练采用HuggingFace的Transformers库,通过TrainingArguments指定训练参数,实例化Trainer就可以调用train进行训练,极大的方便。也可以使用trl库的SFTTrainer,SFTTrainer是专门为监督学习微调模型设计的,继承自Trainer。关于两者的区别如下图:
关于全量参数微调的演示视频和下面将要介绍的PEFT+BNB参数高效微调方法是一起的,所以,介绍完下面内容再附上。
使用LoRA高效参数微调
如果计算资源有限、数据量又不多或者模型比较大的情况,可以采用peft参数高效微调的方法,比如LoRA、Q-LoRA等等。
不过使用已有的库,不需要自己实现LoRA,直接配置就行;另外,如果模型过大或者想要提升训练速度,也可以采用量化操作,需要安装bitsandbytes,可以在加载模型和计算时使用精度更小的数据格式:
本文将综合LoRA和bitsandbytes使用,在证件KIE数据集上微调了多个版本的模型,比如Pythia 410M、Pythia 1B以及Llama3 8b。
Trainer可以打印训练的日志。
在Huggingface上部署了一个410M的demo,感兴趣可以尝试一下(示例数据通过google搜索然后OCR得到)。
下面的视频演示了如何进行全量参数和基于LoRA与bnb的高效参数优化方法,如何配置参数,每项参数的含义等等。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓