简介
LLaMA Factory是一个简单易用且高效的大型语言模型训练与微调平台。 通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调.
数据处理
Alpaca格式
指令监督微调数据集
指令监督微调(Instruct Tuning)通过让模型学习详细的指令以及对应的回答来优化模型在特定指令下的表现。
instruction 列对应的内容为人类指令, input 列对应的内容为人类输入, output 列对应的内容为模型回答. 如果指定system列,对应的内容将被作为系统提示词。
{
"instruction": "计算这些物品的总费用。 ",
"input": "输入:汽车 - $3000,衣服 - $100,书 - $20。",
"output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
}
在进行指令监督微调时, instruction 列对应的内容会与 input 列对应的内容拼接后作为最终的人类输入,即人类输入为 instruction\ninput。而 output 列对应的内容为模型回答.
多轮对话的例子:
[
{
"instruction": "今天的天气怎么样?",
"input": "",
"output": "今天的天气不错,是晴天。",
"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 训练。 对于系统指令和人类输入,偏好数据集给出了一个更优的回答和一个更差的回答
偏好数据集需要在 chosen 列中提供更优的回答,并在 rejected 列中提供更差的回答,在一轮问答中其格式如下:
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"chosen": "优质回答(必填)",
"rejected": "劣质回答(必填)"
}
]
对于上述格式的数据,dataset_info.json 中的 数据集描述 应为:
"数据集名称": {
"file_name": "data.json",
"ranking": true,
"columns": {
"prompt": "instruction",
"query": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}
KTO数据集
在一轮问答中其格式如下:
[
{
"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 列,包含输入图像的路径。 目前仅支持单张图像输入。
[
{
"instruction": "人类指令(必填)",
"input": "人类输入(选填)",
"output": "模型回答(必填)",
"images": [
"图像路径(必填)"
]
}
]
对于上述格式的数据, dataset_info.json 中的 数据集描述 应为:
"数据集名称": {
"file_name": "data.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"images": "images"
}
}
ShareGPT格式
预训练数据集不支持 ShareGPT 格式
指令监督微调数据集
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必须出现在偶数位置
对于上述格式的数据, 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"
}
}
Qwen2-7B微调
安装modelscope
export USE_MODELSCOPE_HUB=1
# 修改模型缓存地址,否则默认会缓存到/root/.cache,导致系统盘爆满
export MODELSCOPE_CACHE=/root/autodl-tmp/models/modelscope
pip install modelscope
模型下载
from modelscope import snapshot_download
model_dir = snapshot_download(
'qwen/Qwen2-7B',
cache_dir='/root/autodl-tmp',
revision='master')
运行
# 微调数据 ./data/alpaca_zh_sales.json
llamafactory-cli webui
# http://127.0.0.1:7860
隧道代理
训练参数
Model Name(模型名称)
指定模型
Model Path(模型路径)
模型存储路径
Fineturning method(微调方法)
full
所有模型参数都会被更新。模型的所有层都会学习新的任务特定的信息。 当你有足够的数据和计算资源时,适合使用full微调。
-
灵活性高 可以充分利用预训练模型的全部潜力,适应各种任务。
-
性能好 通常可以获得最佳的性能,因为模型可以针对新任务进行充分优化。
-
计算资源需求高 需要大量的计算资源和时间,特别是在大型模型上。
-
容易过拟合 如果数据集较小,可能会导致过拟合。
freeze
在微调过程中冻结预训练模型的部分或全部层,只对部分参数进行更新。
通常情况下,会冻结模型的大部分层,只对最后一层或几层进行微调.
当数据量较小或计算资源有限时,适合使用freeze微调
-
计算资源需求低
只需要更新少量参数,计算资源需求较低。 -
防止过拟合 通过冻结大部分参数,可以减少过拟合的风险。
-
性能受限 由于部分参数不更新,模型的性能可能不如 full 微调。
-
灵活性低 对模型的调整能力有限,可能无法完全适应新任务。
lora
一种低秩适配方法,通过在预训练模型的每一层中引入低秩矩阵来微调模型。
这些低秩矩阵的参数数量远小于原模型的参数数量,从而显著减少微调所需的计算资源.
当希望在保持高性能的同时减少计算资源需求时,适合使用 LoRA。
-
计算资源需求低 只需要更新少量参数,计算资源需求较低。
-
性能好
尽管参数量少,但 LoRA 通常能够达到接近 full 微调的性能。 -
灵活性高
可以在不改变原模型结构的情况下进行微调。 -
实现复杂
需要额外的代码来实现低秩矩阵的添加和更新。 -
依赖于超参数选择
低秩矩阵的秩(rank)需要仔细选择,不同的任务可能需要不同的秩。
Checkpointpath(检查点路径)
微调训练生成的文件路径
高级配置
Quantization Bit(量化)
none,8,4
Quantization是一种常用的优化技术,用于减少模型的内存占用和提高推理速度。 量化的基本思想是将模型的权重从高精度(如32位浮点数)转换为低精度(如8位整数或更低)。
-
减少内存占用 量化可以显著减少模型的内存占用,这对于部署在资源受限的设备上非常有用。
-
提高推理速度 低精度运算通常比高精度运算更快,因此量化可以提高模型的推理速度。
-
降低功耗 低精度运算通常功耗更低,这对于移动设备和边缘设备尤为重要。
-
性能损失 量化可能会导致模型性能下降,特别是当量化位数较低时。
建议在实际应用中进行充分的实验,找到合适的量化位数和方法。 -
兼容性 确保使用的硬件和软件支持所选的量化位数和方法。
-
评估 在量化后,务必对模型进行充分的评估,确保其在目标任务上的性能满足要求。
Quantization method
bitsandbytes,hqq,eetq
Prompt template
RoPE scaling
none linear dynamic
Booster
-
auto 自动选择最佳量化策略的方式。 系统会根据模型和任务的特点,自动选择最合适的量化方法.
-
flashattn2 针对注意力机制(Attention Mechanism)的高效量化方法。 适用于Transformer模型中的自注意力层(Self-Attention Layer),通过优化注意力计算来提高推理速度和减少内存占用。
-
unsloth 基于稀疏量化的优化方法。 通过引入稀疏性来减少模型的计算量和内存占用。 稀疏量化可以将模型中的许多权重设置为零,从而减少计算和存储需求.
-
liger_kernel 针对特定硬件优化的量化方法。 通过优化内核(Kernel)来提高模型在特定硬件上的性能。 通常需要与特定的硬件平台配合使用.
训练阶段参数
Stage
-
Supervised Fine Turning(监督微调) 在预训练模型的基础上,使用带有标签的数据进行进一步训练,以适应特定任务.
-
Reword Modeling 在预训练模型的基础上,使用特定的任务数据进行训练,以改进模型的生成能力.
-
PPO(Proximal Policy Optimization,近端策略优化) 一种强化学习算法,用于优化模型的生成策略,使其在特定任务上表现更好.
-
DPO(Direct Preference Optimization,直接偏好优化) 一种强化学习方法,通过直接优化模型的偏好来改进生成质量.
-
KTO(Knowledge Transfer Optimization,知识迁移优化) 一种迁移学习方法,通过将一个模型的知识迁移到另一个模型,以提高目标模型的性能.
-
PreTraining 大规模无标签数据上训练模型,以学习通用的语言表示.
DataDir
数据目录
DataSet
训练数据集
Learning rate 学习率
控制模型在训练过程中参数更新的步长。
Epochs
训练轮数
Maximum gradient norm(最大梯度范数)
控制梯度的大小,以防止梯度爆炸(Gradient Explosion)。 梯度爆炸是指在训练过程中,梯度变得非常大,导致参数更新过大,从而使模型的训练变得不稳定。通过设置最大梯度范数,可以有效地控制梯度的大小,确保模型训练的稳定性。
Max samples(最大样本数)
控制在训练过程中使用的数据量。 在不同的训练场景中有着不同的作用和意义。
Compute type(计算类型)
指定在训练过程中使用的计算精度。
不同的计算类型会影响模型的训练速度、内存使用和最终的性能。
- bf16 脑浮点数,保留了更多的动态范围,计算速度和内存占用介于 fp32 和 fp16 之间。
- fp16 半精度浮点数,显著提高计算速度,减少内存占用,但需要损失缩放技术。
- fp32 单精度浮点数,计算结果更精确,但计算速度较慢,内存占用较大。
- purebf_16 纯脑浮点数,完全利用 bf16 的计算优势,进一步提高计算速度和减少内存占用.
Cutoff length(截断长度)
控制输入序列的最大长度,减少计算资源消耗,防止内存溢出,提高模型稳定性.
Batch size(批量大小)
控制每次迭代中传递给模型的样本数量,影响内存使用、训练速度、模型收敛和泛化能力。
Gradient accumulation(梯度累积)
通过在多个小批次上累积梯度,实现相当于一个大批次的效果,减少内存占用,提高模型性能和训练稳定性。
用于在有限的计算资源下实现更大的有效批量大小(Effective Batch Size)。
通过梯度累积,可以在不增加单次迭代内存消耗的情况下,模拟大批量训练的效果。
Val size(验证集大小)
是指在机器学习和深度学习中用于验证模型性能的数据集的大小。
验证集是从训练数据中分离出来的一部分数据,用于在训练过程中评估模型的性能,以便调整超参数和防止过拟合.
LR scheduler
学习率调度器,用于动态调整学习率的机制.
通过在训练过程中调整学习率,可以提高模型的收敛速度和最终性能。
不同的学习率调度器有不同的策略和参数
常见的学习率调度器:
-
StepLR 每隔一定步数(epoch 或 iteration)将学习率乘以一个衰减因子。 参数: step_size:每隔多少步数进行一次学习率衰减。 gamma:学习率的衰减因子(通常小于 1)。
-
MultiStepLR: 在指定的步数列表中将学习率乘以一个衰减因子。 参数: milestones:一个包含步数的列表,每个步数对应一次学习率衰减。 gamma:学习率的衰减因子(通常小于 1)。
-
ExponentialLR: 每个步数将学习率乘以一个固定的衰减因子。 参数: gamma:学习率的衰减因子(通常小于 1)。
-
CosineAnnealingLR: 学习率按照余弦退火的方式变化,先逐渐减小,然后逐渐增大。 参数: T_max:一个周期的长度(通常是训练的总步数或总 epoch 数)。 eta_min:最小学习率。
-
ReduceLROnPlateau: 当验证集上的性能指标(如损失值或准确率)不再改善时,降低学习率。 参数: mode:性能指标的模式,可以是 ‘min’(最小化,如损失值)或 ‘max’(最大化,如准确率)。 factor:学习率的衰减因子(通常小于 1)。 patience:在多少个 epoch 内没有性能提升后降低学习率。 threshold:性能提升的阈值。 cooldown:降低学习率后,等待多少个 epoch 再次检查性能指标。 min_lr:学习率的最小值。
附加配置
Logging steps
每多少记录一次日志
Save steps
每多少保存一次模型
Warmup steps
预热步骤的数量,预热步骤通常用于在训练初期逐渐增加学习率,以使模型更快地收敛。
NEFTune Alpha
添加到嵌入向量的噪声的幅度。
适量的噪声可以帮助模型在训练过程中更好地泛化,减少过拟合的风险。
Optimizer
优化器选择。
-
adamw_torch AdamW是Adam优化器的一个变体,结合了Adam和权重衰减(Weight Decay)的优点。 通过将权重衰减与梯度更新分开处理,避免了Adam中权重衰减与学习率相互影响的问题。 通过估计梯度的一阶矩(均值)和二阶矩(方差)来动态调整每个参数的学习率。 使用动量来加速收敛,减少振荡。 权重衰减与梯度更新分开处理,使得权重衰减的效果更加明确和有效。 权重衰减有助于防止模型过拟合,特别是在数据量有限的情况下。 适用于大多数深度学习任务,特别是那些需要自适应学习率和动量的场景。
-
adamw_8bit AdamW8-bit是AdamW的一个低精度版本,旨在减少内存占用和提高计算效率。 通过将优化器的状态(如一阶矩和二阶矩)存储为 8 位浮点数来实现这一点。 使用8位浮点数存储优化器状态,显著减少内存占用。 在资源受限的环境中表现更好,适用于大规模模型和分布式训练。 保持了 AdamW 的所有优点,但在精度上有一定的折衷。 适用于资源受限的环境,如嵌入式设备或大规模分布式训练。
-
adafactor 一种专门为大规模模型设计的优化器,旨在减少内存消耗和提高计算效率。 通过自适应学习率和动量来加速收敛,同时减少了对内存的需求。 通过减少优化器状态的存储需求,显著降低内存占用。 通过估计梯度的一阶矩和二阶矩来动态调整每个参数的学习率。 使用动量来加速收敛,减少振荡。 特别适合大规模模型和分布式训练。
Pack sequences
将序列打包成固定长度的样本。
Use neat packing
Avoid cross-attention between packed sequences.
使用紧凑打包。
通过更高效的方式来组织和打包序列数据,减少不必要的填充和截断,提高模型的训练效率和性能。
Train on prompt
在提示上进行训练,禁用提示的标签掩码(仅适用于SFT)
Mask history
掩码历史记录,仅在最后一个回合进行训练(仅适用于SFT)
Resize token embeddings
调整分词器词汇表和嵌入层的大小。
Enable LLaMA Pro
使扩展块中的参数可训练。
Enable S^2 Attention
启用 S^2 注意力机制,使用 LongLoRA 提出的移位短注意力机制。
Enable external logger
启用外部日志记录器
freeze Turning configurations
Trainable layers
设置最后(+)/最前(-)的隐藏层为可训练层。
微调预训练模型时,有时需要调整哪些层是可训练的,以在特定任务上获得更好的性能。
通过设置最后或最前的隐藏层为可训练层,可控制模型的哪些部分在训练过程中进行更新。
Trainable modules
可训练模块,使用逗号分隔多个模块。
Extra modules (optional)
额外模块,除了隐藏层之外,需要设置为可训练的模块的名称(可选)
Lora configurations
LoRA rank
LoRA矩阵的秩,决定了低秩矩阵的大小和复杂度。
LoRA alpha
LoRA缩放系数,控制低秩矩阵对原始权重的影响程度.
LoRA dropout
Dropout ratio of LoRA weights. LoRA权重的dropout比率, 用于在训练过程中随机丢弃一部分LoRA权重,以防止过拟合。
LoRA+ LR ratio
LoRA(Low-Rank Adaptation)中B矩阵的学习率比率。
Create new adapter
创建一个新的适配器 基于现有的适配器创建一个具有随机初始化权重的新适配器.
Use rslora
使用秩稳定缩放因子(Rank Stabilization Scaling Factor)来调整LoRA层.
Use DoRA
使用权重分解的LoRA(Weight-Decomposed LoRA)。
进一步减少参数量并提高模型的效率和性能.
Use PiSSA
使用 PiSSA(Parameterized Scaled Sparse Attention)方法来优化注意力机制。
LoRA modules (optional)
指定要应用 LoRA 的模块名称。使用逗号分隔多个模块。
Additional modules (optional)
指定除 LoRA 层之外的模块名称,使其可训练。使用逗号分隔多个模块.
RLHF configurations(Reinforcement Learning from Human Feedback)
强化学习与人类反馈.
Beta value
Value of the beta parameter in the loss. Beta参数在损失函数中的值,控制奖励信号在损失函数中的重要性,从而影响模型的学习行为.
Ftx gamma
SFT 损失在最终损失中的权重.
Loss type
损失函数的类型。
Reward model
PPO(Proximal Policy Optimization)训练中奖励模型适配器
Score norm
Normalizing scores in PPO training.
PPO训练中,归一化分数(Score Normalization)。
将奖励信号标准化,使奖励值在相对稳定的范围内,减少训练过程中的波动和不稳定性。
Whiten rewards
PPO训练中,对奖励进行白化(Whitening),用于进一步稳定训练过程。
白化不仅标准化了奖励值,还使它们具有单位方差和零均值,从而减少梯度的波动,提高训练的稳定性和效率。
Galore configurations
Use GaLore(Gradient Low-Rank Projection)
使用GaLore库启用BAdam优化器.
GaLore rank
在GaLore中,rank参数是指梯度的低秩投影的秩。 控制梯度矩阵的近似精度和内存消耗之间的平衡。 通过设置适当的秩,可在保持训练效果的同时显著降低内存使用。
Update interval
GaLore投影的更新频率.
GaLore scale
缩放系数.
GaLore modules
指定特定的模块来应用GaLore优化.
BAdam configurations
Use BAdam
启用BAdam优化器.
BAdam mode
使用BAdam优化器时,可以选择两种模式:layer-wise 和 ratio-wise.
- layer-wise 每一层的参数使用独立的Adam优化器状态.
- ratio-wise 所有层的参数共享同一个Adam优化器状态.
Switch mode
使用layer-wise BAdam优化器时,可选择不同的策略来决定每次更新时选择哪个块进行更新。
这些策略包括按升序(asc)、按降序(desc)、随机(random)和固定(fixed)。
Switch interval
Number of steps to update the block for layer-wise BAdam. 使用layer-wise BAdam优化器时,switch interval 参数用于控制每隔多少步更新一次参数块。 合理设置 switch interval 可以平衡训练速度和模型性能,避免频繁切换导致的训练不稳定性。
Update ratio
The ratio of the update for ratio-wise BAdam.
使用ratio-wise BAdam优化器时,update ratio 参数用于控制每次更新时参数块的更新比例。
合理设置 update ratio 可以平衡训练速度和模型性能,避免更新比例过大或过小导致的训练不稳定性。
Output dir
结果保存目录。
Config path
配置保存参数路径。
Device count
可用设备数量。
DeepSpeed stage
DeepSpeed stage for distributed training. none,2,3 指定DeepSpeed的优化级别。 DeepSpeed 是一个用于大规模深度学习训练的库。
- none 不使用 DeepSpeed 优化。
- 使用 DeepSpeed 的 Stage 2 优化 主要包括混合精度训练和梯度累积。
- 使用 DeepSpeed 的 Stage 3 优化
除了 Stage 2 的优化外,还包括更高级的优化,如 ZeRO(Zero Redundancy Optimizer)。
Enable offload
Enable DeepSpeed offload (slow down training).
启用 DeepSpeed 的 offload 功能。
Offload 功能可以将部分计算或存储任务从 GPU 卸载到 CPU 或磁盘,从而释放 GPU 资源,但会减慢训练速度。对于资源有限的环境特别有用。