本篇针对LLaMA-Factory网页版LLaMA Board(以下统称LLaMA Board)中的参数详解。
本篇重点于部分必要训练参数详解以及训练流程相关参数详解,部分未解释参数若需要讲解请关注留言或私信催更。
本篇使用的参数皆为官方翻译CN版本,读者们要是觉得不习惯请留言,我会再更新一篇英文版对照。
系统wsl Ubuntu
不知道如何安装和激活的,请参考LLaMA-Factory安装教程以及如何激活网页版LLaMA Board。
一、进入页面切换语言
更改Language为zh回到我们亲切的母语。
二、模型与路径
点开后下拉菜单,里面有各大模型,注意你选择的模型必须是这里面有的,路径要写成绝对路径,如果你没有下载过大模型,这个时候你点击chat栏,选择加载模型后会自动帮你下载模型。
下载后的模型路径会保存在你的系统缓存文件夹里面。
比如我用的是wsl Ubuntu,它就会下载在\home\用户名\.cache\modelscope\hub\models\Qwen路径里。
如果你已经下载过大模型了,请将你的模型路径改成你的绝对路径,记得路径分隔符是/而不是\。
三、微调方法、检查点路径
微调方法我们选择Lora,至于为什么选择Lora巴拉巴拉的想进一步了解的请私信催更,这里我就简单直接说明Lora好用。
检查点路径是用训练过的模型会生成一个检查点,检查点注明了训练日期,训练时间,你可以在训练过的检查点上继续训练,如果想要测试,则可以在勾选检查点后在chat加载模型,就可以对你的模型进行问答。
四、量化等级、量化方法、对话模板、RoPE 插值方法、加速方式
量化等级
量化可以理解成缩水,用来减少你的模型占用,比如说你的模型占用20G,你可以用量化的方式将他安装在一个10G的服务器上并且不影响它的功能。
量化方法:简明形象的说。
bnb:减少内存占用和计算量,适用于大规模模型。
hqq:提升量化精度,适用于对精度要求较高的低比特量化场景。
eetq:大幅减少内存和计算量,适用硬件资源受限的环境。
总的来说bnb比较平衡,hqq优先精度,eetq主攻轻量。(量化可能会导致模型不精准谨慎使用)
对话模板
选择模型对应的或者默认的,不同的模板可能会导致模型chat问答时胡言乱语或者输出有英文,输出不停等问题。
RoPE 插值方法
大概意思就是用于扩张你的模型能处理的语句长度,比如数据集句子很短很精炼,但是在现实中没有人这么说话,人们可能用很长一段话形容一件事,这时候你的模型就可以使用这个来扩大模型对长句子的处理。
linear:常用于扩展 RoPE 或其他位置编码的上下文窗口,简单说就是一条线性的数据中,加入linear后它的处理就变得更加平滑,而且linear所吃占资源比较少简单、快速,但随着模型复杂度提高linear的精度会下降,而且linear只适用于线性数据,对非线性数据处理能力有限。
比如:早中晚,我知道早晚的温度,用linear可以插入一个中午温度,但是中午温度对比早晚是线性变化的,均匀的,早上10°,晚上20°,那么中午有可能是15°。(随便举的例子哈,不要较真)
dynamic:动态调整位置编码的插值因子,平衡模型在短序列和长序列上的性能,提高模型的灵活性和效率,还能够减少模型在特定任务上的微调时间和资源消耗,说白了就是提高你的模型上下文理解,能够动态的调整适配能力,提升泛化能力,避免传统方式中索引越大越不充分的问题。
比如:你模型本身处理长数据能力差,但是加入dynamic会让你的模型初始增加一些泛化能力,无需微调,打破模型对固定长度的依赖,医院中病例有长有短,从简短的门诊记录到详细的住院报告,dynamic确保模型在无需额外训练的情况下,依然能准确提取关键信息。
yarn:扩展上下文窗口,精细的插值策略,减少位置信息的失真。
llama3:扩展上下文窗口,使模型的高效训练和推理。
两者都是用于扩展模型上下文窗口的,但是yarn的扩展大小<llama3的扩展大小,一般这两者用于处理文件,对话,长代码,小说等问题,具体使用哪个根据你的模型定位选择。
加速方式
flashattn2:大模型训练和长序列处理优化,降低显存占用,加速高效训练与推理。(gpu)
unsloth:深度学习训练加速框架,专注于减少训练时间和内存消耗,资源受限环境下的分布式训练。(多卡多机)
liger_kernel:轻量化深度学习内核优化工具,专注于模型推理阶段的硬件适配与计算效率提升,设备推理加速、实时AI服务部署。(cpu/gpu)
缺点:
liger_kernel
对动态计算图的支持较弱;
flashattn2
依赖特定硬件(如NVIDIA GPU);
unsloth
在极端大规模集群中可能面临通信瓶颈。
五、训练阶段
Supervised Fine-Tuning监督微调
简称sft又名监督微调,它指的是在一个预训练的模型基础上,通过提供标注好的数据进行进一步训练,以使模型在特定任务或领域上表现得更好。这就相当于你是老师,你的模型是学生,你一步一步教他怎么做,他跟着你的样子学习,你是老师,你让他学什么就学什么,适用于特定领域模型定制。
Reward Modeling奖励模型
简称RM又名奖励模型,评估生成结果与人类偏好的一致性,为模型提供反馈信号,引导其生成更符合预期的结果。相当于数据在训练回答的时候会被打上好与坏的标签,好就是贴合人类偏好的一项保留,就像是售后客服,好的一项是你咨询后回答保修期一年为好,坏的一项是你咨询后回答请咨询客服为坏,奖励模型会为你的模型生成几个候补回答,对他们打分哪个更贴合人类偏好,帮助你优化模型。
PPO近端策略优化
限制策略更新幅度,实现稳定高效的训练。用于机器人抓取物品控制力度等,增加其控制能力,防止更新过度。
DPO直接偏好优化
直接利用人类偏好数据(如选择的响应 vs. 拒绝的响应)来调整模型参数,简化了训练流程并提高了稳定性。训练客服机器人生成更符合用户期望的回复,与奖励模型相似,他会直接读取好与坏的两个回答,去学习好的。(好坏回答需你的数据集提供)
KTO对齐
对比DPO它的作用只有可取和不可取,流程简化无需训练奖励模型或进行复杂的强化学习,直接优化策略,对于数据的容忍度更高。
Pre-Training预训练
预训练是模型正式用于特定任务之前,利用大规模数据集对模型进行训练,以便于之后对模型微调产生更好的适应。简单说,什么都会一点,什么都不精通,虽然通过预训练训练时间和计算成本缩减,但是需要大规模数据和高性能计算设备,预训练数据可能包含偏见,影响模型公平性和安全性。
六、数据路径、数据集目录
数据路径
数据路径一般在home\用户名\LLaMA-Factory\data中。
数据集目录
数据集目录home\用户名\LLaMA-Factory\data中,数据集内格式需Alpaca和ShareGPT格式,文件后缀为json文件优先,且需要配置该目录下dataset_info文件,具体配置内容如下。
Alpaca
指令监督微调数据集
指令监督微调(Instruct Tuning)通过让模型学习详细的指令以及对应的回答来优化模型在特定指令下的表现。
instruction
列对应的内容为人类指令,input
列对应的内容为人类输入,output
列对应的内容为模型回答。"alpaca_zh_demo.json" { "instruction": "计算这些物品的总费用。 ", "input": "输入:汽车 - $3000,衣服 - $100,书 - $20。", "output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。" },
[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "system": "系统提示词(选填)", "history": [ ["第一轮指令(选填)", "第一轮回答(选填)"], ["第二轮指令(选填)", "第二轮回答(选填)"] ] } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output", "system": "system", "history": "history" } }
预训练数据集
预训练数据集文本描述格式如下:
[ {"text": "document"}, {"text": "document"} ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "text" } }
偏好数据集
偏好数据集用于奖励模型训练、DPO 训练和 ORPO 训练。对于系统指令和人类输入,偏好数据集给出了一个更优的回答和一个更差的回答。
[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "chosen": "优质回答(必填)", "rejected": "劣质回答(必填)" } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "ranking": true, "columns": { "prompt": "instruction", "query": "input", "chosen": "chosen", "rejected": "rejected" } }
KTO 数据集
KTO数据集与偏好数据集类似,但不同于给出一个更优的回答和一个更差的回答,KTO数据集对每一轮问答只给出一个true/false 的
label
。 除了instruction
以及input
组成的人类最终输入和模型回答output,
KTO 数据集还需要额外添加一个kto_tag
列(true/false)来表示人类的反馈。[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "kto_tag": "人类反馈 [true/false](必填)" } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output", "kto_tag": "kto_tag" } }
多模态数据集
图像数据集
多模态图像数据集需要额外添加一个
images
列,包含输入图像的路径。 注意图片的数量必须与文本中所有 <image> 标记的数量严格一致。[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "images": [ "图像路径(必填)" ] } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output", "images": "images" } }
视频数据集
多模态视频数据集需要额外添加一个
videos
列,包含输入视频的路径。 注意视频的数量必须与文本中所有 <video> 标记的数量严格一致。[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "videos": [ "视频路径(必填)" ] } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output", "videos": "videos" } }
音频数据集
多模态音频数据集需要额外添加一个
audio
列,包含输入图像的路径。 注意音频的数量必须与文本中所有 <audio> 标记的数量严格一致。[ { "instruction": "人类指令(必填)", "input": "人类输入(选填)", "output": "模型回答(必填)", "audios": [ "音频路径(必填)" ] } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "columns": { "prompt": "instruction", "query": "input", "response": "output", "audios": "audios" } }
ShareGPT
指令监督微调数据集
相比
alpaca
格式的数据集,sharegpt
格式支持更多的角色种类,例如 human、gpt、observation、function 等等。它们构成一个对象列表呈现在conversations
列中。 下面是sharegpt
格式的一个例子:{ "conversations": [ { "from": "human", "value": "你好,我出生于1990年5月15日。你能告诉我我今天几岁了吗?" }, { "from": "function_call", "value": "{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}" }, { "from": "observation", "value": "{\"age\": 31}" }, { "from": "gpt", "value": "根据我的计算,你今天31岁了。" } ], "tools": "[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\", \"description\": \"出生日期以YYYY-MM-DD格式表示\"}}, \"required\": [\"birthdate\"]}}]" }
注意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。
[ { "conversations": [ { "from": "human", "value": "人类指令" }, { "from": "function_call", "value": "工具参数" }, { "from": "observation", "value": "工具结果" }, { "from": "gpt", "value": "模型回答" } ], "system": "系统提示词(选填)", "tools": "工具描述(选填)" } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "formatting": "sharegpt", "columns": { "messages": "conversations", "system": "system", "tools": "tools" } }
偏好数据集
Sharegpt 格式的偏好数据集同样需要在
chosen
列中提供更优的消息,并在rejected
列中提供更差的消息。 下面是一个例子:{ "conversations": [ { "from": "human", "value": "老虎会吃哪一个,草还是树叶?" } ], "chosen": { "from": "gpt", "value": "我很高兴能帮助你解答问题!不过,我必须指出,这个问题本身可能没有意义。老虎是食肉动物,通常不吃草或树叶。它们的饮食主要包括大型有蹄动物、小型哺乳动物和鸟类。\n\n如果你提出这个问题是出于好奇或有特定原因,我很乐意帮助你找到更多关于老虎饮食习惯的信息,或者建议资源让你更多了解这些壮丽的生物。请告诉我如何进一步协助你!" }, "rejected": { "from": "gpt", "value": "一只老虎是食肉动物,这意味着它的饮食主要是肉类。老虎主要猎捕和吃其他动物,如鹿和野猪。它们不会选择吃草或树叶,因为这些不是它们自然饮食的一部分。" } }
其格式为:
[ { "conversations": [ { "from": "human", "value": "人类指令" }, { "from": "gpt", "value": "模型回答" }, { "from": "human", "value": "人类指令" } ], "chosen": { "from": "gpt", "value": "优质回答" }, "rejected": { "from": "gpt", "value": "劣质回答" } } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "formatting": "sharegpt", "ranking": true, "columns": { "messages": "conversations", "chosen": "chosen", "rejected": "rejected" } }
OpenAI格式
OpenAI 格式仅仅是
sharegpt
格式的一种特殊情况,其中第一条消息可能是系统提示词。[ { "messages": [ { "role": "system", "content": "系统提示词(选填)" }, { "role": "user", "content": "人类指令" }, { "role": "assistant", "content": "模型回答" } ] } ]
对于上述格式的数据,
dataset_info.json
中的数据集描述应为:"数据集名称": { "file_name": "data.json", "formatting": "sharegpt", "columns": { "messages": "messages" }, "tags": { "role_tag": "role", "content_tag": "content", "user_tag": "user", "assistant_tag": "assistant", "system_tag": "system" } }
七、学习率、训练轮数、最大梯度范数、最大样本数、计算类型
学习率
以1e-1为例就是 ,5e-5就是
以此类推。
学习率的作用决定了你的模型的学习能力,学习率高学的就越快,但有可能学过头了我们俗称过拟合,过拟合就像是背诵了一组问题的答案,而不是理解其背后的原理。 虽然模型可能会正确回答已知问题,但在面对新问题或已知问题的变体时却会陷入困境。
既然有过拟合,自然就有学习能力不到位产生的欠拟合,这中情况往往表现为问着数据集的问题回答驴唇不对马嘴。
训练轮数
字面意思,就是你训练多少轮,训练轮次越多数据越拟合,所得loss损失度越平稳,但是过高的训练轮次会导致资源占用过高训练时长增加等问题。
最大梯度范数
梯度是指损失函数对模型参数的偏导数,它表示了模型在当前参数值下的变化方向和速度。通过限制梯度的最大范数,可以控制模型参数的更新幅度,如果你看到你的曲线像过山车一样上窜下跳,那么你该考虑下你的最大梯度范数是否合理,一般默认1。
最大样本数
每个数据集的最大样本数,10000条数据集中你设置最大样本数为1000那它只会在这里抽1000条数据集来训练。
计算类型
FP32: 由于其高精度,FP32广泛用于需要精确计算的应用。
FP16: 通常用于深度学习训练和推理过程中,可以加速计算并减少内存占用,同时大多数情况下对模型准确性的影响较小。
BF16: BF16可以提供比FP16更好的训练稳定性,同时仍然享有FP16的计算和存储效率。
八、截断长度、批处理大小、梯度累积、验证集比例、学习率调节器
截断长度
截断长度与token有关这个参数决定了每个输入序列的最大长度,设置过短可能会导致语句读取不完整,过长可能会占用过多不必要的资源,因此设置合适的截断长度可以确保模型在计算资源有限的情况下高效运行,同时又不会丢失太多重要信息。
批处理大小
每个 GPU 处理的样本数量,处理数量越多处理的速度就越快,相对的精准度可能就不高。
梯度累积
大的梯度累积可能陷入局部最小值。陷入局部最小值则意味着神经网络将在训练集之外的样本上表现得很好,这个过程称为泛化。因此,泛化性一般表示过度拟合。
较小的梯度累积可能会使学习过程波动性更大,从本质上延长算法收敛所需要的时间。
验证集比例
一般在10%~20%之间,用于模型训练结束后输出评估用。
学习率调节器
这里我们只讲常用的cosine和linear。
cosine余弦退火
余弦退火通过平滑改变学习率稳定模型,使模型更快,更容易拟合,虽然稳定,但是因为学习率变化可能会导致训练时间略长。
linear线性预热
线性预热在训练初期使用较小的学习率,逐步增加到预设的初始学习率,以帮助模型更稳定地收敛并提升性能,同样的因为调整了学习率所以可能会导致训练时间变长。
九、Lora参数设置
LoRA 秩
秩越大引入的可训练参数越多,模型对新数据的适应能力越强,但也增加了计算和内存的需求,可能导致过拟合。人话:越大参数越多,你能能力越强,学的就快,但是可能会走火入魔,死板只会应用自己学的。
秩越小引入的可训练参数较少,减少了计算和内存的需求,但可能不足以充分适应新数据,影响模型性能。人话:参数少,学的慢。
中小型数据集可以使用8、16做参数,大点的16、32都是可以的。
LoRA 缩放系数
较大可能更快地适应特定任务,但也可能导致过拟合;较小的参数会使更新较为温和,有助于模型的稳定性和泛化能力,但可能需要更多的训练步骤才能达到较好的性能。
比如在翻译模型上,过大缩放系数可能会导致过拟合导致会翻译数据集内的句子,但是在新的翻译句子上表现不佳,果设置得过小,模型的改进速度可能会很慢。
LoRA 随机丢弃
字面意思,随机丢弃一部分数据集,防止过拟合,数值过大可能会欠拟合,建议模型调节参数都调完还过拟合没办法再动它。
LoRA+ 学习率比例
通过为LoRA的两个低秩矩阵(A和B)分配不同的学习率,以优化模型微调的性能,降低了训练发散的风险,提升了训练稳定性,提升性能。
虽然LoRA+看上去非常不错,但是因为你改变了学习比率,所以你需要为两个矩阵分别设计学习率调度策略(如余弦退火、线性预热),属于是牵一发而动全身。
rslora
rsLoRA可以轻松实现微调计算/性能权衡,通过使用较大的秩在训练期间增加计算资源以获得更好的微调性能,同时不改变推理计算成本。
启用该功能可能导致模型难以学习有效的适配参数,在计算资源充足的情况下,全量微调仍是更优选择。(可用可不用)
DoRA
显著提升了模型性能和训练稳定性,但是对高秩任务可能有局限性,在高秩任务下可能会占用更多显存。(可用可不用)
PiSSA
减少训练参数量,占用低,降低量化误差,但是初始化阶段耗时较长(几分钟到几十分钟),以及在一些简单任务中优势不明显,甚至可能会过拟合。(可用可不用)
到此为止一些使用Lora训练所必要的参数我都说明了一遍,希望对大家有用,你们的支持就是我最大的动力,若本篇文章对您有用的话求个点赞、关注、收藏,不过分吧,若是本文有错误欢迎私信或留言指正,若是想了解更多参数请关注私信留言,我会加紧更新。
ps:第一次做这么长流程的参数详解,没用功劳也有苦劳,大佬们动动小手支持一下吧