本文详细介绍了如何使用LoRA技术对通义千问3.5-2B模型进行轻量级微调,适合新手入门大模型微调,并支持消费级显卡。文章从项目概述、环境准备、模型加载、数据集准备、Tokenizer数据处理、LoRA微调配置、训练参数设置、模型保存与加载等方面进行了全面阐述,并提供了可直接复制的代码示例。通过本文的指导,读者可以快速掌握大模型微调的全流程,并根据自己的需求进行模型优化和应用部署。


本文将完整带你走通通义千问3.5-2B模型的LoRA微调全流程,代码可直接复制运行,适合新手入门大模型微调,消费级显卡。

一、项目概述与环境准备

**1.**项目目标

我们将使用**LoRA****(Low-Rank Adaptation)**技术对Qwen/Qwen3.5-2B进行轻量级微调,在保留模型通用能力的同时,让它适配特定任务(如对话、知识问答)。

**2.**核心依赖安装

# 安装核心依赖
pip install -q transformers datasets peft accelerate bitsandbytes torch sentencepiece

**3.**关键库说明

•transformers: 加载模型与Tokenizer

•peft: 实现LoRA微调

•bitsandbytes: 4/8位量化,节省显存

•accelerate: 分布式训练加速

•datasets: 处理自定义数据集

二、加载模型与****Tokenizer

**1.**加载量化模型

import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
)
# 4位量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
model_name = "Qwen/Qwen3.5-2B"
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
# 加载Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

**2.**测试模型基础能力

# 简单测试
prompt = "你好,介绍一下你自己。"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(
**inputs,
max_new_tokens=200,
temperature=0.7,
do_sample=True
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

三、准备自定义数据集

**1.**数据集格式

我们使用对话格式数据集,也可以通过大模型输出结构化数据结构的数据集,示例如下:

[
{
"instruction": "请解释什么是LoRA微调?",
"input": "",
"output": "LoRA(Low-Rank Adaptation)是一种轻量级微调技术,通过在模型Transformer层插入低秩矩阵,仅训练少量参数即可适配新任务,大幅降低显存占用和训练成本。"
},
{
"instruction": "写一段关于春天的短句",
"input": "",
"output": "春风拂过,柳丝轻摇,暖阳洒在刚冒芽的青草上,万物都在温柔地苏醒。"
}
]

**2.**加载与预处理数据集

from datasets import load_dataset
# 加载本地JSON数据集(替换为你的文件路径)
dataset = load_dataset("json", data_files="custom_data.json")
# 数据格式化函数
def format_prompt(sample):
return f"""<|im_start|>user
{sample['instruction']} {sample['input']}<|im_end|>
<|im_start|>assistant
{sample['output']}<|im_end|>"""
# 应用格式化
dataset = dataset.map(lambda x: {"text": format_prompt(x)})

**3.**划分训练集与测试集

dataset = dataset["train"].train_test_split(test_size=0.1)
train_dataset = dataset["train"]
eval_dataset = dataset["test"]

四、Tokenizer数据处理

def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
max_length=512,
padding="max_length"
)
# 对数据集进行Token化
tokenized_train = train_dataset.map(tokenize_function, batched=True, remove_columns=["text"])
tokenized_eval = eval_dataset.map(tokenize_function, batched=True, remove_columns=["text"])
# 设置标签(与输入ID一致,用于语言建模)
tokenized_train.set_format("torch", columns=["input_ids", "attention_mask", "labels"])
tokenized_eval.set_format("torch", columns=["input_ids", "attention_mask", "labels"])
tokenized_train = tokenized_train.map(lambda x: {"labels": x["input_ids"]})
tokenized_eval = tokenized_eval.map(lambda x: {"labels": x["input_ids"]})

五、LoRA微调配置

from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8,                     # 秩
lora_alpha=32,           # 缩放因子alpha 一般设置为 r 的 4 倍
target_modules=["q_proj", "v_proj"],  # 目标模块
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
# 包装模型为LoRA模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # 查看可训练参数比例

参数含义:

