news 2026/5/8 10:36:27

大模型学习(二、使用lora进行微调)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型学习(二、使用lora进行微调)

目录

🧩 1. 什么是 SFT(Supervised Fine-Tuning)

(1)定义

(2)LOSS的数学表示

(3)一个真实的例子解释LOSS

2.什么是 LoRA(Low-Rank Adaptation)

(1)定义

3.示例代码

(1)数据集格式

(2)代码

(3)运行结果

(4)读取lora参数,重新进行模型推理


一、lora和SFT的介绍

🧩 1. 什么是 SFT(Supervised Fine-Tuning)

(1)定义

SFT = 监督微调
本质是:

用「输入 → 标准输出」对模型做有监督学习

形式:

用户:问题 AI:标准答案

训练目标:

特点:

  • 数据:成对的(prompt, answer)

  • loss:交叉熵

  • 和分类任务本质一样,只是输出是文本

👉 SFT 解决的是:
“模型该学什么行为?”

(2)LOSS的数学表示

语言模型的训练目标:

(3)一个真实的例子解释LOSS

这个输出的巴黎是标签。之后拿到对应标签模型输入的概率,之后log求和。

2.什么是 LoRA(Low-Rank Adaptation)

(1)定义

LoRA = 一种参数高效微调方法(PEFT)

核心思想:

❌ 不改原模型参数
✅ 只在部分层插入小矩阵并训练它们

数学上:
原本权重:

LoRA 改为:

3.示例代码

(1)数据集格式

{"system": "你是一个名为沐雪的可爱AI女孩子", "conversation": [{"human": "如何集中精力做一件事情", "assistant": "首当其冲的肯定是选择一个合适的地方啦,比如说图书馆之类的,如果你不想出去,那就找一个安静的地方吧。然后扔掉手机这类会让你分心的东西,或者关掉通知,确保你不会突然被打扰。明确你要做的事情,把它细化成分几步去完成,设置期限,任务完成之后放松放松。如果你感觉到累了不行了就去外面转转吧,喝一杯咖啡,思考让你停下来的地方,然后活力满满地继续接下来的工作。"}]}

(2)代码

from datasets import load_dataset from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model import torch import json # ==================================================== # ① 模型路径与数据路径 # ==================================================== model_dir = r"C:\Users\64292\Desktop\大模型学习\xiaozhi\weitiao\Qwen2.5-1.5B-Instruct" data_path = r"C:\Users\64292\Desktop\大模型学习\xiaozhi\weitiao\competition_train.jsonl" # ==================================================== # ② 加载数据集 # ==================================================== dataset = load_dataset("json", data_files=data_path) # ==================================================== # ③ 预处理函数:把 system + human 拼成 prompt # ==================================================== def format_example(example): conversations = example["conversation"] if not conversations or len(conversations) == 0: return None conv = conversations[0] system = example.get("system", "") human = conv.get("human", "") assistant = conv.get("assistant", "") # 构建输入与输出 prompt = f"系统:{system}\n用户:{human}\nAI:" output = assistant.strip() return {"prompt": prompt, "output": output} dataset = dataset.map(format_example) dataset = dataset.filter(lambda x: x["prompt"] is not None) # ==================================================== # ④ 加载分词器与模型 # ==================================================== tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_dir, torch_dtype=torch.float16, device_map="auto" ) # ==================================================== # ⑤ LoRA 配置(低显存训练) # ==================================================== lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) # ==================================================== # ⑥ Tokenize 函数 # ==================================================== def preprocess(example): text = f"{example['prompt']}{example['output']}" tokenized = tokenizer(text, truncation=True, padding="max_length", max_length=512) tokenized["labels"] = tokenized["input_ids"].copy() return tokenized tokenized_ds = dataset.map(preprocess, remove_columns=dataset["train"].column_names) # ==================================================== # ⑦ 训练配置 # ==================================================== args = TrainingArguments( output_dir="./qwen2.5-1.5b-lora-muxue", per_device_train_batch_size=1, gradient_accumulation_steps=8, learning_rate=2e-4, num_train_epochs=3, fp16=True, logging_steps=10, save_steps=200, save_total_limit=2, report_to="none" ) # ==================================================== # ⑧ 训练启动 # ==================================================== trainer = Trainer( model=model, args=args, train_dataset=tokenized_ds["train"] ) trainer.train() # ==================================================== # ⑨ 保存权重 # ==================================================== model.save_pretrained("./qwen2.5-1.5b-lora-muxue") tokenizer.save_pretrained("./qwen2.5-1.5b-lora-muxue") print("✅ 微调完成!权重保存在 ./qwen2.5-1.5b-lora-muxue")

