三、LLaMA Factory 微调通用设置
了解完 LLaMA Factory 的基础使用,下面我们开始实际启动一个模型微调任务,并且在这个过程中具体介绍各项参数,首先我们来看通用配置。
3.1 选择模型
第一步,我们需要选择一个用来微调的基础模型,我们可以直接在模型名称这里输入我们需要微调的模型关键词(比如 DeepSeek、Qwen3),基本上市面上所有主流的开源模型都可以在这里获取到,可以发现,一个模型其实有非常多的变体:
我们需要进行的是监督指令微调,建议选择带 -Instruct 后缀的模型:
选取模型后,模型路径的位置会自动关联 Hugging Face 上的模型标识,如果你没有在本地下载过此模型,LLaMA Factory 将自动从 Hugging Face 上拉取此模型(增加 USE_MODELSCOPE_HUB=1 环境变量可以从国内社区下载)。
选择好模型后,我们点击下方 Chat Tab ,然后直接点击加载模型:
然后我们可以直接与模型进行对话,当模型能够正常输出,说明模型被正确加载:
另外这里我们也可以直接执行一个本地的模型路径(注意重新加载模型前需要先卸载模型):

3.2 微调方法
接下来,我们选择一个微调方法,可以看到这里支持 Full(全参)、Freeze(冻结)、Lora(低秩矩阵) 三种方法:
3.2.1 全参数微调
全参数微调是最直接的迁移学习方法,通过在目标任务数据上继续训练预训练模型的全部参数。
通俗理解:就好比把一栋房子彻底拆掉重建。预训练模型就像已经建好的房子,里面的每一块砖、每一根梁,在全参数微调时都要重新调整。例如,当我们想用一个原本用于识别普通图片的模型,改造为识别医学影像的模型时,就要把模型里所有参数都更新一遍。
全参数微调适用场景:有充足的计算资源、需要最大化模型性能、目标任务与预训练任务有显著差异、 或有足够的任务数据可以有效训练所有参数。
3.2.2 参数冻结微调
参数冻结微调通过选择性地冻结模型的某些部分,只更新剩余参数,从而减少计算量并防止过拟合。
通俗理解:像是给房子做局部装修。我们保留房子的框架结构,只对部分区域进行改造。在模型中,就是保留预训练模型的底层结构,只调整顶层的部分参数。比如在训练一个糖尿病问答模型时,我们可以把语言模型的前 24 层参数冻结起来,只训练最后 3 层专门用于医学领域问答的分类器。
参数冻结微调适用场景:计算资源受限的环境、训练数据集较小、目标任务与预训练任务相似、模型主要需要学习任务特定的表示、需要防止过拟合。
3.2.3 Lora 微调
LoRA 通过向预训练模型中注入小型、可训练的低秩矩阵,在保持原始参数不变的情况下实现高效微调。
通俗理解:可以想象成给房子安装智能设备,不改变房子的原有结构,却能让房子变得更智能。在模型里,它不会直接修改原有的参数,而是在关键位置插入可训练的 "小模块"。
Lora 微调适用场景:计算资源有限、需快速适配新任务(如多任务切换)、追求轻量化模型部署与分享、目标任务和预训练任务存在中等差异、多模态任务场景、需频繁基于新数据迭代优化的场景。
LoRA 微调是目前最热门的微调方法,核心在于其高效性与适配性。训练过程中,LoRA 仅对少量低秩矩阵参数进行调整,相比全量参数微调,计算量和内存占用显著降低,训练速度大幅提升;同时,参数调整量少,极大降低了过拟合风险,使模型泛化能力更强。应用层面,它能灵活适配不同任务,为同一预训练模型构建多个 LoRA 模块,快速切换实现多任务学习;在部署阶段,其注入的线性层可与冻结参数无缝合并,不增加推理延迟。
3.3 模型量化
下面一个重要的配置是模型的量化,包括量化的等级和方法。
模型量化是一种通过降低权重和激活值的精度来减小模型尺寸、加快推理速度,同时尽量保持模型准确率的技术。简单来说,就是用更少的数字位数来表示模型中的数据。
通俗理解:想象一下从无损音乐(FLAC)到压缩音乐(MP3)的转换。无损音乐就像 FP32 模型,保存了所有细节,但文件很大。MP3 就像量化后的INT8模型,牺牲了一些人耳难以察觉的细节,但大幅减小了文件体积。不同的比特率 (320kbps、128kbps等) 就像不同等级的量化 (INT8、INT4等) 。
3.3.1 精度单位
这里的 BF 是属于一种模型参数的精度单位,常用的精度单位有:
- FP:浮点(Floating Point),如 FP16、FP32,可以理解为科学计数法表示的数字,包含符号位、指数部分和尾数部分;优点:可表示范围广,精度高、缺点:占用空间较大。
计算机底层使用的是二进制存储(也就是只能存0 和 1)这里的 16、32 是二进制位数(bit),也就是计算机存储这个数时用了多少个 0 和 1。比如 FP32 就是用 32 个二进制位(4 字节,1 字节 = 8 位) 存一个浮点数。FP16 就是用 16 个二进制位(2 字节) 存一个浮点数。 - BF:脑浮点(Brain Floating Point),如 BF16,专为深度学习设计的浮点数格式,相比传统浮点数,在保持数值范围的同时减少精度,平衡了精度和范围的需求,兼顾精度与效率。
- INT:整数(Integer),如 INT8、INT4,用整数表示权重和激活值,压缩模型体积并加速推理。优点:结构简单,占用空间小、缺点:表示范围有限,精度丢失较多。
3.3.2 量化过程
我们可以看到,上面的 INT8 存储的值是 11001000(转换为 10 进制为 200), 这里就会用到一个量化的过程:
-
确定缩放系数:假设我们的数据范围是[0, 4],使用无符号 INT8(范围0~255),那么Scale = 4/255 ≈ 0.0157;
-
计算量化后的值:3.1415926 ÷ 0.0157 ≈ 200;
-
存储整数:200 的二进制表示为 11001000;
-
执行推理:读取到参数的整数值为200,乘以 Scale(0.0157) 还原为 3.14;
在模型微调中,量化也是一种很重要的加速手段。以 QLoRA 为例,它创新性地将4位量化与低秩适配器 LoRA 相结合,通过动态量化、双量化和训练时反量化机制,在大幅减少显存占用的同时,保障梯度更新的准确性。所以,在这里如果我们选择启动量化,并选择量化等级,默认使用的微调方法就是 QLoRA。
3.4 对话模版
对话模版一般我们选择默认就可以了,不过这里我们也简单了解一下为什么会有对话模版这样一个概念。
对话模板实际上是大语言模型与用户交互的"翻译器"。每个大语言模型(LLM)都有自己特定的输入格式要求,例如:Llama2 需要使用 [INST] 和 [/INST] 标记,而 Qwen 系列使用 <|im_start|> 和 <|im_end|>。对话模板提供了一个统一的接口,让开发者可以用相同的方式与不同的模型交互,而不必担心底层格式差异。
- 模型训练与推理的一致性保证:大语言模型在训练时使用特定格式,在推理(使用)时也必须保持相同的格式,否则性能会严重下降。对话模板确保了这种一致性,让模型能够:正确识别用户和系统的输入、明确知道自己应该从什么位置开始生成内容、停止在适当的位置(通过stop_words);
- 多轮对话的上下文管理:现代大语言模型都支持多轮对话,但需要正确地组织历史对话信息。对话模板可以:管理对话历史的格式、区分不同说话者(用户、助手、系统)、确保模型能正确理解对话流程;
- 特殊功能处理:除了基本的对话外,模板还处理许多高级功能:
- 系统提示(System Prompt):设置模型的角色和行为指南;
- 工具调用(Tool Calling):使模型能够调用外部工具和API;
- 思维链(Chain-of-Thought):通过ReasoningTemplate支持模型的分步思考;
- 多模态输入:处理文本以外的输入,如图像、音频等;
3.5 加速方式
这里目前我们可以看到共支持三种方法:
比较熟悉的加速方式是 Unsloth,它默认就会采用动态的 4 位量化,这也是它一个非常重要的加速手段;我们在 LLaMA Factory 中将量化等级选择为 4 bit,然后加速方法选择 Unsloth 时,模型微调的速度与内存占用和直接使用 Unsloth 是相似的。另外两种加速方式,大家做简单了解即可,如果你对微调性能没有过多要求,可以选择默认(默认会使用 Flash Attention 加速),如果本地硬件条件非常受限,可以选择启用 Unsloth + 4 位量化。另外一种加速方式 Liger Kernel ,我们在后面的章节中会提到。