llama-factory 各参数详解

llama-factory web页面:

image

 

1. 模型与数据配置

参数/选项详细说明
模型名称或路径 - 作用:指定要微调的基座模型。可以是 Hugging Face 上的模型标识符(如 meta-llama/Llama-2-7b-chat-hf),也可以是本地模型文件夹的路径。
  - 注意:需要确保 LLaMA Factory 支持该模型架构,并且你有权限访问该模型。
适配器名称或路径 - 作用:如果之前进行过 LoRA 微调,可以在这里加载已有的 LoRA 适配器权重,用于继续训练或进行推理。
微调方法 - 作用:选择核心的微调策略。
  - Full:全参数微调。消耗资源巨大,通常只在资源充足且需要最大程度改变模型时使用。
  - Freeze:冻结微调。只训练模型的部分层(如最后几层),其余层参数冻结。是一种轻量级方法。
  - LoRA:最常用。在原始模型旁增加低秩适配器,只训练这些小的适配器参数,极大减少显存和计算需求。
  - QLoRA:LoRA 的量化版本。将基座模型以 4-bit 等量化方式加载,进一步降低显存需求,使得在消费级显卡上微调大模型成为可能。
数据集 - 作用:选择用于训练和评估的数据集。
  - 格式:支持多种格式,如 alpaca_gpt4_en(指令微调常用格式)、自定义的 JSON 文件等。
  - 组成:通常需要指定训练集和评估集。

 

参数名称详细说明
stage 微调阶段,可选以下类型:
  pt(Pretraining):预训练阶段。
  sft(Supervised Fine-tuning):监督微调阶段。
  rm(Reward Modeling):奖励建模阶段。
  ppo(Proximal Policy Optimization):基于奖励的强化微调阶段。
  dpo(Direct Preference Optimization):偏好优化阶段。
  kto(Knowledge Transfer Optimization):知识迁移优化阶段。
do_train 是否执行训练。true 表示执行训练,false 表示跳过训练过程,仅用于推理或验证。

数据集

参数名称解释
dataset 在 dataset_info.json 中预设的数据集名称,以 , 分隔启用多个数据集。
template 数据处理模板。设置为 llama3,表明按照适配 Llama 3 模型的格式预处理数据。
cutoff_len 输入序列的最大长度。2048 表示限制每条样本的最大 token 数。
max_samples 数据集中的最大样本数量,设置为 1000,用于减少训练规模或调试。
overwrite_cache 是否覆盖缓存的预处理数据,true 表示重新处理。
preprocessing_num_workers 数据预处理的并行线程数,设置为 16,提高处理效率。

2. 训练配置

参数详细说明
学习率 - 作用:控制模型参数更新的步长。是最重要的超参数之一。
  - 值域:通常是一个很小的值,如 1e-4 到 5e-5。太大可能导致训练不稳定(损失爆炸),太小则收敛缓慢。
训练轮数 - 作用:整个训练数据集会被模型“看过”多少次。
  - 选择:并非越多越好。太多会导致过拟合,即模型在训练集上表现很好,但在新数据上表现很差。需要配合评估损失来观察。
最大样本数 - 作用:限制每个训练轮次中使用的最大样本数量。用于快速测试或在小规模数据上实验。
学习率调度器 - 作用:动态调整学习率的策略。
  - Linear:线性衰减,学习率从初始值线性下降到 0。
  - Cosine:余弦衰减,学习率按余弦曲线平滑下降,是常用且效果较好的选择。
  - Constant:保持学习率不变。
最大梯度范数 - 作用:梯度裁剪的阈值。当梯度的范数超过此值时,会将其缩放至此范数。
  - 目的:防止梯度爆炸,稳定训练过程。通常设置为 1.0 或 0.5
验证步数 - 作用:每训练多少步,就在验证集上评估一次并计算损失。
保存步数 - 作用:每训练多少步,就保存一次模型检查点(通常是 LoRA 适配器)。
优化器 - 作用:选择用于更新模型参数的算法。
  - AdamW:最常用的优化器,是 Adam 的一个变种,能更好地处理权重衰减。
  - AdamW 8bit:AdamW 的 8 位量化版本,可以节省一些显存。
  - SGD:随机梯度下降,更古老但稳定的算法。

 

