轻松搞懂大模型微调SFT技术

📅 发布时间:2026/9/6 2:22:49
轻松搞懂大模型微调SFT技术 一、什么是大模型微调1. 在已有能力之上进一步学习特定任务大模型微调是在已经训练好的模型基础上使用特定领域或任务的数据继续训练更新全部参数、部分参数或新增的可训练参数使模型更适合目标任务。例如一个通用模型已经具备语言理解和图片识别能力但用于设备巡检时可能会出现以下问题能描述图片却无法按照企业规定给出巡检结论。能识别问题却不能稳定映射到内部故障分类。能生成答案却时常漏掉要求的字段。微调通过大量一致的示范让模型学习“在这种输入下应当如何完成任务”。它通常不需要从零训练整个模型而是在已有能力上进行适配。可以把预训练理解为建立基础知识和能力把微调理解为针对具体岗位继续训练。但这个类比有边界模型学习的是统计规律训练过后仍可能判断错误也可能记住训练样本而不能处理新情况。2. 微调与预训练、提示词、RAG 的区别方式主要做什么是否训练参数典型用途预训练从大规模数据中学习通用规律是建立模型基础能力领域继续预训练用领域语料继续进行语言建模等训练是适应专业术语、文体与领域分布监督微调 SFT从输入与示范答案中学习任务是分类、抽取、问答、结构化输出Prompt / Few-shot在当前输入中说明任务并提供示例否明确要求、快速验证任务RAG检索相关资料并将资料加入输入检索生成流程本身不要求更新大模型参数回答需要外部依据或最新资料的问题领域继续预训练与任务微调都属于继续训练但目标不同。前者强调适应语料分布后者强调完成具体任务。工程讨论中最好把两者明确区分。3. 微调改变的是什么模型在输入条件下对各种可能输出分配概率。训练会调整这些概率使符合示范或偏好的输出更容易出现。因此微调可能改善格式、风格、任务规则和领域表现也可能引入偏差、过拟合或原有能力退化。它不保证把所有训练材料准确记住更不保证消除幻觉。二、微调的应用场景微调适合的共同条件是**任务重复出现、期望行为可以定义、能够获得质量可靠的训练数据并且有独立的评估方式。**以下场景与方案分析为本文归纳。1. 文本分类与信息抽取将客服工单归类为“设备故障、操作咨询、售后申请”从维修记录中抽取设备编号、故障现象和处理措施。这类任务的价值在于统一业务口径。模型不仅要理解文字还要把表达各异的输入转换为固定字段或类别。例如用户说“机器突然停了重启也不行”目标输出可以是{category:设备故障,symptom:停机且重启无效}如果要求严格合法的 JSON还应配合结构化输出约束与程序校验。格式合法不等于内容正确两者需要分别评估。2. 行业问答与专业表达企业希望模型理解设备术语、统一缩写或者按固定步骤解释维修流程。可用经过审核的问答示范训练回答方式经常变化的设备参数和业务政策则通过检索或工具提供。这样微调负责学习任务规范外部系统负责提供具体依据。3. 固定风格与工作流程例如将巡检记录整理为“现象—证据—建议”将会议记录整理为统一模板或者按内部规则判断何时需要追问缺失信息。此时训练样本要体现完整规范而不仅是表面的语气。若希望模型在信息不足时先提问就必须提供相应示范。4. 多模态识别与结构化理解对于 Qwen3-VL 这样的视觉语言模型可以围绕图片与文字指令构造训练任务例如仪表读数、票据字段提取、设备状态描述等。Qwen3-VL 的模型形态和多模态输入方式可参见官方仓库。是否能做好具体任务仍需实测。尤其是微小裂纹、精确测量等问题应比较专用视觉模型或其他检测方案不应仅凭“支持图片”就认定视觉语言模型适用。三、微调有哪些手段原理是什么微调方法需要从三个维度看一是用什么信号训练二是更新哪些参数三是用什么工具落地。SFT、DPO、RLHF 主要描述训练信号和优化过程全量微调、LoRA、Adapter 等主要描述参数更新方式而 LLaMA-Factory、ms-swift、TRL 等框架则负责把前两者变成一条真正能跑起来的命令。三者是不同层面的问题因此 SFT 与 LoRA 可以组合使用并不是二选一同一个 LoRA SFT 方案也可以用不同框架跑出来。1. 按训练信号划分SFT、DPO、RLHF1SFT学习示范答案SFT也就是监督微调说白了就是给模型看成对的题目—标准答案。比如你让它做翻译就喂给它一万组中文句子 → 正确英文译文让它回答问题就喂一万组提问 → 高质量回答。模型一篇篇地学慢慢就摸清了遇到这类问题该怎么开口、说到什么程度、用什么语气。对于图文任务输入条件中还包含图片。实现时应明确哪些 token 参与损失计算可只监督目标回答并屏蔽提示词与 padding具体配置取决于训练器、数据格式和聊天模板。参见 TRL SFT Trainer 文档。适用重点有明确的标准答案希望模型稳定执行分类、抽取、回答或输出规范。2DPO 与 RLHF学习偏好有些问题没有唯一正确答案只有好一点和差一点的区别比如回答的语气、详略、安全边界。这时可以准备成对样本同一个问题的两个回答标注哪个更好让模型拉开两者的概率差距。DPO 直接在成对偏好数据上优化不需要单独训练奖励模型RLHF 的传统路线则先训练奖励模型再用强化学习如 PPO优化策略。工程上一般先做 SFT 让模型会做再用偏好优化让它做得更合意。适用重点模型已经能完成任务但希望调整风格、详略、礼貌程度或安全边界。这一步应由 SFT 之后的剩余问题决定不建议跳过 SFT 直接上偏好优化。2. 按参数更新方式划分1全量微调更新全部参数全量微调允许模型所有参数参与更新调整空间较大但训练时还要承担梯度、优化器状态与激活值等开销。它通常比仅训练少量参数需要更多GPU资源也需要认真控制学习率和训练时长。是否采用全量微调应通过任务收益与训练、部署成本共同判断而不是把“更新更多参数”等同于“效果一定更好”。业务场景中一般不优先采用。2LoRA学习低秩的权重增量LoRA 冻结原始权重在选定的权重矩阵上增加低秩更新W ′ W 0 α r B A WW_0\frac{\alpha}{r}BAW′W0​rα​BA假设原矩阵大小为d × k新增矩阵分别为r × k和d × r可训练参数由该矩阵全量更新时的dk变为r(dk)。当r很小时需要训练的参数显著减少。参见 LoRA 论文。例如4096 × 4096矩阵有 16,777,216 个参数取r8时新增参数为 65,536 个约占 0.39%。这只是单个矩阵的计算不能直接推断整个模型显存也按同样比例下降。LoRA 中需要关注秩r、缩放参数alpha、目标模块和学习率。目标模块决定究竟在哪里学习更新实际训练前应检查可训练参数列表。3QLoRA量化基座再训练低秩参数QLoRA 在冻结的量化基座上训练低秩适配器。原始方法使用 NF4、双重量化和分页优化器等设计降低内存需求量化存储不意味着所有计算或所有可训练参数都使用 4 bit。它适合显存受限的实验但仍需核实具体模型与训练后端是否支持。量化误差、输入长度和激活值开销依然需要评估。4Adapter插入小型可训练模块Adapter 在模型中插入额外的小型网络冻结大部分原参数只训练这些模块。经典设计使用先降维、再升维的瓶颈结构通过残差方式修正中间表示。它便于为不同任务保存不同模块但新增模块通常需要参与推理不能一概认为可以像标准 LoRA 的线性增量一样直接合并进原权重。5Prompt Tuning / Prefix Tuning训练连续提示参数这类方法固定主体模型训练少量连续向量作为提示或前缀。它与手写提示词的区别在于这些向量通过优化学习而不是由人编写成自然语言。Prompt Tuning 通常学习输入端的提示嵌入Prefix Tuning 在注意力计算中引入可训练前缀常涉及各层的键值表示。参见 Prefix-Tuning 论文。这类方法可训练参数极少但表达能力也相对受限通常在模型规模较大、任务较轻量时才有性价比。3. 按工具层次划分用什么框架来做前面两节回答的是学什么和改哪里但真要跑起来还得落到具体工具上。目前的微调工具大致分三层它们不是互斥关系上层通常就构建在下层之上。1底层库Transformers / PEFT / TRLTransformers提供模型与 Processor多模态模型用它统一处理图像和文本的加载以及基础TrainerPEFT提供 LoRA、QLoRA、Prompt Tuning 等参数高效方法的实现也负责适配器的保存与合并TRL在Trainer之上封装了SFTTrainer、DPOTrainer、GRPOTrainer等自动处理聊天模板的应用、prompt 部分的损失掩码并与 PEFT 打通这三个库是大多数上层框架的共同底座。直接用它们写代码控制力最强、调试路径最短但数据处理、分布式配置、实验记录都要自己搭。对多模态任务TRL 的SFTTrainer要求数据集中带有图像列并会为视觉语言模型选用相应的数据整理器具体字段名与示例脚本以所用版本文档为准。参见 TRL SFT Trainer 文档。2一体化训练框架LLaMA-Factory / ms-swift / Unsloth这类框架把数据格式转换 模板应用 训练循环 评估 导出打包成配置文件或命令行适合少写代码、快速做多组对比实验。工具定位多模态支持较适合的场景LLaMA-Factory配置驱动YAML CLI Web UI支持 Qwen-VL 等多模态模型的 SFT想少写代码、用界面快速对比多组配置ms-swift魔搭社区训练与部署工具箱命令行为主提供 Qwen3-VL 的官方实践文档与 grounding 数据格式训练阿里系模型需要分别控制视觉塔与对齐层Unsloth重写关键算子降低显存、提升速度通过FastVisionModel微调视觉模型消费级显卡或追求更短的训练时间Qwen 官方qwen-vl-finetune模型发布方提供的训练脚本专为 Qwen-VL 系列设计希望与官方实现细节严格对齐LLaMA-Factory 覆盖预训练、SFT、奖励模型、DPO/PPO/KTO 等多种流程并支持从 16 比特全参到 2/4/8 比特 QLoRA 的多种精度以及 FlashAttention-2、Unsloth、Liger Kernel 等加速选项模型与算法覆盖较广参见 LlamaFactory 文档。ms-swift 官方文档则给出了 Qwen3-VL 的微调脚本与显存、耗时参考并支持把绝对坐标的标注自动转换为模型所需的归一化坐标参见 Qwen3-VL Best Practices。要注意的是这些框架的更新非常快具体参数名、默认值和对某型号的支持程度都必须以你锁定版本时的官方文档为准不能照搬命令。3把原理映射到框架配置理解方法之后关键是把概念翻译成框架里的开关。下表列出常见映射参数名称随框架而异请按所用版本核对原理概念框架中对应的配置项说明只监督回答部分completion_only_loss/assistant_only_loss/ 损失作用域决定哪些 token 参与损失屏蔽提问与 paddingLoRA 的秩与缩放lora_rankr、lora_alphaα缩放通常为α/rLoRA 插入位置lora_target/target_modules决定究竟在哪些权重矩阵上学更新是否训练视觉编码器freeze_vision_tower/freeze_vit视觉部分是否冻结应由实验决定是否训练图文对齐层freeze_multi_modal_projector/freeze_aligner与视觉塔分开控制是否量化基座QLoRA / 4-bit 加载开关降低存储开销需核实后端是否支持图像 token 预算image_max_pixels/image_min_pixels直接关系显存占用与细节保留训练多模态模型时冻结视觉塔、只训练语言部分和对齐层是一个常见起点而不是必须遵守的规则。若任务依赖极细的视觉特征是否放开视觉部分应当用实验回答。4选择框架的几条经验先跑通再优化。第一轮用一体化框架把基线跑通比一开始就在底层库里搭管线更划算看模型来源。训练 Qwen 系列优先看官方脚本与 ms-swift跨模型、跨任务对比时LLaMA-Factory 这类统一接口的框架更省事看硬件。显存紧张时考虑 Unsloth 或 QLoRA但量化误差要单独评估锁定版本组合。transformers、peft、trl、accelerate、flash-attn是一组需要互相匹配的版本集合升级其中一个应连带验证其余不要只升一个框架不能替你解决的问题。数据质量、标注一致性、评估指标设计、聊天模板是否一致、可训练参数列表是否符合预期——这些才是决定成败的部分换框架也不会自动变好4. 如何理解这些方法的关系方案监督信号参数更新方式可选框架含义全量 SFT标准答案全量更新Transformers / 各框架 full 模式用示范调整整个模型LoRA SFT标准答案低秩适配器LLaMA-Factory / ms-swift / TRL PEFT / Unsloth用较少可训练参数学习任务QLoRA SFT标准答案量化基座加低秩适配器各框架的 4-bit QLoRA 选项在降低基座存储开销的条件下学习任务LoRA DPO成对偏好低秩适配器TRLDPOTrainer/ LLaMA-Factory用少量可训练参数调整回答偏好对于初次业务实验可以先验证提示词基线再考虑 LoRA SFT若显存不足且工具链支持再评估 QLoRA。工具选择上先用一体化框架跑通最小闭环再决定是否下沉到底层库定制。是否进一步做偏好优化应由剩余问题决定。四、微调的具体实例Qwen3-VL 仪表读数识别本节是完整的教学案例设计不是两段视频中的已核实实验也没有实际训练成绩。1. 定义任务与验收规则输入一张仪表照片输出可读性、读数与单位。任务只判断图中可见信息不根据经验猜测。可读时输出{readable:true,value:0.62,unit:MPa}无法识别时输出{readable:false,value:null,unit:null}在标注之前先约定数值误差容限、单位规范、多仪表处理方式以及反光遮挡时的可读性标准。否则不同标注人员可能为同一图片给出不同答案。2. 建立原模型基线用固定提示词让未微调模型处理一组代表性图片保存原始回答和解析结果。检查错误主要来自哪里读错数字、单位混淆、漏字段还是图片不可读却仍输出数值。如果只是 JSON 格式不稳定应先验证结构化输出约束如果图像细节缺失应先调整采集或预处理。只有明确剩余问题后续训练才有具体目标。3. 准备图文标注数据下面的结构参考 QwenVL 官方微调格式图片名称与答案为自行设计未附带实际图片{image:images/gauge_0001.jpg,conversations:[{from:human,value:image\n读取仪表数值和单位只返回JSON包含readable、value、unit。无法识别时readable为false其余字段为null。},{from:gpt,value:{\readable\:true,\value\:0.62,\unit\:\MPa\}}]}官方框架要求媒体标记与文件对应并提供数据集注册与训练入口。使用其他框架时应转换为对应格式。参见 QwenVL 官方微调文档。不同框架的数据格式并不通用换框架的第一件事就是做格式转换框架数据形态要点Qwen 官方qwen-vl-finetuneimageconversationsfrom/value如上例需在dataset_info中注册数据集ms-swiftmessagesimages的 JSONL图像以路径列表给出支持 grounding 的objects字段LLaMA-Factoryinstruction/input/output/images需在dataset_info.json中声明列映射TRLSFTTrainermessages列 images列消息为role/content结构内容里可嵌套图像同一个任务在不同框架里换格式容易出错的地方往往不是字段改名而是图像路径解析失败被静默跳过。转换后应抽样检查图像是否真的被读入而不是只看数据集条数对不对。数据应覆盖清晰、倾斜、反光、遮挡、不同量程以及不含目标的图片。无法确定答案的图片不能硬标成某个读数。划分训练集、验证集和测试集时应按设备或采集批次分组避免同一设备的近重复照片同时出现在训练与测试中。测试集应在调参前固定。4. 选择训练方案本案例可将 LoRA SFT 作为第一轮实验方案冻结基座在经过确认的语言模块中加入 LoRA用图文示范训练目标回答。视觉部分是否需要训练应由实验决定不能只凭模块后缀判断冻结范围。以下是方案示意不是可直接执行的框架配置也不是最佳参数# 教学方案必须映射到实际训练框架的配置项objective:sftadaptation:lorainput:image_and_instructionoutput:structured_jsontrain_scope:verified_language_modulesvision_backbone:frozen_for_first_experimentloss_scope:assistant_responseselection_metric:validation_task_metrics框架选择本案例训练 Qwen3-VL可优先使用 ms-swift官方文档提供 Qwen3-VL 的微调实践或 LLaMA-Factory界面化便于对比多组配置若需要与官方实现严格对齐则使用qwen-vl-finetune脚本。三者都能实现LoRA SFT 冻结视觉塔这个方案差别在于配置方式和可控程度。下面是两条命令示意仅用于说明参数结构参数名与取值必须按你锁定版本的官方文档核对# 示意ms-swift 风格CUDA_VISIBLE_DEVICES0swift sft\--modeldeepseek-ai/DeepSeek-R1-Distill-Qwen-7B\--train_typelora\--datasetAI-ModelScope/alpaca-gpt4-data-zh#500\--torch_dtypebfloat16\--num_train_epochs1\--per_device_train_batch_size1\--gradient_accumulation_steps16\--learning_rate1e-4\--lora_rank8--lora_alpha32\--target_modulesall-linear\--max_length2048\--output_diroutput# 示意LLaMA-Factory 风格YAML 片段stage:sftfinetuning_type:loralora_rank:8lora_alpha:16lora_target:allfreeze_vision_tower:truefreeze_multi_modal_projector:true# 是否放开应由实验决定template:qwen3_vl_nothink# 模板名随版本变化须核对image_max_pixels:589824跑之前先确认一件事训练时的模板、图像预处理与推理时必须完全一致。用qwen3_vl_nothink这类模板训练、却按默认思考模式推理或者训练时压缩到 32×32、推理时给原图都会让效果凭空变差。记录模型与处理器版本、聊天模板、图像处理预算、学习率、LoRA 设置和随机种子。不要直接照搬其他模型的分辨率规则或训练命令。5. 先检查管线再正式训练用少量样本检查以下事项图片是否成功读取图像是否实际进入模型答案是否被截断损失标签是否有效预期的 LoRA 参数是否获得梯度。其中冻结范围尤其要用代码验证而不是相信配置项。训练开始前打印一次可训练参数列表确认视觉塔确实没被更新、LoRA 确实插在了预期的模块上# 打印实际参与训练的参数确认冻结范围与训练范围trainable[(n,p.numel())forn,pinmodel.named_parameters()ifp.requires_grad]print(f可训练参数量:{sum(n_for_,n_intrainable):,})forname,numelintrainable[:10]:print(f{name}:{numel:,})许多训练没效果的问题根因都是这里LoRA 加在了名字相似但并非预期的模块上或者视觉塔被意外放开导致过拟合。随后执行正式训练定期在验证集上评估。若训练损失继续下降验证表现却恶化应检查过拟合或数据分布问题并比较更早的检查点。每轮实验尽量只改变一个主要因素例如补充反光样本或调整图像处理预算方便判断改进原因。6. 保存、加载与交付保存适配器后应在新进程中加载相同基座和处理器再次运行固定样本确认结果可复现。不要只在训练进程里原地测试——那里的模型状态、随机数和显存布局都与真实部署不同。适配器与合并权重怎么选标准 LoRA 在受支持的条件下可以把增量合并回基座权重得到一个普通模型fromtransformersimportAutoModelForImageTextToTextfrompeftimportPeftModel baseAutoModelForImageTextToText.from_pretrained(Qwen/Qwen3-VL-4B-Instruct,torch_dtypetorch.bfloat16)modelPeftModel.from_pretrained(base,output/gauge-lora)mergedmodel.merge_and_unload()# 得到不含 PEFT 结构的普通模型merged.save_pretrained(output/gauge-merged)方式优点代价适合保持适配器独立文件小可在一份基座上切换多个适配器推理有额外计算开销还在迭代或多任务共用基座合并为单一模型无适配器开销可导出 GGUF 等通用格式得到完整大小的权重文件单一任务上线部署如果用了 QLoRA合并时要先把基座以 16 比特重新加载再合并最后一步才做量化。直接把适配器合进仍是 4 比特的基座合并结果会被重新量化适配器的细微修正会被抹掉效果可能明显变差。合并后的模型要重新跑一遍评估不能默认与适配器版本等价。相关机制参见 PEFT 文档。交付清单最终交付不仅包括权重还应包含框架名称与完整版本号transformers/peft/trl/ 框架本体 /flash-attn等可复现的训练配置YAML 或完整命令行数据版本、标注规范与数据集划分方式聊天模板与图像预处理参数评估结果、失败样本与随机种子有了这些别人才能在没有你环境的情况下复现结果。验收依据是模型在新图片上是否稳定完成任务而不是训练程序是否顺利运行结束。下一篇文章我们做个具体的实例微调qwenVL模型