(3)运行结果

(4)读取lora参数,重新进行模型推理

from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel import torch # ① 原始模型路径(基础模型) base_model_dir = r"C:\Users\64292\Desktop\xiaozhi\weitiao\Qwen2.5-1.5B-Instruct" # ② LoRA 权重路径(你的微调结果) lora_dir = r"./qwen2.5-1.5b-lora-muxue" # ③ 加载分词器 print("🚀 正在加载分词器和模型...") tokenizer = AutoTokenizer.from_pretrained(lora_dir, trust_remote_code=True) # ④ 加载基础模型 base_model = AutoModelForCausalLM.from_pretrained( base_model_dir, torch_dtype=torch.float16, device_map="auto" ) # ⑤ 加载 LoRA 微调权重 model = PeftModel.from_pretrained(base_model, lora_dir) model.eval() print("✅ 已加载 Qwen + LoRA 微调权重(人格:沐雪)!\n") # ⑥ 设定人格系统提示词 system_prompt = "你是一个名为世君同学的可爱AI女孩子,性格温柔、活泼、善解人意,说话要自然可爱。" chat_history = f"系统:{system_prompt}\n" # ⑦ 聊天循环 while True: user_input = input("👤 你:").strip() if user_input.lower() in ["exit", "quit", "q"]: print("👋 沐雪:再见呀~记得想我哦 💖") break # 将用户输入加入上下文 chat_history += f"用户:{user_input}\nAI:" # 编码输入 inputs = tokenizer(chat_history, return_tensors="pt").to(model.device) # 模型生成 outputs = model.generate( **inputs, max_new_tokens=200, temperature=0.7, top_p=0.9, do_sample=True, pad_token_id=tokenizer.eos_token_id ) # 解码生成文本 reply = tokenizer.decode(outputs[0], skip_special_tokens=True) # 提取模型新增部分(去掉历史) new_text = reply[len(chat_history):].strip() # 输出结果 print(f"🤖 沐雪:{new_text}\n") # 更新上下文 chat_history += new_text + "\n"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 10:41:15

springboot智慧乡村治理平台系统设计实现

背景分析 随着乡村振兴战略的推进,传统乡村治理模式面临信息孤岛、管理效率低、公共服务不均衡等问题。数字技术如物联网、大数据、云计算的发展为乡村治理现代化提供了技术支撑。SpringBoot作为轻量级Java框架,以其快速开发、微服务支持等特性&#xf…

作者头像 李华
网站建设 2026/5/3 4:29:15

云端开发环境的终局猜想:DevBox模式会一统江湖吗

当你打开 VS Code 连上云端环境那一刻,背后已经有三四家公司在分你这单生意的蛋糕了。云端开发环境这条赛道,明面上是技术之争,暗地里是一场商业模式的豪赌。钱从哪来,流向何处传统开发模式下,开发者的钱主要流向两个地…

作者头像 李华
网站建设 2026/5/5 11:35:34

springboot以岗位胜任力为导向的医疗护理培训管理系统

背景分析医疗护理行业对从业人员的专业素养和岗位胜任力要求极高,传统的培训管理方式存在以下痛点:培训内容碎片化:缺乏系统化设计,难以针对不同岗位(如护士、护师、专科护士)定制差异化能力提升方案。效果…

作者头像 李华
网站建设 2026/5/5 11:34:52

P14967 Watching the Moon题解

P14967 Watching the Moon 题目背景 月光渐淡,漫野银辉化作露; 黎明终至,冲天赤色破开云。 题目描述 lhb 喜欢观测星空。有一天 zxh 想要用 lhb 的望远镜观测星空,lhb 掏出了他的数学作业,让 zxh 解出来才能用。 求&am…

作者头像 李华
网站建设 2026/5/5 0:41:42

一道“fork + 短路求值”经典题:到底会创建多少个进程?

问题描述 代码如下(不算 main 进程本身,问总共创建了多少个子进程): int main(int argc, char* argv[]) {fork();fork() && fork() || fork();fork(); }选项:A.18 B.19 C.20 D.21先把结论放前面 程序最终一…

作者头像 李华
网站建设 2026/5/5 0:41:13

Vite + Vue3 + TS 封装阿里图标 SVG 全局组件

在 Vite Vue3 TS 项目中,封装阿里图标(Iconfont)为全局 SVG 组件的最佳实践是使用 vite-plugin-svg-icons 插件。这种方式可以将本地下载的 SVG 图标自动打包成 SVG 雪碧图(Sprite),方便维护且性能优异。…

作者头像 李华