LLaMA-Factory微调(二)一些注意点

该文章已生成可运行项目,

1.微调工具的选择

比较热门的就是LLaMA-Factory和Unsloth,当然还有其他的一些比如ms-SWIFT等,这里不做讨论。

LLaMA-Factory是一个功能丰富的大模型微调模型,支持主流的上百种大模型,具有友好的零代码微调的web UI界面,具备企业级应用场景、通用性场景、零代码微调场景等多场景功能。

而Unsloth,其适合资源受限场景,具备出色的内存优化能力和快速地微调速度,适合在消费级的资源受限的场景下使用,因此适用快速迭代的场景,个人进行快速地印证和开发。

具体对比如下:

对比维度LLaMA-FactoryUnsloth核心差异总结
定位目标全栈式微调平台(训练/评估/部署一体化)极致训练加速器(专注高效微调)广度 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等等,具体的含义如下(未能完全举例,仅做作参考)

后缀类型典型标识示例核心含义与技术实现适用场景与代表模型用户选择建议
蒸馏压缩类
--distillDistilBERT, DeepSeek-R1-Distill通过知识蒸馏技术压缩模型,保留核心能力移动端部署、低资源场景需平衡性能与效率时选用
--DistillVLMDistillVLM视觉语言模型的蒸馏变体,融合图文双模态知识轻量化图文理解任务多模态需求但资源受限时选用
多模态类
--VL​/--VLMVL-BERT, LLaVA-VL视觉语言模型,支持图像与文本联合理解图文问答、跨模态检索图文协同处理任务首选
--MM​/--MultiModalGPT-4V, DeepSeek-VL通用多模态模型,支持图像/视频/音频/文本处理复杂跨模态生成与推理全模态任务需求时选用
量化压缩类
--q4​/--q8Qwen-7B-GPTQ-Int4整数量化技术降低显存占用边缘设备部署显存<8GB选Q4,精度要求高选Q8
--fp16​/--bf16DeepSeek-R1-7B-fp16半精度浮点数加速推理云端高性能推理支持Tensor Core的GPU首选BF16
任务优化类
--instructQwen2.5-7B-Instruct指令微调模型,强化人类指令跟随能力对话代理、任务跟随需高指令遵从性时必选
--codeCodeLlama-13B代码生成优化,强化编程语法与逻辑代码补全、调试辅助开发者工具链集成首选
领域适配类
--medicalBioBERT-Medical医疗领域微调,增强医学术语理解电子病历分析、药物发现医疗NLP任务强制要求
--legalBERT-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%样本长度<400400-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无法降低,可以调大批处理大小,或者是陷入过拟合,需要进一步使用验证集进行验证。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值