大模型微调 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)。

# 摘自微调 Notebook:手动处理对话模板和掩码defpreprocess_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 表示不计算 Lossif 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 怎么拼,只需要指定模板名称。

# 命令行参数--template qwen 

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


2. 模型加载与 LoRA 挂载

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

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 :
参数化配置,自动寻找目标模块。

--finetuning_type lora \--lora_rank8\--lora_alpha16\--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 即可无缝切换算法。

模型微调过程中的关键参数:
1、r ( 秩 ):LoRA采用的低秩分解矩阵,关键的一个参数就是矩阵的秩r, 表示这个矩阵蕴含多少有用的信息。
2、alpha (涉及权重矩阵的更新幅度): alpha/r * BA, 可知alpha可以控制lora微调权重的幅度,可以是r的2倍或者4倍。
3、target_modules ( 微调的模块 ): 一般模型微调,调整的可能只有q_proj、k_proj、v_proj这三个权重矩阵,如果考虑微调FFN层,也可以增加up_proj、down_proj层。当然,如果你在微调过程中,想要实现让非思考模型先思考再输出,可以考虑增加特殊token,如果一旦增加特殊的token之后,一定要调整Emedding层embed_tokens,不然非常可能会输出乱码(采样概率相差不大导致的)。
4、dropout率:避免模型微调训练过拟合。


三、 深度对比总结表

维度PEFTLLaMA-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镜像源下载模型

exportUSE_MODELSCOPE_HUB=1

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

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_len1024\--per_device_train_batch_size1\--gradient_accumulation_steps16\--learning_rate 5e-5 \--num_train_epochs3.0\--lr_scheduler_type cosine \--logging_steps5\--save_steps100\--fp16 True \--gradient_checkpointing True \--lora_rank8\--lora_alpha16\--lora_target all \--pref_beta0.1\--plot_loss True \--trust_remote_code True 

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

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 维度不匹配或显存溢出。

Read more

安路Anlogic FPGA下载器的驱动安装与测试教程

安路Anlogic FPGA下载器的驱动安装与测试教程

参考链接:安路下载器JTAG驱动安装 - 米联客(milianke) - 博客园 安路支持几款下载器: AL-LINK在线下载器是基于上海安路信息科技股份科技有限公司全系列 CPLD/FPGA 器件,结合公司自研的 TD 软件,可实现在线 JTAG 程序下载、ChipWatcher 在线调试、FLASH 读写、Device Chain 模式烧录。下载器配合 USB-B 数据线、2.54mm 间距 10 针扁平线使用,实物如图所示 1.下载并安装软件 工具与资料下载-国产FPGA创新者 - 安路科技 (需要注册登录) 2.安装驱动 当完成TD软件安装后,可以在安装路径下找到对应驱动。 2.1 右击anlocyusb.inf选择安装: 2.2

LoRA训练助手:5分钟学会生成Stable Diffusion完美标签

LoRA训练助手:5分钟学会生成Stable Diffusion完美标签 你有没有试过这样训练LoRA模型? 对着一张精心挑选的图片,反复琢磨怎么写tag—— “是写‘anime girl’还是‘Japanese anime style girl’?” “背景该不该加‘studio background’?加了会不会干扰主体?” “质量词放前面还是后面?masterpiece和best quality哪个权重更高?” 结果花半小时写的tag,训练出来效果平平,甚至出现特征漂移…… 更糟的是,换一批图,又要重头来一遍。 别再手动拼凑标签了。 今天这个工具,能让你输入一句中文描述,3秒生成专业级英文训练标签—— 格式规范、权重合理、维度完整,直接复制就能进SD/FLUX训练流程。 不是提示词优化,不是风格建议,而是专为LoRA/Dreambooth数据准备阶段打造的精准标签生成器。 它不猜你的意图,它理解你的画面; 它不堆砌关键词,它组织语义层级; 它不输出杂乱短语,它交付可直接喂给训练器的标准化字符串。 准备好告别标签焦虑了吗?我们直接开干 → 1. 为什么你需要一个“

NIC400生成Flow全解析(八)Micro Architechture

当所有配置完成后,就可以生成Micro Architechture了。在Micro Architechture中也会进行一系列配置。比如微架构、timing closure、buffering等配置。 生成Micro Architechture的方法如下: 生成时需要解决掉所有报错问题后,即可打开Micro Architechture。打开方式如下: 大致界面如下: 其中主要包含了如下元素: * Micro Architechture窗口 * Parameter/Timing Closure/Buffering窗口 * Overlays窗口 1.Micro Architechture窗口 该窗口主要是设定需要的互联微架构,AMBA Designer生成NIC-400时需要手动定义,Socrates生成NIC-400时会根据工具内部算法生成一个微架构。生成后也可以根据自己的需求进行调整。图中的各种标志如下所示: Micro Architechture的左边有一排按键,11个按键的含义从上到下依次为: * Zoom in:视图放大 * Zoom o

Sublime配置verilog开发环境-具备语法高亮、代码补全、自定义代码段及语法检查等功能,提升FPGA开发效率!

Sublime配置verilog开发环境-具备语法高亮、代码补全、自定义代码段及语法检查等功能,提升FPGA开发效率!

对于在学习FPGA开发之前使用过其他集成开发工具如VS、pycharm、keil或编辑工具如Sublime、VScode、Notepad的朋友,在使用Vivado时可能会像博主一样感觉自带编辑器用起来不太舒服,比如不支持语法高亮显示,不支持代码自动补全等功能。因次,使用第三方编辑器来编写Verilog代码是很有必要的。 本文将详细介绍如何在文本编辑器Sublime中配置verilog开发环境,最终实现语法高亮、代码补全、自定义代码段及语法检查等功能,使得可以在Sublime中高效编写verilog代码,大幅提升FPGA开发效率!附带自己在配置中的踩坑经验,希望朋友们按着下面的流程走可以一步配置到位!下面两图为使用Vivado编写代码及使用Sublime编写代码的对比图。 1.Sublime的介绍与安装配置         Sublime Text,是一款由 Sublime HQ 开发的跨平台轻量级代码编辑器,以 “启动快、插件丰富、自定义性强” 为核心特点,广泛用于代码编写、文本编辑和开发效率提升,支持 Windows、macOS、Linux 三大操作系统。