大语言模型微调

本文介绍大语言模型的微调,包括全参数微调和使用LoRA的参数高效微调方法,采用HuggingFace实现,最后通过一个具体的证件关键信息提取实例对本文方法进行应用,当然也可以用到别的任务上去,使用的LLM是EleutherAI的pythia系列模型以及Llama3-8b(也可以使用其他模型)。

通过本文可以学习到:

  1. 如何准备微调大语言模型(LLM)的数据集、指令微调数据集格式

  2. 什么是tokenization以及如何使用tokenizer

  3. 如何批量加载数据

  4. 如何采用Huggingface的Transformers库实现LLM的全参数微调和LoRA高效微调

  5. 在资源有限的情况下如何使用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%免费】🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员二飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值