大模型微调 PEFT vs LLaMA-Factory

大模型微调 PEFT vs LLaMA-Factory:两种微调(SFT)模式深度对比与原理解析

在 LLM(大语言模型)微调的圈子里,开发者通常会接触到两种截然不同的流派:一种是原生代码流 ,即直接使用 HuggingFace Transformers 和 PEFT 库编写 Python 代码;另一种是框架工具流,以 LLaMA-Factory 为代表的集成化工具。


一、 两种微调模式简介

1. PEFT

核心逻辑:开发者需要自己处理数据清洗、Tokenizer 编码、Label Masking(标签掩码)、模型加载、LoRA 配置挂载以及训练循环。

2. LLaMA-Factory

这是目前工业界和学术界快速迭代的首选。
核心逻辑 :将上述繁琐的代码封装成"黑盒",通过配置驱动(YAML 或 命令行参数)来控制训练。


二、 核心实现流程对比

为了直观对比,我们以 Qwen (通义千问) 模型的 LoRA 微调为例。

1. 数据预处理 (最本质的区别)

PEFT数据预处理:

你需要手动编写函数来处理 Prompt 格式(如 <|im_start|>)和 Loss 计算逻辑(Masking)。

python 复制代码
# 摘自微调 Notebook:手动处理对话模板和掩码
def preprocess_multi_turn_qwen(example):
    # ... 省略部分代码 ...
    for msg in convs:
        # 手动添加特殊 Token
        prefix = f"<|im_start|>{role}\n"
        # 编码
        prefix_ids = tokenizer(prefix, add_special_tokens=False)["input_ids"]
        content_ids = tokenizer(content, add_special_tokens=False)["input_ids"]
        
        # 核心难点:手动控制 Label,-100 表示不计算 Loss
        if role == "assistant":
            # 只有机器人的回答计算梯度
            turn_labels = [-100] * len(prefix_ids) + content_ids + suffix_ids
        else:
            # 用户和 System 的话不计算梯度
            turn_labels = [-100] * len(current_turn_ids)
    
    return {"input_ids": input_ids, "labels": labels}

LLaMA-Factory:

不需要关心 input_ids 怎么拼,只需要指定模板名称。

bash 复制代码
# 命令行参数
--template qwen

原理: 框架内部维护了一套 template 注册表,自动帮你完成了上述 Python 代码中复杂的 Token 拼接和 Label Masking 工作。


2. 模型加载与 LoRA 挂载

PEFT:

需要显式地定义配置,并手动修改模型结构。

python 复制代码
from peft import LoraConfig, get_peft_model

# 1. 定义配置
config = LoraConfig(
    task_type=TaskType.CAUSAL_LM, 
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], 
    r=8, 
    lora_alpha=16
)

# 2. 加载基座模型
model = AutoModelForCausalLM.from_pretrained(...)

# 3. 挂载
model = get_peft_model(model, config)
model.print_trainable_parameters() # 打印参数量

LLaMA-Factory :

参数化配置,自动寻找目标模块。

bash 复制代码
--finetuning_type lora \
--lora_rank 8 \
--lora_alpha 16 \
--lora_target all  # 自动识别所有线性层

3. 训练

PEFT:

使用 HF Trainer。如果想用高级功能(如 DeepSpeed、FlashAttention、QLoRA),你需要自己写代码配置 TrainingArgumentsBitsAndBytesConfig,非常容易报错(如 OOM、类型不匹配)。

LLaMA-Factory:

开箱即用。

  • 省显存--flash_attn auto
  • 量化--quantization_bit 4
  • 可视化--plot_loss True
  • 强化学习 :直接把 --stage sft 改成 --stage dpo 即可无缝切换算法。

三、 深度对比总结表

维度 PEFT LLaMA-Factory
上手难度 ⭐⭐⭐⭐ (高) ⭐⭐ (低)
灵活性 极高 (可修改模型底层前向传播) 中等 (受限于框架提供的参数)
数据处理 白盒 (完全透明,需手写逻辑) 黑盒 (模板化,依赖 preset)
多轮对话 需手写复杂的掩码(Mask)逻辑 自动处理 user/assistant 掩码
高级特性 需手动集成 DeepSpeed/FlashAttn 一键开启,集成度高
算法切换 SFT转DPO需要重写大量代码 修改 --stage 参数即可
Debug难度 容易出现 Tensor 形状对齐错误 主要是环境依赖报错

四、PEFT与LlamaFactory在Autodl的实现

PEFT:

1、手动提前下载模型,可以提前配置ModelScope的镜像源

2、数据预处理,按照模型的chat模板构造数据集并Tokenization化

3、配置微调的LoRA参数

4、向模型中添加LoRA模块

5、可以通过Swanlab可视化训练过程

参考:PEFT微调

LlamaFactory:

命令行执行:

1、使用modelscope镜像源下载模型

bash 复制代码
export USE_MODELSCOPE_HUB=1

2、使用命令行执行训练,下面是具体参数(DPO,强化学习微调):

bash 复制代码
llamafactory-cli train \
    --stage dpo \
    --do_train True \
    --model_name_or_path qwen/Qwen2.5-0.5B-Instruct \
    --finetuning_type lora \
    --template qwen \
    --dataset dpo_zh_demo \
    --dataset_dir data \
    --output_dir saves/Qwen2.5-0.5B-Instruct/lora/train_dpo_fix \
    --cutoff_len 1024 \
    --per_device_train_batch_size 1 \
    --gradient_accumulation_steps 16 \
    --learning_rate 5e-5 \
    --num_train_epochs 3.0 \
    --lr_scheduler_type cosine \
    --logging_steps 5 \
    --save_steps 100 \
    --fp16 True \
    --gradient_checkpointing True \
    --lora_rank 8 \
    --lora_alpha 16 \
    --lora_target all \
    --pref_beta 0.1 \
    --plot_loss True \
    --trust_remote_code True

3、微调之后需要加载lora微调后的参数和原始权重,进行Chat对话:

bash 复制代码
llamafactory-cli chat \
    --model_name_or_path Qwen/Qwen2.5-0.5B-Instruct \
    --adapter_name_or_path saves/Qwen2.5-0.5B-Instruct/lora/train_dpo_fix \
    --template qwen \
    --finetuning_type lora

五、 结语

LLaMA-Factory 本质上就是一套写得非常健壮、非常全面的"原生代码"

它在底层依然调用了 transformerspeft。对于初学者,建议先用 LLaMA-Factory 跑通全流程,建立信心;当你发现框架无法满足你的魔改需求时,再深入阅读源码或编写自己的 Training Script。

提示:在使用 LLaMA-Factory 时,如果遇到报错,往往是因为环境变量或依赖版本问题(如 CUDA 版本不匹配);而在使用原生代码时,报错通常是因为 Tensor 维度不匹配或显存溢出。


相关推荐
江畔柳前堤19 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术19 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客19 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术20 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO21 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术21 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架21 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab21 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI21 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab1 天前
【无标题】
人工智能·开源