Qwen3.5-4B微调实战:Unsloth高效训练方案
2026/6/7 17:23:32 网站建设 项目流程

上周帮一个朋友看他的微调项目,他想在医疗数据上训个问答模型。聊了半天发现他用的全参数微调,16GB显存直接跑爆,batch_size设为1还溢出了。

其实这杀鸡用牛刀,4B的模型用LoRA就够了,16GB显存绑绑有余。今天就把Qwen3.5-4B的完整微调流程整理出来,基于Unsloth框架,国内使用魔塔下载模型,速度比HuggingFace快很多。

硬件需求

先说显存问题,很多人卡在这一步。根据Unsloth官方数据,不同量化级别对显存的要求不一样:

  • 4-bit量化:仅需5.5GB显存,RTX 3060级别的卡都能跑
  • 6-bit量化:7GB显存,RTX 4060及以上
  • 8-bit量化:10GB显存,RTX 4070及以上
  • BF16精度:14GB显存,需要专业卡或高端游戏卡

Qwen3.5-4B原生支持262K上下文,通过YaRN技术可以扩展到1M。这个长度对于大多数垂直场景绑绑够用了。

Qwen3.5-4B有个特性值得注意:默认启用思考模式(Thinking Mode),会在最终回复前生成推理过程。如果想要即时响应,可以在调用时禁用思考模式。

环境配置:使用魔塔下载模型

先创建conda环境,建议Python 3.10或3.11。

# 创建独立环境 conda create -n unsloth python=3.10 conda activate unsloth # 安装Unsloth pip install -U pip uv uv venv uv pip install unsloth --torch-backend=auto

安装完成后,接下来下载模型。国内推荐使用魔塔(ModelScope),速度比HuggingFace快很多。

# 安装魔塔 pip install modelscope
# 方法一:使用魔塔下载(国内推荐) from modelscope import snapshot_download model_dir = snapshot_download('Qwen/Qwen3.5-4B', cache_dir='./models') # 方法二:使用HuggingFace # from transformers import AutoModelForCausalLM, AutoTokenizer # model_name = "Qwen/Qwen3.5-4B" # model = AutoModelForCausalLM.from_pretrained(model_name) # tokenizer = AutoTokenizer.from_pretrained(model_name)

魔塔下载的模型保存在本地后,Unsloth可以直接加载:

from unsloth import FastLanguageModel # 加载本地模型 model, tokenizer = FastLanguageModel.from_pretrained( model_name = "./models/Qwen/Qwen3.5-4B", max_seq_length = 2048, load_in_4bit = True, # 4bit量化,显存友好 )

如果需要从HuggingFace下载,可以设置环境变量HF_ENDPOINT=https://hf-mirror.com可以加速下载。

数据准备:对话格式详解

微调效果好不好,七分靠数据。Qwen3.5支持ChatML格式,结构比之前的版本更清晰。

{ "conversations": [ {"from": "human", "value": "帮我写一个Python快速排序"}, {"from": "gpt", "value": "def quick_sort(arr):\n if len(arr) <= 1:\n return arr\n pivot = arr[len(arr) // 2]\n left = [x for x in arr if x < pivot]\n middle = [x for x in arr if x == pivot]\n right = [x for x in arr if x > pivot]\n return quick_sort(left) + middle + quick_sort(right)"} ] }

数据质量的几个要点:

  • 数量不是关键

    4B模型1000-5000条高质量样本足够,关键在于质量

  • 回答要完整

    避免截断的回答,这会让模型学到不完整的模式

  • 格式要统一

    中文标点、换行符要规范,不一致会影响学习

  • 领域相关性

    如果做医疗问答,至少70%的数据应该来自医疗领域

训练配置:LoRA参数选择

LoRA的配置其实不复杂,主要就几个参数。

from unsloth import FastLanguageModel from trl import SFTTrainer from transformers import TrainingArguments # 加载模型 model, tokenizer = FastLanguageModel.from_pretrained( model_name = "./models/Qwen/Qwen3.5-4B", max_seq_length = 2048, load_in_4bit = True, ) # 配置LoRA适配器 model = FastLanguageModel.get_peft_model( model, r = 16, # LoRA rank,16-32适合4B模型 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], lora_alpha = 16, lora_dropout = 0.05, bias = "none", use_gradient_checkpointing = "unsloth", packing = True, ) # 开始训练 trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = "text", max_seq_length = 2048, dataset_num_proc = 4, args = TrainingArguments( per_device_train_batch_size = 4, gradient_accumulation_steps = 4, warmup_steps = 10, num_train_epochs = 3, learning_rate = 2e-4, fp16 = not torch.cuda.is_bf16_supported(), bf16 = torch.cuda.is_bf16_supported(), logging_steps = 10, optim = "adamw_8bit", weight_decay = 0.01, lr_scheduler_type = "linear", output_dir = "outputs", ), ) trainer.train()

参数怎么调:

  • learning_rate

    2e-4是经验值,效果不好再微调

  • num_train_epochs

    3是稳妥选择,数据少可以加到5

  • r值

    16训练快,32表达能力更强,4B模型没必要用64

  • per_device_train_batch_size

    根据显存调整,不够就降低这个值

模型合并与推理

训练完成后,需要把LoRA适配器合并回原模型:

# 合并LoRA权重 model = model.merge_and_unload() # 保存模型 model.save_pretrained("final_model") tokenizer.save_pretrained("final_model")

推理时注意Qwen3.5的采样参数:

from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("final_model") tokenizer = AutoTokenizer.from_pretrained("final_model") messages = [{"role": "user", "content": "你的问题"}] text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = tokenizer(text, return_tensors="pt").to("cuda") # 通用任务推荐参数 outputs = model.generate( **inputs, max_new_tokens = 1024, temperature = 0.7, # 非思考模式 top_p = 0.8, presence_penalty = 1.5, ) result = tokenizer.decode(outputs[0], skip_special_tokens=True) print(result) # 如果想要禁用思考模式(直接回答) outputs = model.generate( **inputs, max_new_tokens = 1024, temperature = 0.7, top_p = 0.8, extra_body = {"chat_template_kwargs": {"enable_thinking": False}} )

踩坑记录

跑了这么多次,总结几个容易出问题的点:

  • 显存不够先降序列长度

    别急着降batch_size,max_seq_length从2048降到1024能省一大截显存

  • loss突然飙升

    大概率学习率太高,检查数据有没有脏数据

  • 推理回答太短

    尝试增大max_new_tokens,或者调整chat_template

  • 合并后模型很大

    LoRA适配器单独保存只有几十MB,方便分享和迭代

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询