从这一篇开始我们进入大多数 AI 工程师真正会亲自上手的领域——SFTSupervised Fine-Tuning监督微调。预训练造就了一个通才大脑但它有两个问题只会接话不会对话——Base 模型听到你好可能回一段你好的英文是 hello…“而不是你好请问有什么可以帮您”不懂你的业务——它不知道你公司的客服流程、API 规范、术语表SFT 就是解决这两件事的关键工程动作。如果你做过相关工作下面这些问题应该不陌生• 用 LoRA 微调效果比全参差多少什么时候必须上全参• 单卡 24GB 显存能不能微调 70B 模型• 训练数据要多少10 条够吗1 万条• 微调后模型忘了原来的能力怎么办• LoRA 训完一堆能不能像插件一样动态切换读完本文你将能选对微调方法全参 / LoRA / QLoRA / 哪个估算微调一个 N B 模型的资源需求上手运行一个完整的 QLoRA 训练脚本避免 5 个最常见的微调坑决策是否需要 SFT——很多时候 RAG 或 Prompt 就够我们开始。一、SFT 在 LLM 工程栈中的位置1.1 Base → Chat从「会接话」到「会对话」回忆第 1 篇我们画的全链路预训练 (Base) → SFT (Instruct) → 对齐 (DPO/RLHF) → 可用模型每个阶段干一件事•Base 模型知道语言是什么。喂今天天气会接很好或者如何•SFT (Instruct) 模型知道指令是什么。喂总结这段话会给出总结而不是接话•对齐模型知道什么回答更好。会拒绝有害请求、更礼貌、更有用HuggingFace 上模型名常见后缀后缀含义-Base/ 无后缀仅做了预训练-Instruct/-Chat/-SFT做过 SFT-DPO/-RLHF/-Aligned做过对齐生产环境用模型至少要 Instruct 版本——Base 模型直接上线就是个灾难。1.2 工程师做 SFT 的常见场景场景目标典型数据量垂直领域适配法律/医疗/金融术语认知1-10 万条业务规则注入客服回复风格、产品 FAQ5K-5 万条格式约束强制 JSON 输出、特定模板1K-1 万条Tool Use 训练教模型用特定工具几千-几万条代码助手内部代码风格、私有 API1 万私有数据吸收让模型记住知识看场景注意第 6 个场景——让模型记住知识——这是新手最容易踩的坑。SFT 不擅长让模型学新知识只擅长让模型学新格式/风格。需要让模型知道某些信息应该用 RAG。1.3 SFT vs RAG vs Prompt三选一的决策这是一个被无数团队踩坑后才搞清楚的决策矩阵需求推荐理由输出格式特定JSON / XMLPrompt → SFTPrompt 不够稳定上 SFT让模型用特定语气/风格SFTPrompt 难以稳定给模型注入新知识RAGSFT 学知识效率低、易遗忘模型理解新术语SFT RAG先 SFT 理解、再 RAG 查询复杂工具调用SFT (Function Calling 数据)Prompt 不够稳内部工作流编排SFTPrompt 链条太长单次复杂任务Prompt Chain of Thought不需要训练一个简化的优先级Prompt → RAG → SFT → 对齐微调能用 Prompt 解决不要上 RAG能 RAG 解决不要 SFT能 SFT 解决不要 RLHF。降维使用工程上最省事。二、SFT 原理速通2.1 SFT 与预训练的本质区别维度预训练SFT数据量万亿 token千-百万 sample数据格式纯文本(指令, 响应) 对训练目标下一个 token 预测仅响应部分的 token 预测学习率~3e-4~1e-5 ~ 2e-4取决于方法训练时长数月数小时-数天算力规模千-万卡单卡-数十卡最关键的区别SFT 的 loss 只算响应部分的 token不算指令部分——因为我们想让模型学会如何回答而不是如何提问。这是新手容易写错的细节下面代码会讲到。2.2 训练数据格式主流 SFT 数据格式两类Alpaca 风格早期{ instruction: 把下面文本翻译成英文, input: 你好世界, output: Hello, world}ChatML / Multi-turn 风格当下主流{ messages:[ {role:system,content:你是一个翻译助手}, {role:user,content:把你好世界翻译成英文}, {role:assistant,content:Hello, world}]}当下生产环境几乎都用 ChatML 格式——因为支持多轮、支持 system prompt、和推理时的 prompt 格式完全一致。2.3 Chat Template让模型学会对话格式不同模型有不同的对话模板。比如 Qwen3 的模板|im_start|system{system}|im_end||im_start|user{user_msg}|im_end||im_start|assistant{assistant_msg}|im_end|Llama 3|begin_of_text||start_header_id|system|end_header_id|{system}|eot_id||start_header_id|user|end_header_id|{user_msg}|eot_id|...SFT 训练时必须用和推理时完全一致的模板——否则上线效果会莫名其妙差。直接用tokenizer.apply_chat_template()是最稳的做法不要手拼字符串。三、三种微调方法原理与对比3.1 全参数微调Full Fine-Tuning做法解锁所有模型参数照常用 SGD/AdamW 更新。显存需求第 3 篇推导过的训练显存公式显存 ≈ 12 × N bytesBF16 AdamW对 70B 模型12 × 70 840 GB——单 H100 80GB 装不下需要 8 张 H100 起。优点• 效果上限最高• 适合大幅改变模型行为• 适合预训练后再次精炼缺点• 显存成本极高• 容易灾难遗忘catastrophic forgetting—— 学新东西忘老东西• 训练完产物是个完整模型存储/传输不便实操场景• 准备发布新版本基座模型• 算力充足且需要极致效果• 大数据量10 万领域适配3.2 LoRALow-Rank AdaptationLoRA 是 2021 年微软提出的方法当下 80% 的微调任务都用 LoRA 系列。核心思路冻结原模型权重只在每一层旁边加一个低秩适配器。数学表达原模型权重W (d × d)新增适配器B × A其中 B 是 d×rA 是 r×d推理时实际权重W α/r × B × A其中r是 LoRA 秩典型值 8、16、64α是缩放因子。为什么有效研究表明微调阶段权重的实际变化是低秩的——可以用小矩阵很好近似。视觉上原始 forward input ──→ [W: d×d] ──→ output ← 冻结不训练 input ──→ [A: r×d] → [B: d×r] ──→ output_delta ← 训练 ↑ ↑ 低秩 r8/16/64显存收益• 训练参数从 N 降到 ~0.1-1% × N取决于 r• 优化器状态减少同等比例• 显存降到2-4 × N bytes约全参的 1/3-1/6对比 Llama-3-70B 训练显存方法显存全参BF16Adam~840 GBLoRA r64~280 GBQLoRA r64~70 GBLoRA 的工程红利可叠加训出多个 LoRA可以加权合并可热切换推理时一个基座 多个 LoRA按业务切换轻量传输一个 LoRA 通常只有几十-几百 MB多任务共存不同业务不同 LoRA互不干扰这就是为什么 vLLM、SGLang 都支持多 LoRA 热加载——一个基座撑 N 个业务。3.3 QLoRAQuantized LoRA问题即便 LoRA 把训练显存降到 1/370B 模型还是要 280GB——单卡跑不动。QLoRA 的妙招把冻结的基座模型量化到 4-bitLoRA 适配器仍用 BF16 训练。基座 WNF4 量化 (4-bit) ← 冻结LoRA A, BBF16 ← 训练反向传播用 BF16 精度计算梯度显存进一步降到 N bytes 量级——70B 模型只需 ~70GB单 H100 80G 完全可以。关键技术细节•NF4 量化专为正态分布权重设计的 4-bit 量化精度损失极小•Double Quantization连量化常数本身也量化再省 10% 显存•Paged Optimizer用 CUDA 统一内存OOM 时自动换到 CPU代价• 训练速度比 LoRA 慢约 20-40%量化/反量化开销• 极少数极端任务效果略差结论QLoRA 是单卡微调的事实标准。3.4 一张表总结维度全参LoRAQLoRA训练显存 (70B)~840 GB~280 GB~70 GB单卡可训(80G H100)❌❌✅双卡可训❌✅紧张✅轻松训练速度1×1.5×1×效果上限100%95-98%92-96%产物大小140 GB100-500 MB100-500 MB适合多任务部署❌✅✅3.5 选择决策树是否准备发布新基座 / 极致效果 ├─ 是 → 全参多卡 └─ 否 → 用 LoRA 系列 │ ├─ 显存充足数十 GB │ ├─ 是 → LoRA更快 │ └─ 否 → QLoRA单卡也能跑经验法则从 QLoRA 开始。除非证明 QLoRA 效果不够否则不要折腾全参。四、实战用 QLoRA 微调 Qwen3-7B下面是一个可直接运行的完整 QLoRA 微调脚本。4.1 环境准备pip install transformers4.46.0 peft0.13.0 bitsandbytes0.44.0 \ accelerate1.0.0 trl0.12.0 datasets3.0.04.2 数据准备假设我们要训一个「翻译助手」数据格式[ {messages:[ {role:system,content:你是翻译助手}, {role:user,content:把你好世界翻译成英文}, {role:assistant,content:Hello, world}]}, ...]数据准备代码import jsonfrom datasets import Dataset# 假设你的训练数据在 train.jsonlwith open(train.jsonl) as f: data [json.loads(l) for l in f]dataset Dataset.from_list(data)print(f训练样本数: {len(dataset)})4.3 加载模型 QLoRA 配置import torchfrom transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfigfrom peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingMODEL_NAME Qwen/Qwen3-7B-Instruct# 1. 4-bit 量化配置bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, # Double Quantization)# 2. 加载量化基座model AutoModelForCausalLM.from_pretrained( MODEL_NAME, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue,)model prepare_model_for_kbit_training(model)# 3. LoRA 配置lora_config LoraConfig( r64, # 秩 lora_alpha128, # 缩放因子通常 2r lora_dropout0.05, biasnone, task_typeCAUSAL_LM, target_modules[ # 注入 LoRA 的层 q_proj, k_proj, v_proj, o_proj, # attention gate_proj, up_proj, down_proj, # FFN ],)model get_peft_model(model, lora_config)model.print_trainable_parameters()# 输出: trainable params: 80,478,208 || all params: 7,696,150,528 || trainable%: 1.04%几个关键参数解读•r64rank。经验值小任务 8-16中型 32-64大型 64-128•lora_alpha 2r缩放系数标准做法•target_modules决定 LoRA 注入的层。注入 attention FFN 是当前最优配置4.4 数据处理关键只对 response 算 losstokenizer AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_codeTrue)defformat_and_tokenize(example): 关键点分离 prompt 和 responseloss 只算 response 部分 messages example[messages] # 用 chat template 构造完整文本 full_text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse ) # 构造 prompt不含 assistant 部分 prompt_messages messages[:-1] # 去掉最后一条 assistant prompt_text tokenizer.apply_chat_template( prompt_messages, tokenizeFalse, add_generation_promptTrue ) # tokenize full_ids tokenizer(full_text, truncationTrue, max_length2048)[input_ids] prompt_ids tokenizer(prompt_text, truncationTrue, max_length2048)[input_ids] # labels: prompt 部分用 -100 mask不计 loss labels [-100] * len(prompt_ids) full_ids[len(prompt_ids):] return { input_ids: full_ids, labels: labels[:len(full_ids)], attention_mask: [1] * len(full_ids), }dataset dataset.map(format_and_tokenize, remove_columnsdataset.column_names)⚠️新手最常踩的坑直接把整条对话拿来训导致 loss 也算了用户提问部分——模型会学到如何生成用户提问效果显著变差。4.5 训练from transformers import TrainingArguments, Trainerfrom transformers.data.data_collator import DataCollatorForSeq2Seqtraining_args TrainingArguments( output_dir./qlora-qwen3-7b, num_train_epochs3, per_device_train_batch_size4, gradient_accumulation_steps4, # 等效 batch 16 learning_rate2e-4, # QLoRA 通常比全参高 lr_scheduler_typecosine, warmup_ratio0.03, logging_steps20, save_steps500, save_total_limit3, bf16True, optimpaged_adamw_8bit, # Paged Optimizer gradient_checkpointingTrue, report_totensorboard,)trainer Trainer( modelmodel, argstraining_args, train_datasetdataset, data_collatorDataCollatorForSeq2Seq( tokenizertokenizer, paddingTrue ),)trainer.train()model.save_pretrained(./qlora-qwen3-7b-final)4.6 合并 LoRA 权重 推理训完后有两种部署方式方式 1保留 LoRA动态加载推荐生产from peft import PeftModelfrom transformers import AutoModelForCausalLMbase AutoModelForCausalLM.from_pretrained(Qwen/Qwen3-7B-Instruct)model PeftModel.from_pretrained(base, ./qlora-qwen3-7b-final)# 可以在推理时切换不同 LoRA方式 2合并权重用于发布完整模型merged model.merge_and_unload()merged.save_pretrained(./qwen3-7b-translate)合并后的模型和原模型一样可以用 vLLM 等推理框架部署。4.7 vLLM 部署多 LoRA 共存vllm serve Qwen/Qwen3-7B-Instruct \ --enable-lora \ --lora-modules \ translate./qlora-qwen3-7b-translate \ customer-service./qlora-qwen3-7b-cs \ code-review./qlora-qwen3-7b-code \ --max-loras 4请求时指定要用哪个 LoRAcurl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: translate, messages: [{role:user,content:翻译: hello}] }单基座 多 LoRA 是当下生产部署的最经济方案——一份 GPU 资源服务多业务。五、避坑清单5 个最常见的微调陷阱坑 1数据质量 数据量很多人觉得我训数据越多越好结果训出来效果反而退化。反例一个团队拿 100 万条客服对话训结果模型学了大量嗯嗯啊啊等口语化噪声。对策• 严格清洗数据宁少勿滥•1000 条高质量数据 10 万条噪声数据——Anthropic 在 Constitutional AI 中验证过• 数据要覆盖业务的关键场景不要全是简单 case坑 2学习率配错不同微调方法学习率差异很大方法推荐 LR全参微调1e-5 ~ 5e-5LoRA1e-4 ~ 3e-4QLoRA1e-4 ~ 3e-4Embedding 微调1e-3错配 LR 的症状• LR 过大 → loss 飞起胡言乱语• LR 过小 → 训练无进展效果同未训坑 3灾难遗忘微调后模型在原能力上退化。例如训一个法律助手结果模型连日常对话都答不好了。对策• 混入 10-20% 的通用指令数据• 用 LoRA 而非全参自带保护机制• 学习率小一些、训练 epoch 少一些• DPO 阶段可以部分修复坑 4Chat Template 用错症状训练 loss 看着正常部署后效果差。根本原因训练用的 template 和推理用的 template 不一致。对策•训练和推理必须用同一个tokenizer.apply_chat_template()• 检查 EOS token 是否正确很多模型有多个 EOS• 如果加了自定义 system prompt推理时也要加坑 5评估太草率反例训完用 5 个测试样例看一眼效果好就上线。结果用户场景一来全崩。对策• 准备至少 100 条 hold-out 测试集不要混进训练集• 用业务真实分布的数据评估不要用通用 benchmark• 同时跑通用 benchmarkMMLU/CEval确认没有灾难遗忘• 加入对抗性 caseprompt injection、边缘场景六、进阶话题与下一篇预告6.1 LoRA 的进化变种LoRA 之后还出了一系列改进方法改进点当下地位LoRA低秩适配主流AdaLoRA自适应分配 rank部分场景DoRA分解为方向 大小论文热门PiSSA用主成分初始化新兴GaLore梯度低秩投影接近全参效果工程上LoRA 仍然是首选其他方法在 5% 边际增益场景考虑。6.2 何时 SFT 完不够、要上 DPO/RLHFSFT 解决会做不解决做得好。下列情况要继续做对齐• 安全性场景医疗、法律建议• 用户体验场景语气、有用性、诚实性• 偏好选择哪个回答更好是模糊判断 详见系列第 8 篇RLHF 与 DPO。6.3 多 LoRA 合并如果你训了多个 LoRA可以加权合并from peft import PeftModelmodel PeftModel.from_pretrained(base, lora_a)model.load_adapter(lora_b, adapter_nameb)model.add_weighted_adapter( adapters[default, b], weights[0.7, 0.3], adapter_namemerged)适用于把格式 LoRA和领域 LoRA组合使用。6.4 SFT 数据自动化工业上越来越多用大模型生成 SFT 数据• Self-Instruct模型自己生成 instruction• Evol-Instruct让 GPT-4 把简单 instruction 改写得更复杂• 蒸馏用闭源大模型回答作为开源小模型的 SFT 数据 详见系列第 10 篇训练数据工程。结语80% 的 AI 工程师会与 SFT 朝夕相处读完本文你应该明白•QLoRA 是单卡微调的事实标准从这里开始•SFT 不擅长学知识擅长学格式/风格——知识用 RAG•数据质量 数据量1000 条精品 10 万条噪声•多 LoRA 单基座是生产部署的经济选择•Prompt → RAG → SFT → 对齐按优先级降维使用学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%免费】
SFT 微调实战:LoRA / QLoRA / 全参微调对比
从这一篇开始我们进入大多数 AI 工程师真正会亲自上手的领域——SFTSupervised Fine-Tuning监督微调。预训练造就了一个通才大脑但它有两个问题只会接话不会对话——Base 模型听到你好可能回一段你好的英文是 hello…“而不是你好请问有什么可以帮您”不懂你的业务——它不知道你公司的客服流程、API 规范、术语表SFT 就是解决这两件事的关键工程动作。如果你做过相关工作下面这些问题应该不陌生• 用 LoRA 微调效果比全参差多少什么时候必须上全参• 单卡 24GB 显存能不能微调 70B 模型• 训练数据要多少10 条够吗1 万条• 微调后模型忘了原来的能力怎么办• LoRA 训完一堆能不能像插件一样动态切换读完本文你将能选对微调方法全参 / LoRA / QLoRA / 哪个估算微调一个 N B 模型的资源需求上手运行一个完整的 QLoRA 训练脚本避免 5 个最常见的微调坑决策是否需要 SFT——很多时候 RAG 或 Prompt 就够我们开始。一、SFT 在 LLM 工程栈中的位置1.1 Base → Chat从「会接话」到「会对话」回忆第 1 篇我们画的全链路预训练 (Base) → SFT (Instruct) → 对齐 (DPO/RLHF) → 可用模型每个阶段干一件事•Base 模型知道语言是什么。喂今天天气会接很好或者如何•SFT (Instruct) 模型知道指令是什么。喂总结这段话会给出总结而不是接话•对齐模型知道什么回答更好。会拒绝有害请求、更礼貌、更有用HuggingFace 上模型名常见后缀后缀含义-Base/ 无后缀仅做了预训练-Instruct/-Chat/-SFT做过 SFT-DPO/-RLHF/-Aligned做过对齐生产环境用模型至少要 Instruct 版本——Base 模型直接上线就是个灾难。1.2 工程师做 SFT 的常见场景场景目标典型数据量垂直领域适配法律/医疗/金融术语认知1-10 万条业务规则注入客服回复风格、产品 FAQ5K-5 万条格式约束强制 JSON 输出、特定模板1K-1 万条Tool Use 训练教模型用特定工具几千-几万条代码助手内部代码风格、私有 API1 万私有数据吸收让模型记住知识看场景注意第 6 个场景——让模型记住知识——这是新手最容易踩的坑。SFT 不擅长让模型学新知识只擅长让模型学新格式/风格。需要让模型知道某些信息应该用 RAG。1.3 SFT vs RAG vs Prompt三选一的决策这是一个被无数团队踩坑后才搞清楚的决策矩阵需求推荐理由输出格式特定JSON / XMLPrompt → SFTPrompt 不够稳定上 SFT让模型用特定语气/风格SFTPrompt 难以稳定给模型注入新知识RAGSFT 学知识效率低、易遗忘模型理解新术语SFT RAG先 SFT 理解、再 RAG 查询复杂工具调用SFT (Function Calling 数据)Prompt 不够稳内部工作流编排SFTPrompt 链条太长单次复杂任务Prompt Chain of Thought不需要训练一个简化的优先级Prompt → RAG → SFT → 对齐微调能用 Prompt 解决不要上 RAG能 RAG 解决不要 SFT能 SFT 解决不要 RLHF。降维使用工程上最省事。二、SFT 原理速通2.1 SFT 与预训练的本质区别维度预训练SFT数据量万亿 token千-百万 sample数据格式纯文本(指令, 响应) 对训练目标下一个 token 预测仅响应部分的 token 预测学习率~3e-4~1e-5 ~ 2e-4取决于方法训练时长数月数小时-数天算力规模千-万卡单卡-数十卡最关键的区别SFT 的 loss 只算响应部分的 token不算指令部分——因为我们想让模型学会如何回答而不是如何提问。这是新手容易写错的细节下面代码会讲到。2.2 训练数据格式主流 SFT 数据格式两类Alpaca 风格早期{ instruction: 把下面文本翻译成英文, input: 你好世界, output: Hello, world}ChatML / Multi-turn 风格当下主流{ messages:[ {role:system,content:你是一个翻译助手}, {role:user,content:把你好世界翻译成英文}, {role:assistant,content:Hello, world}]}当下生产环境几乎都用 ChatML 格式——因为支持多轮、支持 system prompt、和推理时的 prompt 格式完全一致。2.3 Chat Template让模型学会对话格式不同模型有不同的对话模板。比如 Qwen3 的模板|im_start|system{system}|im_end||im_start|user{user_msg}|im_end||im_start|assistant{assistant_msg}|im_end|Llama 3|begin_of_text||start_header_id|system|end_header_id|{system}|eot_id||start_header_id|user|end_header_id|{user_msg}|eot_id|...SFT 训练时必须用和推理时完全一致的模板——否则上线效果会莫名其妙差。直接用tokenizer.apply_chat_template()是最稳的做法不要手拼字符串。三、三种微调方法原理与对比3.1 全参数微调Full Fine-Tuning做法解锁所有模型参数照常用 SGD/AdamW 更新。显存需求第 3 篇推导过的训练显存公式显存 ≈ 12 × N bytesBF16 AdamW对 70B 模型12 × 70 840 GB——单 H100 80GB 装不下需要 8 张 H100 起。优点• 效果上限最高• 适合大幅改变模型行为• 适合预训练后再次精炼缺点• 显存成本极高• 容易灾难遗忘catastrophic forgetting—— 学新东西忘老东西• 训练完产物是个完整模型存储/传输不便实操场景• 准备发布新版本基座模型• 算力充足且需要极致效果• 大数据量10 万领域适配3.2 LoRALow-Rank AdaptationLoRA 是 2021 年微软提出的方法当下 80% 的微调任务都用 LoRA 系列。核心思路冻结原模型权重只在每一层旁边加一个低秩适配器。数学表达原模型权重W (d × d)新增适配器B × A其中 B 是 d×rA 是 r×d推理时实际权重W α/r × B × A其中r是 LoRA 秩典型值 8、16、64α是缩放因子。为什么有效研究表明微调阶段权重的实际变化是低秩的——可以用小矩阵很好近似。视觉上原始 forward input ──→ [W: d×d] ──→ output ← 冻结不训练 input ──→ [A: r×d] → [B: d×r] ──→ output_delta ← 训练 ↑ ↑ 低秩 r8/16/64显存收益• 训练参数从 N 降到 ~0.1-1% × N取决于 r• 优化器状态减少同等比例• 显存降到2-4 × N bytes约全参的 1/3-1/6对比 Llama-3-70B 训练显存方法显存全参BF16Adam~840 GBLoRA r64~280 GBQLoRA r64~70 GBLoRA 的工程红利可叠加训出多个 LoRA可以加权合并可热切换推理时一个基座 多个 LoRA按业务切换轻量传输一个 LoRA 通常只有几十-几百 MB多任务共存不同业务不同 LoRA互不干扰这就是为什么 vLLM、SGLang 都支持多 LoRA 热加载——一个基座撑 N 个业务。3.3 QLoRAQuantized LoRA问题即便 LoRA 把训练显存降到 1/370B 模型还是要 280GB——单卡跑不动。QLoRA 的妙招把冻结的基座模型量化到 4-bitLoRA 适配器仍用 BF16 训练。基座 WNF4 量化 (4-bit) ← 冻结LoRA A, BBF16 ← 训练反向传播用 BF16 精度计算梯度显存进一步降到 N bytes 量级——70B 模型只需 ~70GB单 H100 80G 完全可以。关键技术细节•NF4 量化专为正态分布权重设计的 4-bit 量化精度损失极小•Double Quantization连量化常数本身也量化再省 10% 显存•Paged Optimizer用 CUDA 统一内存OOM 时自动换到 CPU代价• 训练速度比 LoRA 慢约 20-40%量化/反量化开销• 极少数极端任务效果略差结论QLoRA 是单卡微调的事实标准。3.4 一张表总结维度全参LoRAQLoRA训练显存 (70B)~840 GB~280 GB~70 GB单卡可训(80G H100)❌❌✅双卡可训❌✅紧张✅轻松训练速度1×1.5×1×效果上限100%95-98%92-96%产物大小140 GB100-500 MB100-500 MB适合多任务部署❌✅✅3.5 选择决策树是否准备发布新基座 / 极致效果 ├─ 是 → 全参多卡 └─ 否 → 用 LoRA 系列 │ ├─ 显存充足数十 GB │ ├─ 是 → LoRA更快 │ └─ 否 → QLoRA单卡也能跑经验法则从 QLoRA 开始。除非证明 QLoRA 效果不够否则不要折腾全参。四、实战用 QLoRA 微调 Qwen3-7B下面是一个可直接运行的完整 QLoRA 微调脚本。4.1 环境准备pip install transformers4.46.0 peft0.13.0 bitsandbytes0.44.0 \ accelerate1.0.0 trl0.12.0 datasets3.0.04.2 数据准备假设我们要训一个「翻译助手」数据格式[ {messages:[ {role:system,content:你是翻译助手}, {role:user,content:把你好世界翻译成英文}, {role:assistant,content:Hello, world}]}, ...]数据准备代码import jsonfrom datasets import Dataset# 假设你的训练数据在 train.jsonlwith open(train.jsonl) as f: data [json.loads(l) for l in f]dataset Dataset.from_list(data)print(f训练样本数: {len(dataset)})4.3 加载模型 QLoRA 配置import torchfrom transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfigfrom peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingMODEL_NAME Qwen/Qwen3-7B-Instruct# 1. 4-bit 量化配置bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, # Double Quantization)# 2. 加载量化基座model AutoModelForCausalLM.from_pretrained( MODEL_NAME, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue,)model prepare_model_for_kbit_training(model)# 3. LoRA 配置lora_config LoraConfig( r64, # 秩 lora_alpha128, # 缩放因子通常 2r lora_dropout0.05, biasnone, task_typeCAUSAL_LM, target_modules[ # 注入 LoRA 的层 q_proj, k_proj, v_proj, o_proj, # attention gate_proj, up_proj, down_proj, # FFN ],)model get_peft_model(model, lora_config)model.print_trainable_parameters()# 输出: trainable params: 80,478,208 || all params: 7,696,150,528 || trainable%: 1.04%几个关键参数解读•r64rank。经验值小任务 8-16中型 32-64大型 64-128•lora_alpha 2r缩放系数标准做法•target_modules决定 LoRA 注入的层。注入 attention FFN 是当前最优配置4.4 数据处理关键只对 response 算 losstokenizer AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_codeTrue)defformat_and_tokenize(example): 关键点分离 prompt 和 responseloss 只算 response 部分 messages example[messages] # 用 chat template 构造完整文本 full_text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse ) # 构造 prompt不含 assistant 部分 prompt_messages messages[:-1] # 去掉最后一条 assistant prompt_text tokenizer.apply_chat_template( prompt_messages, tokenizeFalse, add_generation_promptTrue ) # tokenize full_ids tokenizer(full_text, truncationTrue, max_length2048)[input_ids] prompt_ids tokenizer(prompt_text, truncationTrue, max_length2048)[input_ids] # labels: prompt 部分用 -100 mask不计 loss labels [-100] * len(prompt_ids) full_ids[len(prompt_ids):] return { input_ids: full_ids, labels: labels[:len(full_ids)], attention_mask: [1] * len(full_ids), }dataset dataset.map(format_and_tokenize, remove_columnsdataset.column_names)⚠️新手最常踩的坑直接把整条对话拿来训导致 loss 也算了用户提问部分——模型会学到如何生成用户提问效果显著变差。4.5 训练from transformers import TrainingArguments, Trainerfrom transformers.data.data_collator import DataCollatorForSeq2Seqtraining_args TrainingArguments( output_dir./qlora-qwen3-7b, num_train_epochs3, per_device_train_batch_size4, gradient_accumulation_steps4, # 等效 batch 16 learning_rate2e-4, # QLoRA 通常比全参高 lr_scheduler_typecosine, warmup_ratio0.03, logging_steps20, save_steps500, save_total_limit3, bf16True, optimpaged_adamw_8bit, # Paged Optimizer gradient_checkpointingTrue, report_totensorboard,)trainer Trainer( modelmodel, argstraining_args, train_datasetdataset, data_collatorDataCollatorForSeq2Seq( tokenizertokenizer, paddingTrue ),)trainer.train()model.save_pretrained(./qlora-qwen3-7b-final)4.6 合并 LoRA 权重 推理训完后有两种部署方式方式 1保留 LoRA动态加载推荐生产from peft import PeftModelfrom transformers import AutoModelForCausalLMbase AutoModelForCausalLM.from_pretrained(Qwen/Qwen3-7B-Instruct)model PeftModel.from_pretrained(base, ./qlora-qwen3-7b-final)# 可以在推理时切换不同 LoRA方式 2合并权重用于发布完整模型merged model.merge_and_unload()merged.save_pretrained(./qwen3-7b-translate)合并后的模型和原模型一样可以用 vLLM 等推理框架部署。4.7 vLLM 部署多 LoRA 共存vllm serve Qwen/Qwen3-7B-Instruct \ --enable-lora \ --lora-modules \ translate./qlora-qwen3-7b-translate \ customer-service./qlora-qwen3-7b-cs \ code-review./qlora-qwen3-7b-code \ --max-loras 4请求时指定要用哪个 LoRAcurl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: translate, messages: [{role:user,content:翻译: hello}] }单基座 多 LoRA 是当下生产部署的最经济方案——一份 GPU 资源服务多业务。五、避坑清单5 个最常见的微调陷阱坑 1数据质量 数据量很多人觉得我训数据越多越好结果训出来效果反而退化。反例一个团队拿 100 万条客服对话训结果模型学了大量嗯嗯啊啊等口语化噪声。对策• 严格清洗数据宁少勿滥•1000 条高质量数据 10 万条噪声数据——Anthropic 在 Constitutional AI 中验证过• 数据要覆盖业务的关键场景不要全是简单 case坑 2学习率配错不同微调方法学习率差异很大方法推荐 LR全参微调1e-5 ~ 5e-5LoRA1e-4 ~ 3e-4QLoRA1e-4 ~ 3e-4Embedding 微调1e-3错配 LR 的症状• LR 过大 → loss 飞起胡言乱语• LR 过小 → 训练无进展效果同未训坑 3灾难遗忘微调后模型在原能力上退化。例如训一个法律助手结果模型连日常对话都答不好了。对策• 混入 10-20% 的通用指令数据• 用 LoRA 而非全参自带保护机制• 学习率小一些、训练 epoch 少一些• DPO 阶段可以部分修复坑 4Chat Template 用错症状训练 loss 看着正常部署后效果差。根本原因训练用的 template 和推理用的 template 不一致。对策•训练和推理必须用同一个tokenizer.apply_chat_template()• 检查 EOS token 是否正确很多模型有多个 EOS• 如果加了自定义 system prompt推理时也要加坑 5评估太草率反例训完用 5 个测试样例看一眼效果好就上线。结果用户场景一来全崩。对策• 准备至少 100 条 hold-out 测试集不要混进训练集• 用业务真实分布的数据评估不要用通用 benchmark• 同时跑通用 benchmarkMMLU/CEval确认没有灾难遗忘• 加入对抗性 caseprompt injection、边缘场景六、进阶话题与下一篇预告6.1 LoRA 的进化变种LoRA 之后还出了一系列改进方法改进点当下地位LoRA低秩适配主流AdaLoRA自适应分配 rank部分场景DoRA分解为方向 大小论文热门PiSSA用主成分初始化新兴GaLore梯度低秩投影接近全参效果工程上LoRA 仍然是首选其他方法在 5% 边际增益场景考虑。6.2 何时 SFT 完不够、要上 DPO/RLHFSFT 解决会做不解决做得好。下列情况要继续做对齐• 安全性场景医疗、法律建议• 用户体验场景语气、有用性、诚实性• 偏好选择哪个回答更好是模糊判断 详见系列第 8 篇RLHF 与 DPO。6.3 多 LoRA 合并如果你训了多个 LoRA可以加权合并from peft import PeftModelmodel PeftModel.from_pretrained(base, lora_a)model.load_adapter(lora_b, adapter_nameb)model.add_weighted_adapter( adapters[default, b], weights[0.7, 0.3], adapter_namemerged)适用于把格式 LoRA和领域 LoRA组合使用。6.4 SFT 数据自动化工业上越来越多用大模型生成 SFT 数据• Self-Instruct模型自己生成 instruction• Evol-Instruct让 GPT-4 把简单 instruction 改写得更复杂• 蒸馏用闭源大模型回答作为开源小模型的 SFT 数据 详见系列第 10 篇训练数据工程。结语80% 的 AI 工程师会与 SFT 朝夕相处读完本文你应该明白•QLoRA 是单卡微调的事实标准从这里开始•SFT 不擅长学知识擅长学格式/风格——知识用 RAG•数据质量 数据量1000 条精品 10 万条噪声•多 LoRA 单基座是生产部署的经济选择•Prompt → RAG → SFT → 对齐按优先级降维使用学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%免费】