大模型微调 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 维度不匹配或显存溢出。


相关推荐
九.九6 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见6 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭6 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
deephub7 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
大模型RAG和Agent技术实践7 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核
老邋遢7 小时前
第三章-AI知识扫盲看这一篇就够了
人工智能
互联网江湖7 小时前
Seedance2.0炸场:长短视频们“修坝”十年,不如AI放水一天?
人工智能
PythonPioneer7 小时前
在AI技术迅猛发展的今天,传统职业该如何“踏浪前行”?
人工智能
冬奇Lab8 小时前
一天一个开源项目(第20篇):NanoBot - 轻量级AI Agent框架,极简高效的智能体构建工具
人工智能·开源·agent
阿里巴巴淘系技术团队官网博客8 小时前
设计模式Trustworthy Generation:提升RAG信赖度
人工智能·设计模式