预训练大模型在训练过程中,虽然学到了很多通用知识,但是很多时候,大模型本身并不能在专业领域表现得非常好。
比如你让 Qwen 模型回答“量子力学中的叠加态是什么”,它可能会给出一个笼统的解释,但要是让模型严格按照某一格式(比如论文格式)回答时,可能就不太行。
除非你在上下文聊天中给他一些例子让他先自我学习。这也被称为“上下文学习能力 + Few-shot”的方式,但这并不改变模型的本质。
一旦你切换了与模型聊天的上下文,模型又会恢复到它原来的样子。
因此,对这种需要改变模型回答模式的需求,我们一般对预训练模型进行微调。
这是因为微调“真正的”会改变模型的参数。
大模型微调的方法有很多,比如“全参数微调”、Lora及各种Lora的变种、P-Tuning 等等。但大部分情况下我们都会使用 LoRA 的技术方法对模型进行微调。
这是因为 Lora 只会改变模型原有参数的“一部分”,并且改变的是比较对模型表现比较重要的部分,并且取得非常不错的结果。
如下图,微调只会修改全部参数中的部分参数。
这样做的好处之一,就是节省资源。
和全参数微调(事实上类似于从中间某个检查点(checkpoint) 进行训练)那种模型的所有参数都要更新不同的是,LoRA 只会更新模型中一小部分参数(比如原本0.5亿参数的模型,Lora 微调时可能只需要更新几千个)。
这样就会是的微调过程中对显存的依赖非常低,即使是普通开发者也能玩一玩 Lora 微调。
这篇文章,我假定你对 Lora 微调的技术背景有了一定的认识,如果你还不懂 Lora 的技术细节,欢迎关注📌AI 学习路线图:从小白到大神的爬天梯之路 中的“微调小课”,另外在这个路线图中,还有完整的 Transformer 架构的原理解析和《4、从零手写大模型(炸裂实战)》,都会帮助你更好的学习和理解微调技术。
这篇文章我将带你从头开始,以代码实战的方式,使用 Qwen2-0.5B 模型和中文指令数据集 alpaca_zh,手把手教你如何微调模型。
希望阅读完本文后,你可以了解微调的原理,并且真正能自己动手完成实战!(PS:本文代码实操时最好有一块可用的GPU卡,不然如果用CPU的话,要等多久可能只有天知道了。)
下面我将边讲解相关知识,边展示关键代码并对其进行解释。
第一步:准备环境,加载模型
首先,我们需要加载Qwen2-0.5B模型,并准备好后续要用的工具。代码如下:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
# 检测设备(优先用GPU加速)
device = "cuda" if torch.cuda.is_available() else "cpu"
# 加载本地模型ÿ