预训练大模型在训练过程中,虽然学到了很多通用知识,但是很多时候,大模型本身并不能在专业领域表现得非常好。
比如你让 Qwen 模型回答“量子力学中的叠加态是什么”,它可能会给出一个笼统的解释。
但要是让模型严格按照某一格式(比如论文格式)回答时,可能就不太行。
除非你在上下文聊天中给他一些例子让他先自我学习。
这也被称为“上下文学习能力 + Few-shot”的方式,但这并不改变模型的本质。
一旦你切换了与模型聊天的上下文,模型又会恢复到它原来的样子。
因此,对这种需要改变模型回答模式的需求,我们一般对预训练模型进行微调。
这是因为微调“真正的”会改变模型的参数。
大模型微调的方法有很多。
比如“全参数微调”、Lora及各种Lora的变种、P-Tuning 等等。
但大部分情况下我们都会使用 LoRA 的技术方法对模型进行微调。
这是因为 Lora 只会改变模型原有参数的“一部分”,并且改变的是比较对模型表现比较重要的部分,并且取得非常不错的结果。
如下图,微调只会修改全部参数中的部分参数。
这样做的好处之一,就是节省资源。
和全参数微调那种模型的所有参数都要更新不同的是,LoRA 只会更新模型中一小部分参数。
比如原本0.5亿参数的模型,Lora 微调时可能只需要更新几千个参数。
这样就会是的微调过程中对显存的依赖非常低,即使是普通开发者也能玩一玩 Lora 微调。
这篇文章,我假定你对 Lora 微调的技术背景有了一定的认识。
如果你还不懂 Lora 的技术细节,欢迎关注下面的📌AI 学习路线图:从小白到大神的爬天梯之路中的“微调小课”。
在这个路线图中,还有完整的 Transformer 架构的原理解析和《从零手写大模型(炸裂实战)》,都会帮助你更好的学习和理解微调技术。
这篇文章我将带你从头开始,以代码实战的方式,使用 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"
# 加载本地模型(路径要根据你的实际情况修改哦)
# 如果你本地没有模型,可以直接将这句话改为 model_name = "Qwen/Qwen2-0.5B"
# 这样会从 Hugging Face 上自动下载模型
model_name = "/mnt/workspace/.cache/modelscope/models/Qwen/Qwen2-0.5B"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
这段代码的作用是加载模型和分词器。
AutoModelForCausalLM
这是 Hugging Face transformers 库提供的函数,专门用于加载因果语言模型(即逐词生成文本的模型)。
AutoTokenizer
负责将文本转换成模型能理解的 token id。
这里我们选择本地路径加载模型,是因为直接从互联网下载模型可能遇到网络问题,本地加载更快也更稳定。
device
变量会检测你的计算机是否有GPU,有就用GPU加速,没有就用CPU。
为什么选择Qwen2-0.5B?
因为它参数量只有0.5亿,比其他规模参数的Qwen大模型小很多,适合资源有限的场景。
如果你有GPU且GPU很给力(内存足够),你也可以选择其他规模的模型来进行微调,还有一个原因是 Qwen 是阿里推出的大模型,对中文语句的理解会更精准。
第二步:加载数据集,格式化数据
接下来,我们准备微调需要的数据集,这里用的是 alpaca_zh 数据集。
这个数据集是一个中文版本的指令微调数据集,通常用于训练或微调大语言模型(LLMs),使其能够更好地理解和执行中文指令。
这个数据集是基于英文的 Alpaca 数据集翻译和改编而来的。
它包含了很多“指令→输入→输出”的三元组问答对,比如:
-
指令:解释量子力学中的叠加态
-
输入:无
-
输出:叠加态是指量子系统同时处于多个状态的组合,直到被观测时才会坍缩到一个确定状态……
加载并格式化数据集的代码如下:
from modelscope.msdatasets import MsDataset
# 加载数据集
dataset = MsDataset.load("llamafactory/alpaca_zh", subset_name="default").to_hf_dataset()
# 将数据拼接成统一格式:
# "Instruction: [用户指令]\nInput: [输入]\nOutput: [输出]"
dataset = dataset.map(
lambda example: {
"text": f"Instruction: {example['instruction']}"
+ (f"\nInput: {example['input']}" if example['input'] else "")
+ f"\nOutput: {example['output']}"
}
)
这段代码做了两件事:
加载数据集
通过MsDataset.load()
从ModelScope平台加载中文指令数据集alpaca_zh,并转换成Hugging Face的格式,方便后续处理。
当然你也可以使用 transformers 库从 huggingface 上下载数据集。
格式化数据
通过map()
函数遍历每条数据,将指令、输入和输出拼接成统一格式的字符串。
例如,如果一条数据的输入为空(比如用户直接问“讲个笑话”),则只保留“Instruction”和“Output”部分,但整体格式保持一致。
这能让模型明确学习到“看到某个指令和输入后,生成对应的输出”。
为什么选择alpaca_zh数据集?
因为它专门用于“指令对齐”,教模型按照用户给定的格式回答问题。
比如,用户希望模型严格按照“Output: ...”的格式输出答案,而不是随意发挥。
此外,这个数据集是中文社区优化的,更适合国内用户的提问习惯。
第三步:数据处理和分词
分词是把文本转换为 token ID 的过程。比如把“量子力学”变成 [2345, 6789, ...]
。
代码如下:
# 只用1%的数据快速验证(正式使用时可以改成100%)
len_data = int(0.01 * len(dataset))
train_size = int(0.8 * len_data)
train_dataset = dataset.select(range(train_size))
eval_dataset = dataset.select(range(train_size, len_data))
# 分词处理,截断到512个token
train_dataset = train_dataset.map(
lambda examples: tokenizer(
examples["text"], truncation=True, padding="max_length",
max_length=512
),
batched=True, remove_columns=["text"]
)
这段代码分为两个部分:
数据分割
将数据集分成训练集(80%)和验证集(20%)。
这里只用了原始数据 1% 的数据,是为了快速验证代码逻辑。实际使用时建议用全部数据,但需要确保显存足够。
分词与填充
通过tokenizer()
将文本转换为 token ID。
truncation=True 表示如果文本超过512个token(约100-200字),就截断到512。
padding="max_length" 表示用特殊符号填充到512长度,确保所有输入长度一致。这能让模型在训练时批量处理数据,提升效率。
remove_columns=["text"] 是删除原始文本列,只保留分词后的数值数据。
为什么只用1%的数据?
因为完整数据集可能有成千上万条,微调需要时间。
这里用小数据先跑通流程,再用全量数据进行训练效果会更好。
此外,如果显存较小(比如8GB GPU),小数据集也能避免爆显存。
第四步:配置LoRA,开始微调
现在,我们开始配置 LoRA 参数并开始训练!
from peft import LoraConfig
# 设置LoRA参数
peft_config = LoraConfig(
r=8,
# 低秩矩阵的秩,控制参数量
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
# 修改注意力层的Q/V矩阵
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM" )
# 将LoRA应用到模型
model = get_peft_model(model, peft_config)
这段代码配置了 LoRA 的关键参数:
r=8
这是 Lora 技术中低秩分解的“秩”。
数值越大,需要修改的模型参数就越多,微调效果理论上越好,但计算成本也会越高。
8是一个大众经验的平衡点,既能保证效果,又不至于太耗资源。当然你也可尝试其他值。
target_modules=["q_proj", "v_proj"]
表示选择模型中对任务影响最大的模块——注意力层的Q(Query)和V(Value)矩阵。
这些模块决定了模型如何“关注”输入中的关键信息。
例如,当模型处理“量子力学”问题时,Q帮助它关注关键词,V决定如何生成回答。
这里没有微调 K 矩阵,也是根据大部分人的经验得来的。
很多实验表明,K矩阵对于模型最终输出的效果影响不大,因此可以不对其进行微调。
当然,你也可以在上述代码中添加 k_proj 来启动 K 矩阵的微调。
task_type="CAUSAL_LM"
指定任务类型为因果语言模型,确保 LoRA 参数适配生成任务。
通过get_peft_model()
将LoRA配置应用到原始模型,此时模型中只有LoRA的参数是可训练的,其他参数保持冻结。
这样既能节省显存,又能加速训练。
第五步:训练与保存模型
from transformers import Trainer, TrainingArguments
# 设置训练参数
training_args = TrainingArguments(
output_dir="./output",
num_train_epochs=1, # 先跑1个epoch测试
per_device_train_batch_size=4, # 根据显存调整,8GB建议4,16GB可以调到8
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True # 保存效果最好的模型
)
# 启动训练!
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset
)
trainer.train()
# 保存模型
trainer.save_model("./final_model")
这段代码展示了完整的模型训练过程的参数配置和流程:
num_train_epochs=1
这里设置训练只跑1个epoch(遍历数据集一次)。
对于小数据集来说,1个epoch足够测试流程是否正确,正式训练时可以增加到3-5个甚至更多的 epoch。
per_device_train_batch_size=4
每个 GPU 设备的批量大小。批量越大,显存占用越高,但训练速度可能更快。
如果你的显存不够,可以将这个值降低到 2 甚至 1。
evaluation_strategy="epoch"
每完成一个 epoch 后评估模型效果。
load_best_model_at_end=True
训练结束后自动加载验证集表现最好的模型,避免手动选择。
通过Trainer.train()
启动模型的训练。
启动训练后,模型会开始根据微调数据集中的回答样式,学习如何生成正确的输出。
最后通过save_model()
保存微调后的 LoRA 参数。
注意此时保存的仅仅是 LoRa 参数,而不是整个微调后的模型,用来节省存储空间,你可以认为这个 Lora 参数是一个微调后的“补丁”。
第六步:测试模型效果
# 加载微调后的模型
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained(model_name)
new_model = PeftModel.from_pretrained(base_model, "./final_model")
new_model.to(device)
# 让模型回答问题
prompt = "可再生能源的存在对环境有什么影响?"
text = f"Instruction: {prompt}\nOutput: "
inputs = tokenizer([text], return_tensors="pt").to(device)
output = new_model.generate(inputs.input_ids, max_new_tokens=200)
answer = tokenizer.batch_decode(output, skip_special_tokens=True)[0]
print(f"问题:{prompt}\n回答:{answer}")
这段代码演示了如何加载微调后的模型并生成回答:
加载模型
首先加载原始 Qwen2-0.5B 模型,再通过PeftModel.from_pretrained()
合并 LoRA 参数,这就给原始模型打上了补丁。
生成回答
输入一个指令(如“可再生能源的影响”),通过generate()
生成文本。max_new_tokens=200
限制生成长度,避免输出过长。
使用“原始模型+微调补丁”产生的新模型进行对话,你会发现模型的回答方式就和微调数据集中的非常相似了。
此时就说说明你已经通过微调的方式,调整了模型的回答样式。
通过这篇文章,你已经完成了模型微调的全流程。
一、大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
二、如何学习大模型 AI ?
🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(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%免费】