1.微调工具的选择
比较热门的就是LLaMA-Factory和Unsloth,当然还有其他的一些比如ms-SWIFT等,这里不做讨论。
LLaMA-Factory是一个功能丰富的大模型微调模型,支持主流的上百种大模型,具有友好的零代码微调的web UI界面,具备企业级应用场景、通用性场景、零代码微调场景等多场景功能。
而Unsloth,其适合资源受限场景,具备出色的内存优化能力和快速地微调速度,适合在消费级的资源受限的场景下使用,因此适用快速迭代的场景,个人进行快速地印证和开发。
具体对比如下:
| 对比维度 | LLaMA-Factory | Unsloth | 核心差异总结 |
|---|---|---|---|
| 定位目标 | 全栈式微调平台(训练/评估/部署一体化) | 极致训练加速器(专注高效微调) | 广度 vs 深度:前者覆盖全流程,后者专精训练效率 |
| 架构设计 | - 模块化插件架构 - 兼容主流模型(LLaMA/Qwen/Gemma等) | - 手工优化GPU内核 - 深度定制Llama/Gemma架构 | 灵活性(适配广) vs 专精性(优化深) |
| 性能表现 | - 依赖FlashAttention-2加速 - 全参微调显存占用高 | ✅训练速度提升30倍 ✅显存降低90% | Unsloth在单任务微调上实现数量级效率优势 |
| 资源需求 | - 需A100/H100级GPU支持全参训练 - 支持边缘设备部署 | ✅消费级GPU可运行(如RTX 3090微调70B模型) | Unsloth大幅降低硬件门槛 |
| 功能覆盖 | ✅全算法支持:SFT/RLHF/DPO/多模态 ✅ 内置LLaVA/Qwen-VL | ❌ 仅支持LoRA/QLoRA ❌ 无RLHF/多模态 | LLaMA-Factory满足复杂研究需求 |
| 使用体验 | ✅ 零代码Web UI + 完整文档 ✅ 可视化监控训练过程 | ❌ 纯代码API调用 ✅ 极简API设计 | 非开发者首选LLaMA-Factory |
| 部署能力 | ✅ 内置API服务(LlamaDeployer) ✅ ONNX/TensorRT导出 | ❌ 依赖Hugging Face Pipelines ❌ 无专用部署工具 | LLaMA-Factory提供生产级流水线 |
| 典型应用场景 | - 企业级多任务系统(医疗/金融) - 学术全流程实验 | - 个人开发者快速迭代(24小时训练ChatGPT替代品) - 低成本A/B测试 | 企业选前者,个人/初创选后者 |
具体选择上,可以参考如下路径:

2.微调对象选择
不同的大模型有不同的标识,比如我们常常看到不同后缀,比如-Distill、-Math、-VL等等,具体的含义如下(未能完全举例,仅做作参考)
| 后缀类型 | 典型标识示例 | 核心含义与技术实现 | 适用场景与代表模型 | 用户选择建议 |
|---|---|---|---|---|
| 蒸馏压缩类 | ||||
--distill | DistilBERT, DeepSeek-R1-Distill | 通过知识蒸馏技术压缩模型,保留核心能力 | 移动端部署、低资源场景 | 需平衡性能与效率时选用 |
--DistillVLM | DistillVLM | 视觉语言模型的蒸馏变体,融合图文双模态知识 | 轻量化图文理解任务 | 多模态需求但资源受限时选用 |
| 多模态类 | ||||
--VL/--VLM | VL-BERT, LLaVA-VL | 视觉语言模型,支持图像与文本联合理解 | 图文问答、跨模态检索 | 图文协同处理任务首选 |
--MM/--MultiModal | GPT-4V, DeepSeek-VL | 通用多模态模型,支持图像/视频/音频/文本处理 | 复杂跨模态生成与推理 | 全模态任务需求时选用 |
| 量化压缩类 | ||||
--q4/--q8 | Qwen-7B-GPTQ-Int4 | 整数量化技术降低显存占用 | 边缘设备部署 | 显存<8GB选Q4,精度要求高选Q8 |
--fp16/--bf16 | DeepSeek-R1-7B-fp16 | 半精度浮点数加速推理 | 云端高性能推理 | 支持Tensor Core的GPU首选BF16 |
| 任务优化类 | ||||
--instruct | Qwen2.5-7B-Instruct | 指令微调模型,强化人类指令跟随能力 | 对话代理、任务跟随 | 需高指令遵从性时必选 |
--code | CodeLlama-13B | 代码生成优化,强化编程语法与逻辑 | 代码补全、调试辅助 | 开发者工具链集成首选 |
| 领域适配类 | ||||
--medical | BioBERT-Medical | 医疗领域微调,增强医学术语理解 | 电子病历分析、药物发现 | 医疗NLP任务强制要求 |
--legal | BERT-Legal | 法律文本优化,支持条款解析 | 合同审查、司法辅助 | 法律科技应用必需 |
一般来说通常使用的就是大模型的对话能力,也就是微调--instruct指令模型较多。具体在模型选择上,可参照以下路径:

3.微调阶段和方法选择
微调阶段主要有7种,一般微调选择的是SFT
| 微调方法 | 技术原理 | 典型应用场景 | 核心优势/局限 |
|---|---|---|---|
| SFT (监督微调) | 用标注数据(指令-回答对)直接训练模型 | - 基础任务对齐(翻译/摘要) - 领域知识注入(金融/医疗) | ✅ 实现简单,通用性强 ❌ 需大量高质量数据(千条级) |
| RM (奖励建模) | 训练模型预测人类偏好得分 | - 构建RLHF反馈系统 - 内容安全过滤 | ✅ 为强化学习提供优化目标 ❌ 需人工标注偏好数据(A/B测试) |
| PPO (近端策略优化) | 基于奖励模型反馈,通过强化学习优化策略 | - 对话系统优化(Llama 2-Chat) - 创造性任务生成 | ✅ 支持复杂交互优化 ❌ 训练不稳定,显存消耗高(SFT的2-3倍) |
| DPO (直接偏好优化) | 将奖励模型隐式编码至策略,用分类损失替代强化学习 | - 轻量化对齐(移动端) - 快速迭代场景 | ✅ 比PPO稳定10倍 ✅ 训练速度提升5倍 ❌ 偏好数据需严格清洗 |
| KTO (行为经济学优化) | 仅需二元偏好信号(好/坏) | - 低成本标注场景 - 社交媒体内容审核 | ✅ 标注成本降70% ✅ 抗噪声能力强 ❌ 对模糊偏好敏感 |
| ORPO (概率比优化) | 融合偏好概率比与SFT损失,单阶段训练 | - 低资源场景(百条样本) - 快速任务适配(如法律更新) | ✅ 无需独立奖励模型 ✅ 支持异构数据混合 ❌ 长文本优化效果有限 |
| PT (领域预训练) | 用领域语料继续预训练 | - 专业术语学习(生物医药) - 小语种扩展 | ✅ 解决领域OOV问题 ❌ 需TB级数据,算力消耗巨大 |
微调方法对应的就是选择LoRA微调,具体方法优劣势对比如下:
| 方法 | 技术原理 | 参数更新范围 | 优缺点对比 |
|---|---|---|---|
| FFT 全参数微调 | 解冻预训练模型所有权重并更新 | 100% 参数 | 传统方法,无特定优化,训练速度慢,更新全部参数容易造成灾难性遗忘 |
| Freeze冻结部分参数 | 通常只更新模型的顶层或少量关键参数,其余参数全部冻结 | <1% | 参数高效,快速部署,但是性能受限,灵活性差 |
| LoRA | 低秩分解:冻结原权重,注入可训练的低秩矩阵(W=W0+BA) | 0.1%-5% 参数 | 低秩适配器减少训练参数,训练速度快 |
| QLoRA | 量化+低秩:4-bit量化冻结权重(NF4格式),叠加低秩适配器 | 0.1%-5% 参数 | NF4量化+双量化+分页优化器,训练速度略慢于LoRA |
4.微调参数设置
坦白说,大模型微调参数设置比较依赖实际经验,这就是其往往被称为“玄学”或者“炼丹”的原因,一般来说,并不是所有的参数都需要自定义设置的,主要介绍以下几种核心参数:
学习率(learning_rate)
决定了微调时候模型的学习速度,一般来说过高会导致训练震荡,过低会导致收敛缓慢。这个参数并不会影响微调时候的显存大小,一般来说在SFT中LoRA微调中,控制在4e-5至5e-5之间,如果是FFT全参微调的话,最好比LoRA大一个数量级。
训练轮次(epochs)
训练轮次也就是模型训练的次数,如果轮次太少达不到训练效果,也就是loss函数收敛不明显,而轮次太大又会导致模型训练过拟合,需要提前终止训练。一般说,小数据集需要大轮次训练,防止模型训练不到位出现欠拟合,大数据集需要小轮次训练,防止模型过拟合,一般说领域注入类的监督微调训练3至5轮比较好,偏好对齐训练1至2轮即可,loss函数下降到0.5至1.5的训练轮次比较好。
单设备批处理大小(per_device_train_batch_size)
指的是模型训练过程中,每次更新模型参数时所使用的样本数量,如果这个参数较大可以提升训练稳定性,较低可以减低显存需求。这个参数实际上与梯度累积步数(gradient_accumulation_steps)相关,因为实际批处理大小是单设备批处理大小 * 梯度累积步数,资源受限情况下的这个乘积——也就是实际批处理大小,最好控制在64以下。
梯度累积步数(gradient_accumulation_steps)
指的是累积多少步后进行参数更新,通过步数控制,模拟进行大批次训练,控制显存下降。
截断长度(cutoff_len)
指的是决定了模型处理文本时能接收的最大Token数量,一般配置在1024至8192,该参数比较大,序列截断长度较长,可以保留更多上下文,增加显存消耗。如果你的数据集中每条数据长度不一,如果设置为4096,如果有一条数据是5000Tokens,那显存会出问题,训练会失败。也可以使用自带的length_cdf.py工具查看数据集中的数据长度。
python scripts/length_cdf.py \
--model_name_or_path "Qwen/Qwen1.5-7B" \ # 使用目标模型的 Tokenizer
--dataset "your_dataset" \ # 数据集名称(需在 data/dataset_info.json 注册)
--dataset_dir "data" \ # 数据集目录
--template "default" \ # 文本模板(与训练一致)
--interval 200 # 分组区间宽度(按需调整)
输出类似如下,也就是XX%的样本为XX的长度区间,比如下面就是将100%数据在长度999以下,因此cutoff_len可以设置为1024
长度区间 | 样本数 | 累积占比
-----------------------------
0-199 | 1200 | 24.0%
200-399 | 2500 | 74.0% ← 关键分位点(75%样本长度<400)
400-599 | 800 | 90.0%
600-799 | 300 | 96.0%
800-999 | 200 | 100.0%
LoRA秩(LoRA configurations)
秩相当于LoRA微调时表示低秩矩阵的维度,秩越低,更新方向越受限,但泛化性越强;秩越高,更新自由度越大,但可能引入噪声。按照下表,一般选择就是8,按照理论经验,90%任务在 r=8 时效果趋近饱和。
| 秩 ( r ) | 自由度 | 逼近原始能力 | 过拟合风险 | 适用场景 |
|---|---|---|---|---|
| 1-4 | 低 | 弱(仅捕捉主方向) | 极低 | 简单任务(文本分类) |
| 8-16 | 中 | 强(平衡主次方向) | 中等 | 主流任务(对话生成) |
| 32-64 | 高 | 极强(逼近全参微调) | 高 | 复杂任务(跨模态对齐) |
验证集比例
| 数据集规模 | 推荐比例 | 理论依据 |
|---|---|---|
| >10万样本 | 5%-10% | 大数据集验证集需保持统计显著性 |
| 1万~10万样本 | 10%-15% | 平衡评估可靠性与训练数据充足性 |
| <1万样本 | 15%-20% | 小数据集需更高比例防止过拟合 |
5.LOSS值的观察
loss函数的值是训练的关键指标,可以使用自带的SwanLab进行详细观察。典型的loss曲线情况如下:
第一是loss一直处于高位不下降,可能是学习率不够或者数据集没有规律
第二是loss有下降,但是一直不收敛,可能是训练数据集比较大,训练轮次不够,可以加大轮次,但是一般不要超过10次。
第三是loss一直在上下波动,跟上下坡爬山一样,很震荡。可能是学习率设置过大或者批处理大小过小,单次更新时梯度很不稳定
第四是loss有下降,但是收敛到某个值后就一直不下降收敛,可能是模型训练陷入局部最优,当前参数下loss无法降低,可以调大批处理大小,或者是陷入过拟合,需要进一步使用验证集进行验证。
一些注意点&spm=1001.2101.3001.5002&articleId=149138488&d=1&t=3&u=886212c744144080963cf2d265c0ae16)
7464

被折叠的 条评论
为什么被折叠?



