一、基础环境准备
最好使用NVIDIA CUDA的显卡
1.1 intel的显卡使用操作
(1)windows方案:
在终端/命令行里执行,不是在 Python 代码里执行。如果你是 Windows,按这个来:
-
打开 开始菜单
-
搜索 PowerShell 或 Windows Terminal
-
如果你用了 Conda,先激活环境:
-
conda activate llamafactory -
然后执行:
-
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu安装完后,再测试 A770 是否被 PyTorch 识别:
python -c "import torch; print(torch.__version__); print(torch.xpu.is_available()); print(torch.xpu.get_device_name(0) if torch.xpu.is_available() else 'no xpu')"如果输出里有 True,并显示 Intel Arc 之类的设备名,就说明装对了。
(2)下一步就是安装/进入 LLaMA-Factory。
建议不要在 C:\WINDOWS\system32 里继续操作,换到一个项目目录,比如:
cd D:\
mkdir ai
cd ai
然后执行:
git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git
cd LlamaFactory
pip install -e . pip install -r requirements/metrics.txt
装好后测试:
llamafactory-cli help
然后启动 Web UI:
llamafactory-cli webui
二、参数说明
2.1 微调方法的区别
(1)full:全参数微调
会改动模型几乎所有参数。效果潜力最大,但显存、时间、数据要求最高,也最容易把原模型能力训坏。适合资源很多、数据质量高、想深度改变模型行为的场景。
(2)freeze:冻结部分参数微调
只训练一小部分层,其他层不动。比 full 省资源,但可塑性也弱一些。适合想轻微适配,或者机器显存不够 full 的情况。
(3)lora:LoRA 微调
最常用。它不直接大改原模型,而是在模型里加一小组"可训练适配器"。训练快、省显存,最后得到的是一个 LoRA 权重文件。使用时通常是"基础模型 + LoRA"。
你截图里选的就是 lora,一般新手和大多数业务微调都推荐这个。
(4)oft:OFT 微调
也是参数高效微调的一种,思路是用正交变换去调整模型表示。它有时比 LoRA 更稳定、保留原模型能力更好,但生态和常用程度不如 LoRA。一般不是首选,除非你明确知道要用它。
简单对比:
| 方法 | 改动范围 | 资源需求 | 常用程度 | 适合 |
|---|---|---|---|---|
| full | 最大 | 最高 | 中 | 深度定制、大资源 |
| freeze | 中/小 | 中 | 中 | 轻量适配 |
| lora | 小 | 低 | 最高 | 大多数微调 |
| oft | 小 | 低/中 | 较少 | 特定参数高效微调 |
2.2 检查点路径是什么
"检查点"就是训练过程中或训练结束后保存下来的模型状态,英文叫 checkpoint。
它通常有这些作用:
-
从某个模型继续训练
比如你之前已经训练了 1000 步,现在想接着训,就填之前保存的检查点路径。
-
加载已经训练好的 LoRA / 模型权重
如果你不是从零开始微调,而是基于某个已有微调结果继续调,就填这里。
-
训练中断后恢复
比如电脑断电、程序崩了,可以从 checkpoint 恢复,不用重新开始。
-
选择某个阶段的效果
有时候第 800 步比第 2000 步效果好,检查点可以让你回到那个版本。
如果你是第一次训练,一般"检查点路径"可以不填。
如果你已经有之前训练出来的 LoRA 或 checkpoint,才需要填它。
2.3 量化等级
量化就是把模型权重从高精度压到低精度,目的是省显存。
none:不量化。显存占用最高,但最稳,效果损失最小。显存够的话优先选这个。
8bit 更省显存,效果通常损失较小。
4bit 最省显存,适合显存紧张时训练 LoRA,也就是常说的 QLoRA,但可能更慢或略有精度损失。
简单说:
| 值 | 显存占用 | 稳定性 | 适合 |
|---|---|---|---|
| none | 高 | 最好 | 显存够、追求稳定 |
| 8bit | 中 | 较好 | 想省显存 |
| 4bit | 最低 | 略弱 | 显存不够、QLoRA |
2.4 量化方法
这是选择用哪个库/算法来做量化。
bnb:BitsAndBytes。最常见,通常用于 4bit/8bit 量化,做 LoRA/QLoRA 时经常用它。
hqq:另一种量化方案,某些模型上速度或精度表现不错,但通用性不如 bnb。
eetq:偏推理量化,有些环境支持较好。
awq / gptq:更多用于已经量化好的模型推理,不一定适合训练。
2.5 对话模板
它决定训练数据会被包装成什么聊天格式。
比如同一条数据:
用户:帮我写一段摘要 助手:好的......
不同模型需要的格式不一样。有的模型要 <|user|>,有的要 <|im_start|>user,有的要 INST.../INST。
常见区别:
| 模板 | 适合模型 |
|---|---|
| qwen | Qwen / Qwen2 / Qwen2.5 / Qwen3 |
| llama2 | Llama 2 Chat |
| llama3 | Llama 3 / 3.1 Instruct |
| chatml | 使用 ChatML 格式的模型 |
| alpaca | Alpaca 风格指令数据 |
| baichuan | Baichuan 系列 |
这个选错会很影响效果。模型可能学不到正确的"用户/助手"关系,表现为回答格式怪、不会停、角色混乱。
2.6 RoPE 插值方法
RoPE 是模型处理位置信息的方法。RoPE 插值主要用于扩展上下文长度。
none:不扩展,使用模型原本的上下文长度。最稳。
linear:线性扩展上下文。简单直接,但长文本效果可能一般。
dynamic:动态缩放,通常比 linear 灵活。
yarn:常用于长上下文扩展,效果可能更好,但需要模型和配置支持。
ntk:另一类长上下文缩放方式,有些模型适配较好。
如果你只是普通微调,比如 2k、4k、8k 长度以内,通常选 none。
只有你想把模型训成支持更长上下文,比如 32k、64k,才考虑改它。
2.7 加速方式
这是训练时用什么底层优化来提速、省显存。
auto:自动选择,一般推荐。框架会根据你的环境、显卡、库版本自己决定。
none:不用特殊加速。最兼容,但可能慢。
flash_attn / fa2:FlashAttention,加速注意力计算,长文本训练很有用,显存也更省,但需要显卡和环境支持。
sdpa:PyTorch 自带的 scaled dot product attention,兼容性较好。
unsloth:一些训练框架里会有,LoRA 训练很快,但需要对应环境支持。
2.8 Train
训练/微调模型用的。你在这里选模型、数据集、LoRA/full、学习率、轮数、batch size 等,然后开始训练。
适合场景:你想让模型学你的数据、风格、任务格式,比如客服问答、文案风格、分类任务、领域知识回答。
2.9 Evaluate & Predict
评估和批量预测用的。
训练完后,用验证集/测试集看看模型效果,或者给一批输入,让模型批量生成输出。
适合场景:想知道训练效果好不好;比较不同 checkpoint 哪个更好;对一批样本做测试。
2.10 Chat
聊天测试用的。加载当前模型或训练好的 LoRA,直接对话,人工感受效果。
适合场景:训练完想快速试试模型回答是否符合预期;检查风格、语气、是否学会任务。
2.11 Export
导出模型用的。把训练好的 LoRA 或合并后的模型导出,方便部署、推理、分享或放到其他工具里用。
适合场景:训练满意后,要拿去部署;想把 LoRA 合并到基础模型;想导出成可加载的模型目录。
2.12 训练阶段
常见训练阶段大概有这些:
| 训练阶段 | 用途 | 适合场景 |
|---|---|---|
| Supervised Fine-Tuning / SFT | 学习标准问答、指令、风格 | 最常用,新手优先选 |
| Pre-Training | 继续预训练,学大量纯文本知识 | 有大量领域语料,比如法律、医学、代码 |
| Reward Modeling | 训练奖励模型 | 做 RLHF/DPO 前的偏好建模 |
| PPO | 强化学习微调 | 高阶对齐训练,普通用户很少用 |
| DPO | 偏好优化 | 有"好回答/坏回答"成对数据时用 |
| KTO / ORPO 等 | 也是偏好优化 | 想让模型更偏向某类回答 |
2.13 数据路径
截图里是 data,它表示训练程序去哪个文件夹找数据集配置和数据文件。一般是项目目录下的 data 文件夹。
比如可能是:项目目录/ data/ alpaca_zh_demo.json dataset_info.json
它的作用是告诉系统:"数据文件在这里,你去这个目录里找。"
2.14 数据集
它表示这次训练真正使用哪个数据集。alpaca_zh_demo 通常是一个中文 Alpaca 格式的演示数据集,用来测试流程是否能跑通。
它的作用是决定模型学什么。
比如你选:
alpaca_zh_demo:模型学演示问答数据。
my_customer_service:模型学你的客服数据。
my_writer_style:模型学你的文案风格数据。
law_qa:模型学法律问答数据。
2.15 学习率
控制模型每一步改动多大。
| 设置 | 效果 | 风险 |
|---|---|---|
| 太大 | 学得快 | 容易训崩、回答变怪 |
| 太小 | 稳 | 学得慢,可能学不进去 |
| 合适 | 稳定学到风格/任务 | 最理想 |
常见建议:
| 场景 | 推荐 |
|---|---|
| LoRA 微调 | 1e-4 到 5e-5 |
| 数据很少,怕过拟合 | 5e-5 或 2e-5 |
| full 全参数微调 | 1e-5 到 2e-5 |
| 只想轻微学风格 | 2e-5 到 5e-5 |
2.16 训练轮数
模型把数据集完整看几遍。
你现在是 20,意思是整份数据重复训练 20 遍。
| 轮数 | 效果 |
|---|---|
| 太少 | 学不充分 |
| 适中 | 学到规律 |
| 太多 | 过拟合,变成背答案 |
常见建议:
| 数据量 | 推荐轮数 |
|---|---|
| 100 条以内 | 10-30 |
| 几百条 | 5-15 |
| 几千条 | 2-5 |
| 几万条 | 1-3 |
如果你现在用的是 demo 数据,20 可以跑测试。如果是正式数据,数据越多,轮数通常越少。
2.17 最大梯度范数
防止训练时参数更新突然过大,相当于"刹车"。
你现在是 1.0,很常见。
| 值 | 效果 |
|---|---|
| 0 或不限制 | 可能训练不稳定 |
| 0.5 | 更保守 |
| 1.0 | 常用、稳定 |
| 2.0 | 放宽限制 |
一般保持 1.0 就行。训练 loss 爆炸、突然变 NaN 时,可以降到 0.5。
2.18 最大样本数
总共最多拿多少条数据参与训练,最多使用多少条训练样本。
你现在是 500,意思是最多拿 500 条数据训练。
作用:快速测试流程、限制训练时间、抽样小规模训练。
| 场景 | 设置 |
|---|---|
| 只是试跑流程 | 100-500 |
| 小数据正式训练 | 填全部数量或 0/空 |
| 大数据先实验 | 1000-5000 |
| 正式训练 | 不限制,使用全量数据 |
2.19 计算类型
控制训练时用什么数值精度。
| 类型 | 特点 | 适合 |
|---|---|---|
| fp32 | 最稳,显存最大 | 很少用于大模型微调 |
| fp16 | 省显存,速度快 | 老显卡常用 |
| bf16 | 比 fp16 更稳定 | 新显卡优先 |
| fp8 | 更省更快 | 新硬件/高级场景 |
一般建议:
| 显卡 | 推荐 |
|---|---|
| RTX 30/40 系列 | bf16 通常可用 |
| A100/H100 | bf16 |
| 较老显卡 | fp16 |
| 不确定/报错 | 换 fp16 或 fp32 |
bf16 是很好的选择,前提是显卡支持。
2.20 截断长度
每条样本最多保留多少 token。超过就截掉。
它会影响两件事:训练能看到多长的上下文;显存占用多少。
| 长度 | 适合 |
|---|---|
| 512 | 短问答、分类、简单指令 |
| 1024 | 普通对话、较长回答 |
| 2048 | 长文案、长问答 |
| 4096+ | 长上下文任务,显存压力大 |
如果你的数据是短问短答,512 够用。如果你训练长文案、长客服对话、知识问答,建议 1024 或 2048。
2.20 批处理大小
每张 GPU 一次处理多少条样本。
| 值 | 效果 |
|---|---|
| 小 | 省显存,但训练慢、波动大 |
| 大 | 更快更稳,但吃显存 |
显存不够就降低它。比如报 CUDA out of memory,就从 2 降到 1。
2.21 梯度累积
把多次小 batch 的梯度攒起来,再更新一次。
实际有效 batch size 大概是:
有效 batch size = 批处理大小 × 梯度累积 × GPU 数量
你现在如果是 1 张 GPU:
2 × 8 × 1 = 16
常见建议:
| 显存情况 | batch size | 梯度累积 |
|---|---|---|
| 显存小 | 1 | 8-16 |
| 显存中等 | 2 | 4-8 |
| 显存大 | 4-8 | 2-4 |
你现在 2 + 8 是比较稳的配置。
2.22 验证集比例
从训练数据里切多少出来做验证,不参与训练。
你现在是 0,表示不划分验证集。
| 值 | 含义 |
|---|---|
| 0 | 不验证,只训练 |
| 0.05 | 5% 数据做验证 |
| 0.1 | 10% 数据做验证 |
| 0.2 | 20% 数据做验证 |
建议:
| 场景 | 设置 |
|---|---|
| 只是跑通流程 | 0 可以 |
| 正式训练 | 0.05 或 0.1 |
| 数据很少 | 0 或单独准备验证集 |
| 想看是否过拟合 | 0.1 |
如果你想知道模型有没有越训越差,建议设 0.05 或 0.1。
2.23 学习率调节器
控制学习率在训练过程中怎么变化。
| 类型 | 特点 |
|---|---|
| constant | 学习率一直不变 |
| linear | 逐渐下降 |
| cosine | 先高后平滑下降,常用 |
| polynomial | 多项式下降 |
| inverse_sqrt | 适合某些大规模训练 |
| reduce_on_plateau | 指标不变好时降低学习率 |
一般建议:
| 场景 | 推荐 |
|---|---|
| LoRA/SFT 常规训练 | cosine |
| 想简单稳定 | linear |
| 数据很少、训练步数很少 | constant 或 cosine |
| 大规模训练 | cosine/linear |
你现在 cosine 是常用且合理的。
一套好用默认值
如果你是用 LoRA 训练中文问答/风格数据,可以先这样:
学习率:5e-5
训练轮数:3-10,数据很少才到 20
截断长度:512 或 1024
批处理大小:1 或 2
梯度累积:8 或 16
最大梯度范数:1.0
验证集比例:0.05
计算类型:bf16,报错就 fp16
学习率调节器:cosine
最大样本数:正式训练不要限制
三、其他参数设置板块
3.1 日志间隔
意思是:每训练多少个 step 输出一次日志。
比如:日志间隔 = 5,就是每训练 5 步打印一次 loss、学习率、训练速度等信息。
影响:
| 值 | 效果 |
|---|---|
| 小,比如 1-5 | 日志更密,方便观察,但略微影响速度 |
| 大,比如 50-100 | 日志少,界面更清爽 |
| 太大 | 不方便及时发现 loss 异常 |
建议:测试时用 5 或 10;正式训练可以用 10-50。
3.2 保存间隔
意思是:每训练多少个 step 保存一次 checkpoint。
比如:保存间隔 = 100,就是每 100 步保存一次模型/LoRA 检查点。
影响:
| 值 | 效果 |
|---|---|
| 小 | 保存更频繁,不容易丢进度,但占硬盘 |
| 大 | 省硬盘,但中断后可能损失更多进度 |
| 太小 | checkpoint 太多,占空间,训练也会被保存操作打断 |
建议:
| 场景 | 推荐 |
|---|---|
| 小数据试训 | 50-100 |
| 正式训练 | 200-1000 |
| 训练很久,怕中断 | 适当小一点 |
| 硬盘紧张 | 大一点,或限制保存数量 |
2.26 预热步数
预热步数就是训练刚开始时,不直接用完整学习率,而是从很小的学习率慢慢升上去。
作用:让训练开头更稳定。
比如:预热步数 = 100,就是前 100 步慢慢升学习率。
影响:
| 值 | 效果 |
|---|---|
| 0 | 不预热,直接开始训练 |
| 小比例预热 | 更稳定 |
| 太大 | 前面学得太慢 |
建议:
如果训练总步数很少,0 也可以。
正式训练建议用总步数的 3%-10%。
比如总共 1000 步:
预热步数:30-100
如果训练一开始 loss 波动很大、容易崩,可以加预热。
3.3 NEFTune 噪声参数
你现在是 0,表示不开启。
NEFTune 是一种训练增强技巧,会给 embedding 加一点噪声,让模型不那么死记硬背,可能提升泛化能力。
影响:
| 值 | 效果 |
|---|---|
| 0 | 不启用 |
| 1-5 | 轻微增强 |
| 5-10 | 更强噪声,可能提升泛化,也可能影响稳定 |
适合:数据少、容易过拟合、想让模型更泛化时可以试。
不适合:你想让模型严格记住格式、术语、固定答案时,不建议乱开。
建议:新手保持 0。如果小数据过拟合明显,可以试 5。
3.4 额外参数
这是传给训练器的额外 JSON 参数。
optim 是优化器,决定模型怎么根据梯度更新参数。
adamw_torch 是 PyTorch 自带 AdamW,稳定、通用。
常见优化器:
| 参数 | 特点 |
|---|---|
| adamw_torch | 稳定通用,推荐 |
| adamw_bnb_8bit | 更省显存,需要 bitsandbytes |
| paged_adamw_8bit | QLoRA 常用,省显存 |
| sgd | 很少用于大模型微调 |
| adafactor | 省显存,但调参更讲究 |
建议:
普通 LoRA:adamw_torch 可以。
显存紧张、4bit QLoRA:可以考虑 paged_adamw_8bit 或 adamw_bnb_8bit。
2.28 序列打包
把多条短样本拼成一个长样本训练。
作用:提高训练效率,减少 padding 浪费。
适合:
| 场景 | 是否开启 |
|---|---|
| 数据都是短问答 | 可以开 |
| 数据长度差异很大 | 可以开 |
| 多轮对话、格式很重要 | 谨慎 |
| 新手试训 | 可先不开 |
影响:开了以后训练更快、显存利用更好,但如果数据格式处理不好,可能让样本之间互相影响。
3.5 使用无污染打包
这是对"序列打包"的增强,避免拼接后的不同样本之间互相注意到对方。
简单说:
普通打包可能把 A 样本和 B 样本拼一起,模型训练时可能"看到"不该看的上下文。
无污染打包会尽量隔离它们。
建议:
如果开启"序列打包",最好也开启"使用无污染打包"。
如果不开序列打包,这个通常没意义。
3.6 学习提示词
不在提示词部分添加掩码,仅适用于 SFT。
简单理解:
默认 SFT 通常只让模型学习"助手回答",不让它学习"用户问题/提示词"。
开启后,模型也会学习提示词部分。
一般不建议开。
适合:你确实希望模型学会完整文本格式,包括用户提示词的写法。
不适合:普通问答、客服、助手训练。因为你主要想让模型学会怎么回答,而不是复读用户输入。
3.7 不学习历史对话
只学习最后一轮对话,仅适用于 SFT。
比如一条多轮数据:
用户1 助手1 用户2 助手2 用户3 助手3
开启后,只主要学习最后的 助手3。
适合:多轮对话数据里,最后一轮才是你最关心的答案。
不适合:你希望模型学习完整多轮对话能力。
建议:
单轮数据无所谓。
多轮客服/角色对话,通常不开。
如果历史对话质量参差不齐,只想学最后答案,可以开。
3.8 更改词表大小
更改分词器词表和 embedding 大小。
通常用于你添加了新 token。
比如加了:
<tool> </tool> <image>
这类特殊 token,就可能需要调整词表大小。
新手一般不要开。
乱开可能导致加载模型或导出模型出问题。
3.9 使用 LLaMA Pro
只训练扩展后的参数。
这是比较特殊的训练方式,和 LLaMA Pro 架构/扩展参数有关。普通 LoRA/SFT 基本不用。
建议:除非你明确知道自己在做 LLaMA Pro,否则不要开。
3.10 启用思考模式
你截图里开启了。
这个一般是针对带 reasoning / thinking 格式的模型,比如某些 Qwen、DeepSeek、推理模型,让训练或对话时使用"思考模式"。
作用:让模型按带思考链的格式训练/推理,可能会输出或内部使用类似"思考过程"的结构。
适合:
| 场景 | 建议 |
|---|---|
| 训练推理模型 | 可以开 |
| 数据里包含思考过程 | 可以开 |
| 普通客服/文案/摘要 | 不一定需要 |
| 不想模型啰嗦思考 | 关闭 |
如果你的训练数据没有"思考过程",只是普通问答,开启它不一定有帮助。
3.11 启用外部记录面板
用于记录训练实验,比如 loss 曲线、学习率曲线、显存、评估指标。
常见选项:
| 值 | 作用 |
|---|---|
| none | 不记录 |
| tensorboard | 本地记录,适合自己看 |
| wandb | Weights & Biases 云端记录,适合团队/远程 |
建议:
简单训练选 none。
想看曲线、比较多个实验,选 tensorboard。
团队协作或远程实验管理,选 wandb。
比较推荐的新手设置
普通 LoRA/SFT 微调:
日志间隔:5 或 10
保存间隔:100-500
预热步数:总步数的 3%-10%,不知道就 0 或 50
NEFTune:0
额外参数:{"optim": "adamw_torch"}
序列打包:短数据多可以开
无污染打包:开了序列打包就开
学习提示词:不开
不学习历史对话:普通多轮不开
更改词表大小:不开
使用 LLaMA Pro:不开
启用思考模式:普通问答不开,推理数据才开
外部记录面板:none 或 tensorboard
下面这块叫部分参数微调设置 ,主要用于 freeze 这种微调方法:只训练模型的一部分层/模块,其它参数冻结不动。
如果你当前用的是 LoRA,这几个参数通常不是最关键;如果你选择的是 freeze,它们就很重要。
四、部分参数微调设置
4.1 可训练层数
意思是:允许训练多少层模型。
大模型通常有很多层,比如 32 层、40 层、80 层。
这个参数控制只训练其中几层。
说明里写的:
最末层(+)/最前端(-)可训练隐藏层的数量
意思是:
| 设置 | 含义 |
|---|---|
| 2 | 训练最后 2 层 |
| 4 | 训练最后 4 层 |
| -2 | 训练最前面 2 层 |
| -4 | 训练最前面 4 层 |
| 0 | 可能表示不训练隐藏层,具体看工具实现 |
一般后面的层更接近输出风格、任务表达;前面的层更接近底层语言特征。
建议:
| 场景 | 推荐 |
|---|---|
| 轻微改风格/格式 | 1-2 |
| 领域问答/客服适配 | 2-4 |
| 想更明显改变能力 | 4-8 |
| 数据很少 | 1-2 |
| 数据多、显存够 | 4+ |
| 新手 | 2 |
影响:
| 层数越少 | 层数越多 |
|---|---|
| 更省显存 | 更吃显存 |
| 更不容易训坏 | 可塑性更强 |
| 学得浅 | 学得深 |
| 适合小数据 | 需要更多数据 |
4.2 可训练模块
意思是:在可训练层里,哪些模块允许训练。
模型一层里面有很多模块,比如注意力模块、MLP 模块、输出层等。这个参数决定训练哪部分。
all 表示这些可训练层里的所有模块都训练。
常见模块名可能有:
q_proj k_proj v_proj o_proj gate_proj up_proj down_proj embed_tokens lm_head
大概区别:
| 模块 | 作用 |
|---|---|
| q_proj/k_proj/v_proj/o_proj | 注意力相关,影响模型理解上下文 |
| gate_proj/up_proj/down_proj | MLP 相关,影响知识、表达和变换能力 |
| embed_tokens | 词嵌入,影响新词/token |
| lm_head | 输出头,影响最终生成词分布 |
| all | 全部训练 |
建议:
| 场景 | 推荐 |
|---|---|
| 不确定 | all |
| 想省显存 | 只训 q_proj,v_proj 或注意力模块 |
| 想更强适配 | all |
| 加了新特殊 token | 可能需要 embed_tokens,lm_head |
| 普通 freeze 微调 | all 搭配少量层 |
注意:模块名必须和模型内部名字一致,写错会导致没训到或报错。
4.3 额外模块(非必填)
这个是:除了上面可训练层之外,额外指定一些模块也参与训练。
比如你可训练层数设为 2,只训练最后 2 层。
但你还希望输出头 lm_head 也训练,就可以在这里填:
lm_head
如果多个模块,用英文逗号分隔:
embed_tokens,lm_head
适合场景:
| 场景 | 额外模块 |
|---|---|
| 添加了新 token | embed_tokens,lm_head |
| 想让输出风格变化更明显 | lm_head |
| 只训练少量层但希望适应新词 | embed_tokens |
| 普通训练 | 留空 |
影响:
| 填得越多 | 结果 |
|---|---|
| 可训练参数更多 | 更吃显存 |
| 适配能力更强 | 更容易过拟合 |
| 训练更慢 | 需要更好数据 |
这三个组合怎么理解
比如:
可训练层数:2 可训练模块:all 额外模块:空
意思是:
只训练模型最后 2 层里的所有模块,其它层冻结。
如果是:
可训练层数:4 可训练模块:q_proj,v_proj 额外模块:lm_head
意思是:
训练最后 4 层里的 q_proj 和 v_proj,另外再训练 lm_head。
如果是:
可训练层数:2 可训练模块:all 额外模块:embed_tokens,lm_head
意思是:
训练最后 2 层全部模块,同时词嵌入和输出头也训练,适合加了新 token 的情况。
怎么设置合适
普通新手/小数据:
可训练层数:2 可训练模块:all 额外模块:空
数据稍多,想适配更明显:
可训练层数:4 可训练模块:all 额外模块:空
显存紧张:
可训练层数:2 可训练模块:q_proj,v_proj 额外模块:空
加了特殊 token:
可训练层数:2 可训练模块:all 额外模块:embed_tokens,lm_head
这块更多是给 freeze 部分参数微调用的。
五、LoRA 参数设置
这是 LoRA 参数设置。LoRA 的核心思路是:不直接大改原模型,而是在一些层上加"小适配器"。这些参数决定适配器有多大、训得多猛、加在哪些模块上。
5.1 LoRA 秩
也叫 rank、r。它决定 LoRA 适配器的容量大小。
| 值 | 效果 |
|---|---|
| 小,比如 4/8 | 省显存、不容易过拟合,但学习能力弱一些 |
| 中,比如 16/32 | 适配能力更强,常用 |
| 大,比如 64+ | 更能学复杂任务,但吃显存、容易过拟合 |
建议:
| 场景 | 推荐 |
|---|---|
| 小数据、风格微调 | 8 |
| 普通问答/客服/指令微调 | 8-16 |
| 复杂领域任务 | 16-32 |
| 数据很多、显存足 | 32-64 |
一般新手用 8 或 16 就行。
5.2 LoRA 缩放系数
也叫 alpha。它控制 LoRA 适配器对原模型的影响强度。
通常会设成:
alpha = rank 的 2 倍
比如:
rank 8 -> alpha 16 rank 16 -> alpha 32
| alpha 越小 | alpha 越大 |
|---|---|
| 改动更温和 | 影响更强 |
| 更稳 | 更容易学进去 |
| 可能学不明显 | 可能训过头 |
建议:
| LoRA 秩 | 缩放系数 |
|---|---|
| 8 | 16 |
| 16 | 32 |
| 32 | 64 |
5.3 LoRA 随机丢弃
也叫 dropout。训练时随机丢掉一部分 LoRA 连接,防止过拟合。
| 值 | 效果 |
|---|---|
| 0 | 不丢弃,学得更充分 |
| 0.05 | 轻微防过拟合 |
| 0.1 | 更强正则 |
| 0.2+ | 可能影响学习,不常用 |
建议:
| 场景 | 推荐 |
|---|---|
| 数据少,容易背答案 | 0.05-0.1 |
| 数据较多 | 0 或 0.05 |
| 只做风格微调 | 0.05 |
| 想让模型强记格式 | 0 |
新手可以设 0.05,比 0 更稳一点。
如果数据很多,0 也可以。
5.4 LoRA+ 学习率比例
LoRA+ 是一种给 LoRA 的 A/B 矩阵设置不同学习率的方法。
你现在是 0,表示不开启 LoRA+。
| 值 | 含义 |
|---|---|
| 0 | 不启用 |
| 4/8/16 | 启用 LoRA+,设置学习率比例 |
作用:可能让 LoRA 学得更快、更好,但属于进阶参数。
建议:
普通训练保持 0。
如果你知道要用 LoRA+,可以试 16。
新建适配器
如果勾选,就是重新创建一个新的 LoRA 适配器。
如果不勾选,可能会加载已有适配器继续训练。
适合:
| 场景 | 是否勾选 |
|---|---|
| 第一次训练新的 LoRA | 勾选 |
| 从已有 LoRA 继续训练 | 不勾选 |
| 检查点路径已经是 LoRA,想接着训 | 不勾选 |
如果你没有加载已有 LoRA,通常应该勾选或保持默认自动新建。
5.5 使用 rsLoRA
rsLoRA 是 rank-stabilized LoRA,意思是"秩稳定版 LoRA"。
作用:当 LoRA rank 比较大时,让训练更稳定。
适合:
| 场景 | 是否开启 |
|---|---|
| rank 很小,如 8/16 | 可不开 |
| rank 较大,如 64/128 | 建议开 |
| 训练不稳定 | 可以试开 |
普通 rank=8 不开也没问题。
5.6使用 DoRA
DoRA 是 LoRA 的一种改进版,会把权重的"方向"和"幅度"分开学习。
作用:有时效果比 LoRA 更好,尤其低 rank 时可能更强。
缺点:更吃显存,训练/推理可能更慢,兼容性也要看框架。
建议:
| 场景 | 是否开启 |
|---|---|
| 普通训练 | 先不开 |
| 想追求更好效果 | 可以试 |
| 显存紧张 | 不建议 |
| 发现 LoRA 学不进去 | 可以试 DoRA |
使用 PiSSA
PiSSA 是另一种 LoRA 初始化/训练方法,通常可以让训练开始时更稳定、更快收敛。
作用:不是随机初始化 LoRA,而是用更有信息量的方式初始化。
缺点:初始化可能更耗时,对环境和模型支持有要求。
建议:
| 场景 | 是否开启 |
|---|---|
| 普通新手训练 | 先不开 |
| 想提升 LoRA 效果 | 可以试 |
| 数据少、希望更稳定 | 可尝试 |
| 只想快速跑通 | 不开 |
5.7 LoRA 作用模块
它决定 LoRA 加到模型哪些模块上。
常见模块:
q_proj k_proj v_proj o_proj gate_proj up_proj down_proj
含义大致是:
| 模块 | 影响 |
|---|---|
| q_proj/k_proj/v_proj/o_proj | 注意力层,影响理解上下文和对话关系 |
| gate_proj/up_proj/down_proj | MLP 层,影响知识表达、风格、任务转换 |
| all | 尽量给所有可支持模块加 LoRA |
建议:
| 场景 | 推荐 |
|---|---|
| 不确定 | 留空让工具自动选择 |
| Qwen/LLaMA 常规 LoRA | q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj |
| 显存紧张 | q_proj,v_proj |
| 想效果更好 | 上面 7 个都加 |
| 只做轻微风格 | q_proj,v_proj 或注意力四件套 |
如果工具支持 all,也可以用 all,但显存会更高。
5.8 附加模块
这个和 LoRA 作用模块不一样。
它表示除了 LoRA 层以外,还要额外训练某些原模型模块。
常见填:
embed_tokens,lm_head
适合场景:
你新增了特殊 token,或者调整了词表。
比如你加了:
<tool> </tool> <think> </think>
这时可能需要训练:
embed_tokens,lm_head
普通微调不建议填,留空即可。
5.9 推荐设置
普通中文问答/客服/文案 LoRA:
LoRA 秩:8 或 16
LoRA 缩放系数:16 或 32
LoRA 随机丢弃:0.05
LoRA+ 学习率比例:0
新建适配器:第一次训练勾选
rsLoRA:不开
DoRA:不开
PiSSA:不开
LoRA 作用模块:留空自动,或 q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
附加模块:空
显存紧张:
LoRA 秩:8 LoRA 缩放系数:16 LoRA 随机丢弃:0.05 LoRA 作用模块:q_proj,v_proj
想效果更强:
LoRA 秩:16 或 32
LoRA 缩放系数:32 或 64
LoRA 随机丢弃:0.05
LoRA 作用模块:q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
六、RLHF 参数设置
这组主要用于偏好优化训练,比如 DPO / PPO / ORPO / KTO,不是普通 SFT 的核心参数。
6.1 Beta 参数
控制偏好训练时"别偏离原模型太远"的强度。常见于 DPO。
beta 越大:越保守,更贴近原模型 beta 越小:越激进,更容易学偏好数据
建议:
| 场景 | 建议 |
|---|---|
| 普通 DPO | 0.1 |
| 数据质量很高,想学得更明显 | 0.05 |
| 怕模型被训歪 | 0.2-0.5 |
| 普通 SFT | 基本不用管 |
6.2 Ftx gamma
控制偏好训练时混入 SFT 损失的权重。
简单说:偏好训练容易只学"哪个回答更好",但可能忘掉原来的回答格式。Ftx gamma 可以让它同时保留一点 SFT 学习。
| 值 | 含义 |
|---|---|
| 0 | 不加 SFT 损失 |
| 0.1-1 | 加一点 SFT 约束 |
| 更大 | 更像 SFT,偏好优化效果变弱 |
建议:普通 DPO 可保持 0。如果 DPO 后模型格式乱、回答能力下降,可以试 0.1 或 0.5。
6.3 损失类型
偏好训练用哪种 loss。
常见区别:
| 类型 | 作用 |
|---|---|
| sigmoid | DPO 常用,稳定,默认推荐 |
| hinge | 更像间隔分类,要求好坏回答差距拉开 |
| ipo | IPO 方法,偏好优化另一种形式 |
| kto | KTO 训练用 |
| orpo | ORPO 训练用 |
| simpo | SimPO 训练用 |
建议:不知道就用 sigmoid。只有你明确选择某种训练阶段,比如 ORPO/KTO,才切对应 loss。
6.4 奖励模型
PPO 训练中用来判断回答好坏的模型或适配器路径。
作用:PPO 不是直接看"好答案/坏答案"训练,而是先让奖励模型给回答打分,再优化模型。
什么时候填:
只有做 PPO 时才需要。
普通 SFT、DPO 一般不用填。
6.5 归一化分数
PPO 里把奖励分数做标准化,避免奖励尺度太大或太小。
影响:训练更稳定,但也可能改变奖励分布。
建议:只做 PPO 时考虑;普通训练不用。
6.6 白化奖励
PPO 里对奖励做白化处理,让奖励均值和方差更稳定。
建议:PPO 训练不稳定时可以开。普通训练不用。
七、多模态参数
这组用于图文/视频模型,比如 Qwen-VL、LLaVA、InternVL。如果你训练的是纯文本模型,这组基本不用管。
7.1 冻结视觉编码器
视觉编码器负责把图片变成模型能理解的特征。勾选后:不训练视觉编码器。
建议:
| 场景 | 建议 |
|---|---|
| 普通图文指令微调 | 勾选 |
| 数据量小 | 勾选 |
| 想让模型适应特殊图片领域,比如医学影像 | 可考虑不勾,但显存和数据要求高 |
7.2 冻结多模态投影器
投影器负责把视觉特征接到语言模型里。
勾选后:不训练投影器。
建议:
| 场景 | 建议 |
|---|---|
| 只是微调语言回答风格 | 勾选 |
| 图像理解对不上、视觉特征适配差 | 可取消 |
| 数据量少 | 勾选更稳 |
7.3 冻结语言模型
勾选后,语言模型主体不训练。
适合只训练视觉侧或投影器。
如果你想让模型学你的回答风格/任务,通常不要勾。
7.4 图像最大像素 / 图像最小像素
控制输入图片会被处理到多大范围。
影响:
| 图片像素越大 | 图片像素越小 |
|---|---|
| 看得更细 | 更省显存 |
| 显存更高 | 速度更快 |
| 适合 OCR/细节识别 | 适合普通图像描述 |
建议:
| 场景 | 最大像素 |
|---|---|
| 普通图文问答 | 512*512 或 768*768 |
| OCR、截图、表格、细节多 | 1024*1024 甚至更高 |
| 显存紧张 | 448*448 或 512*512 |
7.5 视频最大像素 / 视频最小像素
类似图片参数,但用于视频帧。
视频更吃显存,所以一般比图片设得小。
建议:
| 场景 | 视频最大像素 |
|---|---|
| 普通动作/场景理解 | 256*256 |
| 需要看细节文字 | 384*384 或更高 |
| 显存紧张 | 224*224 |
八、GaLore 参数设置
GaLore 是一种优化器/训练技巧,用来降低训练显存占用。它更常见于全参数或部分参数训练,普通 LoRA 不一定需要。
8.1 使用 GaLore
开启后使用 GaLore 优化器。
作用:降低梯度相关的显存占用,让大模型训练更省显存。
建议:
| 场景 | 是否开启 |
|---|---|
| 普通 LoRA | 一般不开 |
| full 微调显存不够 | 可以试 |
| freeze/部分参数微调 | 可以试 |
| 追求简单稳定 | 不开 |
8.2 GaLore 秩
控制低秩梯度投影的容量。
| 值 | 影响 |
|---|---|
| 小 | 更省显存,但近似更粗 |
| 大 | 更接近正常训练,但更吃显存 |
建议:常试 16 / 32 / 64。小显存先 16。
8.3 更新间隔
每隔多少 step 更新一次 GaLore 的投影矩阵。
| 值 | 影响 |
|---|---|
| 小 | 更准确,但更耗时 |
| 大 | 更快,但可能效果差一点 |
建议:100-500 都常见。默认 200 可以。
8.4 GaLore 缩放系数
控制 GaLore 梯度缩放强度。
建议:不熟悉就保持默认。训练不稳定再调。
8.5 GaLore 作用模块
GaLore 应用到哪些模块。
你现在是 all,表示尽量应用到所有支持模块。
建议:
| 场景 | 推荐 |
|---|---|
| 不确定 | all |
| 只想作用注意力 | q_proj,k_proj,v_proj,o_proj |
| 显存极紧张 | 可选更多模块,但要测试稳定性 |
下面几组都是进阶参数。普通 LoRA/SFT 微调一般不用开,默认关着就行。它们分别是:优化器增强、块状训练优化、实验记录平台。
九、APOLLO 参数设置
APOLLO 是一种优化器/训练优化方法,主要目的是降低显存、提高训练效率,更常用于 full 微调或部分参数微调。普通 LoRA 不一定需要。
9.1 使用 APOLLO
| 场景 | 建议 |
|---|---|
| 普通 LoRA | 不开 |
| full 微调显存不够 | 可尝试 |
| freeze/部分参数微调 | 可尝试 |
| 新手训练 | 不开 |
9.2 APOLLO 秩
类似低秩近似的容量大小。
| 值小 | 值大 |
|---|---|
| 更省显存 | 效果更接近正常训练 |
| 近似更粗 | 显存更高 |
| 可能效果差一点 | 更稳一些 |
常用可以试 16 / 32 / 64。
9.3 更新间隔
每隔多少 step 更新一次 APOLLO 的投影/近似信息。
| 值小 | 值大 |
|---|---|
| 更新更频繁,可能更准 | 更省时间 |
| 训练开销更大 | 近似可能滞后 |
默认 200 可以。
9.4 APOLLO 缩放系数
控制 APOLLO 对梯度/更新的缩放强度。
这个不熟悉不要乱改,保持默认即可。
如果训练不稳定、loss 异常,再考虑降低。
9.5 APOLLO 作用模块
all 表示所有支持模块都用。也可以指定:q_proj,k_proj,v_proj,o_proj。一般保持 all。
十、BAdam 参数设置
BAdam 是 Block Adam,意思是"分块 Adam 优化器"。
它不是一次更新所有参数,而是按层或按比例分块更新,目的是节省显存、支持更大模型训练。
10.1 使用 BAdam
是否启用 BAdam 优化器。
| 场景 | 建议 |
|---|---|
| 普通 LoRA | 不开 |
| full 微调大模型显存吃紧 | 可开 |
| 想减少优化器状态显存 | 可开 |
| 追求简单稳定 | 不开 |
1.02 BAdam 模式
| 模式 | 含义 | 适合 |
|---|---|---|
| layer | 按层分块更新 | 常用,直观 |
| ratio | 按比例选择参数块更新 | 更灵活,但更进阶 |
普通尝试 BAdam 用 layer。
10.3 切换策略
决定训练时按什么顺序切换要更新的块。
| 策略 | 含义 |
|---|---|
| ascending | 从前到后更新 |
| descending | 从后到前更新 |
| random | 随机更新 |
| 其它策略 | 看工具支持 |
一般保持 ascending。如果训练效果不稳定,可以试 random,但不作为首选。
10.4 切换频率
意思是每多少 step 切换一次正在更新的块。
| 值小 | 值大 |
|---|---|
| 切换频繁,覆盖更快 | 每块训练更久 |
| 可能更不稳定 | 可能更新不够全面 |
| 开销略高 | 更平滑 |
常见可以用 50-200。默认 50 可以。
10.5 Block 更新比例
在 ratio 模式下尤其重要,表示每次更新多少比例的参数块。
| 值 | 含义 |
|---|---|
| 0.05 | 每次更新 5% |
| 0.1 | 每次更新 10% |
| 0.2 | 每次更新 20% |
比例越小越省显存,但训练越慢、越不完整。普通保持 0.05 或 0.1。
十一、SwanLab 参数设置
SwanLab 是实验跟踪/可视化平台,类似 TensorBoard、Weights & Biases。
它不影响模型本身训练算法,主要影响:是否记录 loss 曲线、学习率、参数、日志、实验对比。
11.1 使用 SwanLab
开启后会把训练过程记录到 SwanLab。
| 场景 | 建议 |
|---|---|
| 只是简单跑一次 | 不开 |
| 想看训练曲线 | 可以开 |
| 多次实验要对比 | 建议开 |
| 团队协作 | 建议开 |
11.2 SwanLab 项目名
项目名称。你现在是 llamafactory。
可以改成你的任务名,比如:qwen-customer-lora
11.3 SwanLab 实验名
这一次训练的名字。建议写清楚配置,比如:rank8-lr5e-5-epoch5,方便以后知道是哪次训练。
11.4 SwanLab 工作区
你的账号/团队空间。不填通常用默认个人空间。
11.5 SwanLab API 密钥
用于登录 SwanLab。
如果本机已经登录,可以不填;没登录就需要填。
11.6 SwanLab 模式
| 模式 | 含义 |
|---|---|
| cloud | 上传到云端平台 |
| local | 本地记录 |
| disabled/offline | 不上传或离线记录,具体看工具支持 |
十二、其他
12.1 DeepSpeed stage
DeepSpeed 是多卡/大模型训练加速和省显存工具。
常见 stage:
| Stage | 作用 | 场景 |
|---|---|---|
| none | 不使用 | 单卡 LoRA、普通训练 |
| stage 1 | 优化器状态分片 | 多卡训练,省一点显存 |
| stage 2 | 优化器+梯度分片 | 多卡常用,省更多显存 |
| stage 3 | 参数+梯度+优化器都分片 | 超大模型/full 微调 |
| stage 3 offload | 进一步把部分内容放 CPU/NVMe | 显存极限场景,但慢 |
建议:
| 场景 | 推荐 |
|---|---|
| 单卡 LoRA | none |
| 多卡 LoRA | 可 stage 2 |
| full 微调大模型 | stage 2/3 |
| 显存严重不够 | stage 3 + offload |
| 新手 | none |
12.2 使用 offload
把一部分训练状态从 GPU 显存挪到 CPU 内存,甚至硬盘。
作用:省显存。
代价:训练速度明显变慢。
什么时候开:
| 场景 | 建议 |
|---|---|
| 显存够 | 不开 |
| CUDA out of memory | 可以开 |
| full 微调大模型 | 可开 |
| LoRA 普通训练 | 通常不开 |
| 机器内存/硬盘慢 | 谨慎开 |
12.3 step
step 指的是:模型完成了多少次参数更新。
它主要和这些参数有关:
训练样本数
训练轮数 epoch
批处理大小 batch size
梯度累积 gradient accumulation
GPU 数量
计算公式:
有效 batch size = 批处理大小 × 梯度累积 × GPU 数量
每轮 step 数 = 训练样本数 ÷ 有效 batch size
总 step 数 = 每轮 step 数 × 训练轮数
通常会向上取整。
举例,假设你的参数是:
最大样本数:500 训练轮数:20 批处理大小:2 梯度累积:8 GPU 数量:1
那么:有效 batch size = 2 × 8 × 1 = 16
每一轮:500 ÷ 16 = 31.25
向上取整,大约:32 step / epoch
训练 20 轮:32 × 20 = 640 step