参数名称典型值解释
per_device_train_batch_size 1 每张 GPU 上的训练批量大小,影响梯度的估计质量。较大的批量能提供更稳定的梯度,适合较大的学习率;较小的批量可能导致噪声较大。小批量大小(例如 1)需要配合gradient_accumulation_steps才能等效于更大的批量。
gradient_accumulation_steps 8 梯度累积步数,累积梯度可等效增大批量大小,影响模型的收敛性和泛化性能。
learning_rate 2e-4 初始学习率,最关键的超参数之一,直接影响训练的稳定性和收敛性。
num_train_epochs 3.0 训练总轮数,微调过程中,模型通常已经有良好的初始化,因此较少的轮数往往就足够。
lr_scheduler_type cosine 学习率调度策略,决定了学习率如何变化;cosine 表示采用余弦退火策略,能够有效降低后期的学习率,通常对大模型训练表现较好。
warmup_ratio 0.1 学习率预热阶段的比例,预热阶段可以防止训练一开始因为学习率过高而导致的梯度爆炸;0.1表示前 10%的训练步数用于学习率预热。
bf16 true 是否启用 bfloat16 混合精度训练,启用可减小内存占用并加速训练。
ddp_timeout 180000000 分布式数据并行的超时时间,设置为非常大的值,确保分布式训练不会因为超时失败。

 

3. LoRA/QLoRA 配置

