大模型微调技术对比:PEFT 原生实现与 LLaMA-Factory
在 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)。
# 摘自微调 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, : labels}

