3行代码带你跑通Unsloth微调合成数据

发布时间:2026/10/7 8:08:42
3行代码带你跑通Unsloth微调合成数据 Unsloth 微调小模型生成合成数据一、为什么自己造一个「合成数据生成器」大模型训练最贵的不是显卡是高质量数据。公开语料越洗越薄标注外包又慢又贵。于是很多团队开始用大模型造数据——但用 GPT 级 API 批量生成成本随规模线性爆炸。一个务实的出路是用 QLoRA 把一个 4B 小模型微调成专用「合成数据生成器」让它定点产出你需要的训练/微调样本一次训练、无限复用。本文用 Unsloth QLoRA把 Gemma-3-4B 微调成一个「能按格式产出问题, 推理, 答案三元组」的生成器全程单卡 24GB 可跑附带可直接抄的训练脚本与踩坑。二、准备工作与数据思路给小模型看几百条「示范样本」让它学会你的输出格式与风格。先造约 500 条种子数据格式如下{ instruction: 生成一个关于分布式锁的面试问答, output: 问Redis 分布式锁为什么要用 SET NX PX 而不是先 SET 再 EXPIRE\n答因为两步之间进程可能崩溃导致锁没有过期时间、永久死锁。SET NX PX 把『占锁』和『设超时』合成原子操作…… }造种子数据可以先用强模型生成再人工校验比如让大模型产出 500 条再筛掉格式错的。重点是格式统一后面 loss 才稳。三、训练脚本Unsloth QLoRAUnsloth 把 LoRA 训练速度拉高、显存压低4B 模型单卡 24GB 轻松跑。完整可复制import torch from unsloth import FastModel from unsloth import is_bfloat16_supported from trl import SFTTrainer, SFTConfig from datasets import load_dataset model, tokenizer FastModel.from_pretrained( model_namegoogle/gemma-3-4b-it, max_seq_length2048, load_in_4bitTrue, # QLoRA4bit 量化底座 dtypetorch.bfloat16 if is_bfloat16_supported() else torch.float16, ) model FastModel.get_peft_model( model, r32, lora_alpha64, lora_dropout0, target_modules[q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj], ) ds load_dataset(json, data_filesseeds.jsonl)[train] def fmt(ex): return {text: f### 指令\n{ex[instruction]}\n\n### 回答\n{ex[output]}} ds ds.map(fmt) trainer SFTTrainer( modelmodel, tokenizertokenizer, train_datasetds, configSFTConfig( per_device_train_batch_size4, gradient_accumulation_steps4, max_steps300, learning_rate2e-4, optimadamw_8bit, warmup_steps20, logging_steps10, output_diroutputs_gemma_synth, ), ) trainer.train() model.save_pretrained(gemma_synth_lora)四、用它批量造数据训练完加载 LoRA 直接生成from unsloth import FastModel model, tokenizer FastModel.from_pretrained(google/gemma-3-4b-it, load_in_4bitTrue) model FastModel.from_pretrained(gemma_synth_lora, model) # 合并 LoRA def gen(instruction, n1): out [] for _ in range(n): m tokenizer.apply_chat_template( [{role:user,content:instruction}], return_tensorspt).to(cuda) txt model.generate(m, max_new_tokens512, temperature0.9, top_p0.95) out.append(tokenizer.decode(txt[0], skip_special_tokensTrue)) return out # 一次产出 2000 条候选再过滤 prompts [f生成一个关于{s}的技术问答 for s in [缓存击穿,CAP 定理,幂等设计]] data [g for p in prompts for g in gen(p, n700)]比如要扩充一个「后端面试」数据集就让生成器按主题轮转产出再用规则过滤掉长度异常、格式缺失的样本留下干净的几千条去训练下游任务模型。五、工程取舍底座选 4B 还是 7B4B 快、便宜、可控但生成多样性略弱7B 质量更好但显存翻倍。比如数据格式复杂、需要长推理链时建议直接上 7B。QLoRA 4bit 的精度损失量化底座会轻微掉点但对「格式生成」这种任务几乎无感若用来生成高难度数学推理建议改 fp8 或全参微调小模型。种子数据质量 数量500 条干净示范胜过 5000 条噪声数据。比如示范里混了 10% 格式错的生成器会稳定复现这个错误。生成要加去重与过滤小模型容易「背」训练样本需做相似度去重否则下游模型过拟合到这几句话。六、踩坑清单max_seq_length 不够生成样本被截断下游任务学到半截格式。比如输出常超 1k token设 2048 才稳。LoRA target_modules 漏层只挂 q/v 会训不动生成质量上不去建议挂全投影层。学习率过高炸 lossQLoRA 常用 2e-4调太高会震荡loss 突然变 nan。生成温度太低复读temperature0 时小模型反复吐同一句0.9 左右多样性才好。忘记保存 tokenizer只存了 LoRA 权重加载时 tokenizer 不匹配输出乱码。七、辩证小模型生成器不是万能水源把它当「无限水源」会翻车。第一生成器只能学会种子数据的分布天花板就是你的示范质量——示范烂产出烂。第二合成数据用多了会造成「模型教模型」的退化闭环需要持续混入真实数据对冲。第三某些高专业性领域如医疗、法律小模型生成易出现看似合理实则错误的「幻觉样本」必须经过人工或强模型校验才能进训练集。所以正确姿势是小模型生成器做「扩量」真实数据做「定标」二者配比而非替代。八、动手题如果你的种子数据只有 100 条你觉得训出来的生成器能直接投产吗在「4B 快但弱」和「7B 强但贵」之间你的数据生成任务会怎么选你是怎么给合成数据做去重和过滤的欢迎在评论区说说你的经验、分享你的流水线。数据与事件来源来源Unsloth 官方文档FastModel / QLoRA / SFTTrainer 用法与显存优化说明来源Google Gemma-3-4B 模型卡Hugging Face4B 指令微调基座来源Hugging Face TRL 库 SFTConfig 训练参数参考