当微调方法选择 LoRA 或 QLoRA 时,这些参数变得至关重要。

 
参数详细说明
LoRA Rank - 作用:LoRA 适配器中矩阵的秩(r。它决定了适配器的复杂度和参数量。
  - 值域:通常是 8, 16, 32, 64。值越大,能力越强,但参数量和计算量也越大。对于大多数任务,8 或 16 已经足够。
LoRA Alpha - 作用:LoRA 适配器输出结果的缩放因子。可以理解为适配器对原始模型影响力的控制参数。
  - 经验法则:通常设置为 LoRA Rank 的 1 到 2 倍(如 rank=8, alpha=16)。这被认为是一个好的起点。
Dropout - 作用:在 LoRA 适配器中应用 Dropout 的比例,是一种防止过拟合的正则化手段。
  - 值域:0 到 1。在小数据集上可以设置一个较小的值(如 0.1),在大数据集上可以设为 0
LoRA 目标模块 - 作用:指定在模型的哪些部分添加 LoRA 适配器。这是 LoRA 微调最关键的配置之一。
  - 常见值:对于 Llama 类模型,通常是 q_proj, v_proj, k_proj, o_proj(注意力机制的核心投影层)。有时也会加上 gate_proj, up_proj, down_proj(FFN 层)。
  - All:如果选择 All,框架会自动为所有符合条件的线性层添加 LoRA。
量化比特数 - 作用:QLoRA 特有。指定基座模型的量化精度。
  - 选项:4-bit 是最常用的,在性能和显存节省之间取得了很好的平衡。8-bit 也是一个选项。

4. 生成/推理配置

参数详细说明
Do Sample - 作用:是否使用采样策略。如果为 False,则使用贪心解码(总是选择概率最大的下一个词),生成结果确定但可能枯燥。
Temperature - 作用:调整采样随机性的“温度”。
  - 值域:0 到 1 或更高。
  ~0:输出更确定,倾向于高概率词。
  ~1:平衡的随机性。
  >1:输出更随机,更具创造性,但也可能不连贯。
Top-p - 作用:核采样。从累积概率超过 p 的最小词集合中采样。
  - 效果:能动态控制候选词的范围,避免选择那些概率极低的词,同时保持多样性。通常与 Temperature 一起使用。常用值为 0.9
Top-k - 作用:从概率最高的 k 个词中进行采样。
  - 效果:另一种限制采样范围的方法。Top-p 通常比 Top-k 更灵活和有效。
Max New Tokens - 作用:生成文本的最大长度(Token 数量)。
Repetition Penalty - 作用:对已生成过的词进行惩罚,降低其再次被生成的概率,有效减少重复。
  - 值域:通常 1.0 表示无惩罚,>1.0(如 1.1 到 1.2)表示施加惩罚。

 

数据集格式

llama-factory支持的数据集格式:

数据集通常是一个 JSON 文件(如 .json.jsonl),每条数据包含一个对话或指令样本。
支持以下字段:

    • instruction:指令描述(可选,如果使用 input 和 output

    • input:输入内容(可选)

    • output:期望输出

    • messages:对话列表(用于多轮对话)

    • system:系统提示(可选)

    • history:历史对话(可选,用于多轮)

监督训练

单轮指令格式

格式1:

{
  "instruction": "翻译成英文",
  "input": "今天天气真好",
  "output": "The weather is nice today."
}
  • instruction:任务指令

  • input:任务输入(可为空)

  • output:期望输出

格式2:(ChatML 格式)

{
  "messages": [
    {"role": "user", "content": "今天天气真好,请翻译成英文。"},
    {"role": "assistant", "content": "The weather is nice today."}
  ]
}
  • 必须包含 user 和 assistant 交替的对话。

  • 可包含 system 消息。

多轮对话格式

格式1:

{
  "messages": [
    {"role": "system", "content": "你是一个翻译助手。"},
    {"role": "user", "content": "翻译:今天天气真好"},
    {"role": "assistant", "content": "The weather is nice today."},
    {"role": "user", "content": "改成过去时"},
    {"role": "assistant", "content": "The weather was nice today."}
  ]
}

严格按 user → assistant → user → assistant 顺序。

格式2:

{
  "history": [
    ["今天天气真好", "The weather is nice today."]
  ],
  "input": "改成过去时",
  "output": "The weather was nice today."
}
  • history:列表形式,每轮是 [用户输入, 助手回复]

  • input:当前轮用户输入。

  • output:当前轮助手回复。

 

数据集目录通常包含:

    • dataset.json(或 .jsonl

    • 可拆分:train.jsonvalidation.jsontest.json

 

无监督训练

格式1:JSONL

{"text": "这是第一个文档的内容,可以是任意长度的纯文本。\n可以包含换行符和标点。"}
{"text": "这是第二个文档。无监督训练只需要纯文本,不需要指令或回复。"}
{"text": "中文、英文或混合文本都可以。模型会根据上下文学习语言模式。"}

每个 JSON 对象包含一个 text 字段

 

参数含义

{'loss': 1.2992, ...}  # 当前批次的训练损失
{'train_loss': 0.0, ...}  # 最终平均训练损失(这里有问题,正常不应为0)

# 评估过程
{'eval_loss': 1.275}  # 验证集上的损失
{'learning_rate': 1.0732e-05, ...}  # 当前学习率
{'epoch': 2.10, ...}  # 当前训练轮数(含小数表示进度)

{'throughput': 1226.07}  # 吞吐量(tokens/秒)
{'train_samples_per_second': 80145.936}  # 样本处理速度
{'train_steps_per_second': 5120.435}    # 训练步数速度

{'trainable params: 5,046,272'}      # 可训练参数(LoRA参数)
{'all params: 601,096,192'}          # 总参数(原始模型+LoRA)
{'trainable%: 0.8395'}               # 可训练参数占比

{'num_input_tokens_seen': 700704}    # 处理的总token数
{'total_flos': 1744403GF'}          # 总浮点运算次数(1.74×10^18)

'Upcasting trainable params to float32'  # LoRA参数用FP32训练
'Fine-tuning method: LoRA'  # 使用LoRA方法
'Loaded adapter(s): saves/Qwen3-0.6B-Base/lora/...'  # 加载已有LoRA权重

'per_device_train_batch_size': 4 # 每个GPU的物理批次大小 
'gradient_accumulation_steps': 8 # 梯度累积步数
实际有效批次大小 = per_device_train_batch_size × gradient_accumulation_steps × GPU数量

 

yaml文件配置

# 基础模型配置
model_name_or_path: Qwen/Qwen2.5-VL-7B-Instruct
# 作用:指定预训练模型名称或本地路径
# 支持:HuggingFace模型ID或本地目录

image_max_pixels: 262144
# 作用:图像最大像素数(512×512)
# 计算:512×512=262144
# 影响:图像分辨率,减少显存占用

video_max_pixels: 16384
# 作用:视频最大像素数(128×128)
# 计算:128×128=16384
# 注意:视频通常需要更多显存

trust_remote_code: true
# 作用:信任远程代码执行
# 必要性:某些模型需要自定义代码加载

#LORA配置
stage: sft
# 作用:训练阶段
# 选项:pretrain(预训练)、sft(监督微调)、rm(奖励模型)、ppo(强化学习)

do_train: true
# 作用:是否执行训练

finetuning_type: lora
# 作用:微调类型
# 选项:full(全参数)、lora(LoRA)、freeze(冻结)、none(仅推理)

lora_rank: 8
# 作用:LoRA秩(低秩矩阵的维度)
# 范围:通常4-64,越小参数量越少,能力可能下降

lora_target: all
# 作用:LoRA适配的模块
# 选项:all(所有线性层)、q_proj,v_proj(仅注意力层)、自定义
# 影响:all参数量最多,但效果可能最好

# 数据集配置
dataset: mllm_demo,identity,alpaca_en_demo
# 作用:使用的数据集名称
# 格式:dataset_info.json中定义的key,逗号分隔

template: qwen2_vl
# 作用:对话模板
# 必要性:不同模型需要不同对话格式
# 选项:llama3、qwen、chatml等

cutoff_len: 2048
# 作用:序列最大长度
# 影响:超过部分截断,影响长文本处理

max_samples: 1000
# 作用:每个数据集最大样本数
# 用途:快速测试或限制数据量

overwrite_cache: true
# 作用:覆盖已存在的缓存
# 用途:数据更新后重新预处理

preprocessing_num_workers: 16
# 作用:数据预处理的进程数
# 优化:CPU密集型任务,通常设CPU核心数

dataloader_num_workers: 4
# 作用:数据加载的进程数
# 优化:IO密集型任务,通常设4-8

#输出配置
output_dir: saves/qwen2_5vl-7b/lora/sft
# 作用:输出目录
# 结构:包含模型权重、日志、配置

logging_steps: 10
# 作用:每多少训练步记录一次日志
# 监控:损失、学习率等指标

save_steps: 500
# 作用:每多少步保存一次检查点
# 容灾:训练中断后可恢复

plot_loss: true
# 作用:绘制损失曲线图
# 输出:training_loss.png

overwrite_output_dir: true
# 作用:覆盖已有输出目录
# 警告:会删除之前的内容

save_only_model: false
# 作用:是否只保存模型权重
# true:只保存pytorch_model.bin
# false:保存完整检查点(含优化器状态)

report_to: none
# 作用:实验跟踪工具
# 选项:wandb、tensorboard、mlflow等

#训练参数配置
per_device_train_batch_size: 1
# 作用:每个GPU的物理批次大小
# 显存:决定单次前向传播的样本数

gradient_accumulation_steps: 8
# 作用:梯度累积步数
# 计算:有效批次 = 1 × 8 = 8
# 显存:用8倍时间换8倍显存节省

learning_rate: 1.0e-4
# 作用:学习率
# 范围:LoRA通常1e-4到5e-4,全参数微调更小

num_train_epochs: 3.0
# 作用:训练轮数
# 经验:SFT通常3-10轮

lr_scheduler_type: cosine
# 作用:学习率调度器
# 选项:linear、cosine、cosine_with_restarts、constant
# cosine:余弦衰减,平滑收敛

warmup_ratio: 0.1
# 作用:学习率预热比例
# 计算:前10%的步数从0线性增加到目标学习率
# 目的:稳定训练初期

bf16: true
# 作用:使用bfloat16混合精度
# 要求:Ampere架构以上GPU(A100/3090/4090等)
# 替代:fp16(V100等旧卡)

ddp_timeout: 180000000
# 作用:分布式训练超时时间(秒)
# 默认:1800秒,这里设很大(约5.7年)
# 用途:禁用超时,用于长时间训练

# 评估参数配置
val_size: 0.1
# 作用:验证集比例
# 计算:从训练数据中划分10%作为验证集

per_device_eval_batch_size: 1
# 作用:评估时的批次大小
# 注意:通常比训练批次大,因为不计算梯度

eval_strategy: steps
# 作用:评估策略
# 选项:steps(按步数)、epoch(按轮数)、no(不评估)

eval_steps: 500
# 作用:每多少训练步评估一次

 

数据集template模板

# 原始数据
{
    "instruction": "解释人工智能",
    "input": "",
    "output": "人工智能是..."
}

# 应用 template 后
"""
<|im_start|>user
解释人工智能<|im_end|>
<|im_start|>assistant
人工智能是...<|im_end|>
"""

不同模型所需的模板:

# Llama 3 模板
<|begin_of_text|><|start_header_id|>user<|end_header_id|>
{instruction}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
{output}<|eot_id|>

# Qwen 模板
<|im_start|>user
{instruction}<|im_end|>
<|im_start|>assistant
{output}<|im_end|>

# ChatGLM 模板
[gMASK]sop<|user|>
{instruction}
<|assistant|>
{output}

# 添加特殊分隔符
bos_token: "<s>"          # 开始符
eos_token: "</s>"         # 结束符
pad_token: "[PAD]"        # 填充符

# 角色标记
user_token: "Human:"
assistant_token: "Assistant:"
system_token: "System:"
# 正确模板:模型能识别对话结构
# 错误模板:模型学习混乱的格式,难以收敛
# 训练时用的模板必须与推理时一致
# 否则生成的内容格式错误

 

posted @ 2025-11-24 11:31  wangssd  阅读(307)  评论(0)    收藏  举报