1. r=8 → 秩(Rank)
通俗意思:
LoRA 矩阵的大小,决定你训练多少新知识
作用:
LoRA 不训练全模型,只训练两个小矩阵
r 就是这两个小矩阵的 “宽度”
r 越大 → 学的越多 → 占显存越大 → 训练越慢
r 越小 → 学的越少 → 轻量化、快、稳
常用值:
轻量对话:4, 8(推荐)
复杂任务:16, 32, 64
新手建议:
直接用 r=8 最稳、最快、最省显存
2. lora_alpha=32 → 缩放因子(Scaling)
通俗意思:
LoRA 学习强度 = 学习力度旋钮
作用:
控制 LoRA 权重对原模型的影响强度
alpha 越大 → LoRA 影响越强
alpha 越小 → 越柔和
经验规则(非常重要):
alpha 一般设置为 r 的 4 倍
r=8 → alpha=32
r=16 → alpha=64
r=4 → alpha=16
新手建议:
跟着 r 走就行,不用乱改
3. target_modules=["q_proj", "v_proj"] → 训练目标模块
通俗意思:
你要对模型的哪些 “神经层” 动手微调
作用:
Transformer 里最重要的层是:
q_proj
k_proj
v_proj
out_proj /
o_proj
为什么常用
q_proj, v_proj?
因为这两个层效果最好、最稳定、训练最快
几乎所有开源模型(LLaMA、Qwen、GLM)都用这两个。
想更强可以全开:
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"]
新手建议:
默认 q_proj + v_proj 足够用
4. lora_dropout=0.05 → 随机失活
通俗意思:
防止过拟合(防止模型死记硬背训练集)
作用:
训练时随机 “关掉” 5% 的 LoRA 神经元,让模型更健壮、不背答案。
常用值:
0.05 ~ 0.1
新手建议:
0.05 最稳,不用改
5. bias="none" → 偏置项是否训练
通俗意思:
是否训练模型里很小的偏置参数(基本没用)
三个选项:
"none":不训练(最快、最常用)
"all":全部训练(没必要)
"lora_only":只训练 LoRA 相关的 bias
新手建议:
直接用 none
6. task_type="CAUSAL_LM" → 任务类型
通俗意思:
告诉 PEFT 你在做什么任务
任务类型:
CAUSAL_LM:因果语言模型(对话、续写、聊天)
SEQ_2_SEQ_LM:翻译、摘要
TOKEN_CLS:分类
QUESTION_ANS:问答
我们微调 Qwen 对话模型 → 必须用:
CAUSAL_LM

超简记忆口诀(新手必背)

  • r=8 → 学多少
  • alpha=32→ 学习力度
  • q_proj, v_proj → 微调核心层
  • dropout=0.05→ 防止过拟合
  • bias=none→ 不动小参数
  • CAUSAL_LM→ 对话任务

六、设置训练参数并启动训练

from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling
training_args = TrainingArguments(
output_dir="./qwen3.5-2b-lora",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
num_train_epochs=3,
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch",
fp16=True,
optim="paged_adamw_8bit",
report_to="none"
)
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_train,
eval_dataset=tokenized_eval,
data_collator=data_collator
)
# 开始训练
trainer.train()

七、保存与加载微调后的模型

1.保存LoRA****适配器

model.save_pretrained("./qwen3.5-2b-lora-final")
tokenizer.save_pretrained("./qwen3.5-2b-lora-final")

**2.**加载微调后模型并推理

from peft import PeftModel, PeftConfig
peft_config = PeftConfig.from_pretrained("./qwen3.5-2b-lora-final")
base_model = AutoModelForCausalLM.from_pretrained(
peft_config.base_model_name_or_path,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
fine_tuned_model = PeftModel.from_pretrained(base_model, "./qwen3.5-2b-lora-final")
# 测试微调效果
prompt = "<|im_start|>user\n请解释什么是LoRA微调?<|im_end|>\n<|im_start|>assistant\n"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = fine_tuned_model.generate(
**inputs,
max_new_tokens=300,
temperature=0.7,
do_sample=True
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

八、下一步计划与总结

**1.**下一步优化方向

•调整LoRA参数(r、alpha)提升效果

•尝试更大的数据集或多轮训练

•结合RLHF进一步对齐人类偏好

•部署为API服务或Web应用

**2.**核心总结

LoRA****优势:仅训练~0.1%参数,显存占用低,训练速度快

量化关键:4位量化让2B模型在单张消费级GPU上即可微调

流程闭环:从数据准备到模型推理,完整覆盖大模型微调全链路

假如你从2026年开始学大模型,按这个步骤走准能稳步进阶。

接下来告诉你一条最快的邪修路线,

3个月即可成为模型大师,薪资直接起飞。
img

阶段1:大模型基础

img

阶段2:RAG应用开发工程

img

阶段3:大模型Agent应用架构

img

阶段4:大模型微调与私有化部署

img

配套文档资源+全套AI 大模型 学习资料,朋友们如果需要可以微信扫描下方二维码免费领取【保证100%免费】👇👇
在这里插入图片描述
img

img

img

img
img

配套文档资源+全套AI 大模型 学习资料,朋友们如果需要可以微信扫描下方二维码免费领取【保证100%免费】👇👇

在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