发布时间:2025-06-20 11:24:02编辑:123阅读(20)
LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它,用户可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调。访问地址:https://github.com/hiyouga/LLaMA-Factory
全场景模型微调能力
多模型支持:高效适配超 100 个主流模型,涵盖 Qwen、DeepSeek、LLaMA、Gemma、LLaVA、Mistral、Mixtral-MoE、Yi、Baichuan、ChatGLM、Phi 等,满足 NLP、多模态等多领域需求。
多样化算法与精度:集成 LoRA、GaLore、DoRA 等微调技术,支持(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO/DPO/KTO/ORPO 等强化学习方法;提供 16 比特全参数微调、冻结微调、LoRA 微调,以及基于 AQLM/AWQ/GPTQ 等技术的 2/3/4/5/6/8 比特 QLoRA 低比特量化微调,灵活适配不同算力场景。
数据集灵活配置:支持用户自带数据集或自定义生成数据集,兼容 ModelScope、HuggingFace 等社区资源,自动下载缓存模型与数据集,适配多卡训练硬件环境。
多种加速技巧:支持 FlashAttention-2、Unsloth 等加速算子。
极简操作与高效工具链
零代码交互界面:通过友好 Web UI 完成模型配置、数据集加载、参数调优全流程,实时监控训练进度、显存占用及日志输出,无需编程即可轻松定制与微调 LLM,大幅降低使用门槛。
实时监控与评估:无缝集成 Wandb、MLflow、SwanLab、TensorBoard 等工具,实现训练过程可视化与模型性能动态评估,为优化提供数据支撑。
工程化部署与资源利用
模型部署:支持将 LoRA 适配器与基座模型一键合并为独立完整模型,便于本地化部署;
推理引擎:集成 Transformers 、提供基于 vLLM 的 OpenAI 风格 API;
资源利用:支持单机多卡训练与不同硬件环境适配,实现资源高效利用与流程无缝衔接。
Unsloth 适合:
资源受限场景:由于其出色的内存优化能力和快速的微调速度,非常适合在资源受限的环境中使用,如个人开发者使用消费级 GPU 进行大模型微调,或者企业在低成本硬件上进行模型实验和开发。
快速迭代场景:对于需要快速迭代模型的场景,如学术研究中的实验验证、企业的快速原型开发等,Unsloth 的高效微调能力可以帮助用户在更短的时间内获得微调后的模型,加快项目进度。
LLaMa Factory 适合:
通用场景:由于其支持多种模型和训练算法,适用于各种通用的大语言模型训练和微调场景,无论是文本生成、情感分析还是机器翻译等任务,都可以使用 LLaMa Factory 进行模型的定制化训练。
企业级应用:提供了API Server 和一站式 WebUI Board,方便企业进行模型的管理和部署。
零代码:适合不会写代码或代码基础比较弱的同学快速上手进行微调。
LLaMA Factory 安装
在官网可以看到 LLaMa Factory 的安装方法:
https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/installation.html#llama-factory
但是这里不建议 Clone 仓库后直接安装依赖,因为 Python 本身的依赖管理做的比较混乱,你可能会遇到各种 Python 依赖冲突的问题,建议使用虚拟环境,这里使用 Conda.
使用 conda create 命令创建一个新的虚拟环境。例如,创建一个名为 lf (LLaMA Factory 简称)的虚拟环境,并指定 Python 版本为 3.10:
其中,-n 或 --name 用于指定虚拟环境的名称,python=3.10 表示使用 Python 3.10 版本。
conda create -n llama_factory python=3.10
激活虚拟环境
conda activate llama_factory
使用 conda env list 命令查看所有已创建的虚拟环境:
依赖环境安装
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]" -i https://mirrors.aliyun.com/pypi/simple
依赖安装完成后,执行 llamafactory-cli version 验证安装情况:
llamafactory-cli version
然后测试执行 which llamafactory-cli 可以发现,llamafactory 被安装在了 conda 创建的虚拟环境目录下:
which llamafactory-cli
LLaMA Factory WebUI
依赖安装完成后,执行:llamafactory-cli webui,可以启动 LLaMa Factory 的 webui
llamafactory-cli webui
然后打开 http://127.0.0.1:7860 ,可以看到如下界面
看起来配置非常多,但梳理一下可以分成通用设置、微调训练、模型评估、在线推理、模型导出五个部分,这里先做简单了解,后续会对关键配置进行具体讲解:
通用设置:可以设置 WebUI 展示的语言、需要微调的模型、微调的方法、是否量化、微调的加速方式等配置
微调训练:包括以下几部分配置:
微调训练的阶段:预训练、指令微调、强化学习等等;
微调使用的数据集:数据集的格式、路径、验证集的比例等等;
关键微调参数:在我们之前教程中重点学习的:学习率、训练轮数、批量 大小等等;
LoRA 参数:当使用 Lora 微调时需要配置的一些特殊参数;
RLHF 参数:当训练阶段为强化学习时需要配置的一些特殊参数;
特殊优化参数:当选择使用 GaLore、APOLLO 和 BAdam 优化器时需要配置的一些参数;
SwanLab 参数:一款开源的模型训练跟踪与可视化工具;
模型评估:在完成模型训练后,可以通过此模块来评估模型效果,这里可配置模型评估所需的数据集等:
在线推理:可以选择使用 huggingface、vllm 等推理引擎和模型在线聊天,主要用来测试加载模型:
模型导出:可以指定模型、适配器、分块大小、导出量化等级及校准数据集、导出设备、导出目录等。
LLaMA Factory 微调通用设置
了解完 LLaMA Factory 的基础使用,下面开始实际启动一个模型微调任务,并且在这个过程中具体介绍各项参数,首先我们来
看通用配置。
选择模型
第一步,需要选择一个用来微调的基础模型,可以直接在模型名称这里输入我们需要微调的模型关键词
(比如 DeepSeek、Qwen3),基本上市面上所有主流的开源模型都可以在这里获取到,可以发现,一个模型其实有非常多的
变体.
在之前 DeepSeek 的教程中,已经介绍了,在模型名称中,Distill 代表蒸馏过的模型,也了解了模型名称中的参数量表示.
在微调前,选择一个合适的基座模型非常重要,下面再具体介绍一下模型名称中其他参数代表的含义.
如果需要进行的是监督指令微调,建议选择带 -Instruct 后缀的模型:
选取模型后,模型路径的位置会自动关联 Hugging Face 上的模型标识,如果你没有在本地下载过此模型.
LLaMA Factory 将自动从 Hugging Face 上拉取此模型。选择好模型后,点击下方 Chat Tab ,然后直接点击加载模型:
本地如果没有下载改模型,会自动下载。
然后可以直接与模型进行对话,当模型能够正常输出,说明模型被正确加载。
另外这里也可以直接执行一个本地的模型路径(注意重新加载模型前需要先卸载模型)
微调方法
接下来,选择一个微调方法,可以看到这里支持 Full(全参)、Freeze(冻结)、Lora(低秩矩阵) 三种方法:
全参数微调是最直接的迁移学习方法,通过在目标任务数据上继续训练预训练模型的全部参数。
通俗理解:就好比把一栋房子彻底拆掉重建。预训练模型就像已经建好的房子,里面的每一块砖、每一根梁,在全参数微调时都要重新调整。例如,当我们想用一个原本用于识别普通图片的模型,改造为识别医学影像的模型时,就要把模型里所有参数都更新一遍。
优点
最大化性能:通常能够在目标任务上达到最佳性能
完全适应性:允许模型充分适应新任务的特性
灵活性:可以用于各种不同的下游任务
实现简单:概念直接,实现相对简单
缺点
计算资源需求高:需要大量GPU内存和计算能力
存储成本高:每个任务都需要保存一个完整模型副本
灾难性遗忘:可能会丢失原始预训练中获得的知识
过拟合风险:在小数据集上容易过拟合
不适合低资源场景:在资源受限设备上难以部署
全参数微调适用场景:有充足的计算资源、需要最大化模型性能、目标任务与预训练任务有显著差异、 或有足够的任务数据可以有效训练所有参数。
参数冻结微调通过选择性地冻结模型的某些部分,只更新剩余参数,从而减少计算量并防止过拟合。
通俗理解:像是给房子做局部装修。我们保留房子的框架结构,只对部分区域进行改造。在模型中,就是保留预训练模型的底层结构,只调整顶层的部分参数。比如在训练一个糖尿病问答模型时,我们可以把语言模型的前 24 层参数冻结起来,只训练最后 3 层专门用于医学领域问答的分类器。
优点
计算效率:减少需要计算的参数数量,加快训练速度
内存效率:反向传播中不需要存储冻结参数的梯度
防止过拟合:特别适合小型数据集训练
保留通用特征:防止破坏预训练模型中有价值的通用特征
减少灾难性遗忘:保持模型的泛化能力
缺点
性能可能次优:在某些任务上可能无法达到全参数微调的性能
需要专业知识:选择哪些层冻结需要对模型架构有深入了解
灵活性降低:在任务与预训练差异大时效果可能不佳
调优困难:找到最佳的冻结点可能需要多次实验
参数冻结微调适用场景:计算资源受限的环境、训练数据集较小、目标任务与预训练任务相似、模型主要需要学习任务特定的表示、需要防止过拟合。
LoRA 微调通过向预训练模型中注入小型、可训练的低秩矩阵,在保持原始参数不变的情况下实现高效微调。
通俗理解:可以想象成给房子安装智能设备,不改变房子的原有结构,却能让房子变得更智能。在模型里,它不会直接修改原有的参数,而是在关键位置插入可训练的 “小模块”。
优点
极高的参数效率:训练参数数量减少99%以上
内存效率:大幅降低GPU内存需求
训练速度快:减少计算量,加快收敛
存储高效:每个任务只需保存小型适配器
可组合性:不同任务的适配器可以组合使用
避免灾难性遗忘:原始参数保持不变
缺点
性能上限:在某些复杂任务上可能弱于全参数微调
秩超参数选择:需要为不同模型和任务调整适当的秩
实现复杂性:比简单的微调方法实现更复杂
不是所有层都适合:某些特殊层可能不适合低秩适应
推理稍复杂:需要额外处理原始模型和适配器的组合
Lora 微调适用场景:计算资源有限、需快速适配新任务(如多任务切换)、追求轻量化模型部署与分享、目标任务和预训练任务存在中等差异、多模态任务场景、需频繁基于新数据迭代优化的场景。
LoRA 微调是目前最热门的微调方法,核心在于其高效性与适配性。训练过程中,LoRA 仅对少量低秩矩阵参数进行调整,相比全量参数微调,计算量和内存占用显著降低,训练速度大幅提升;同时,参数调整量少,极大降低了过拟合风险,使模型泛化能力更强。应用层面,它能灵活适配不同任务,为同一预训练模型构建多个 LoRA 模块,快速切换实现多任务学习;在部署阶段,其注入的线性层可与冻结参数无缝合并,不增加推理延迟。
模型量化
下面一个重要的配置是模型的量化,包括量化的等级和方法。
模型的量化还有蒸馏,其实都是属于模型压缩的常见方法。对于一些大参数模型,比如前段时间非常火的 DeepSeek-R1 满血版具有 6710 亿个参数、最新的 Qwen3 满血版有 2350 亿个参数,它们都是各自公司下的旗舰版模型,具备着最先进的能力。但是由于参数量巨大,普通的小公司或者个人想要在本地部署模型需要的成本是非常高的,所以我们一般会选择使用量化、蒸馏这些手段对模型进行压缩,从而在损失一定精度的情况下减小模型的部署成本。
模型量化是一种通过降低权重和激活值的精度来减小模型尺寸、加快推理速度,同时尽量保持模型准确率的技术。简单来说,就是用更少的数字位数来表示模型中的数据。
通俗理解:想象一下从无损音乐(FLAC)到压缩音乐(MP3)的转换。无损音乐就像 FP32 模型,保存了所有细节,但文件很大。MP3 就像量化后的INT8模型,牺牲了一些人耳难以察觉的细节,但大幅减小了文件体积。不同的比特率 (320kbps、128kbps等) 就像不同等级的量化 (INT8、INT4等) 。
大模型本质上是由很多参数构成的,比如 DeepSeek-R1 满血版具有 6710 亿个参数。大模型通常是基于深度学习的神经网络架构,由大量的神经元和连接组成。这些参数主要包括神经元之间的连接权重以及偏置项等。在模型的训练过程中,这些参数会通过反向传播算法等优化方法不断调整和更新,以最小化损失函数,从而使模型能够学习到数据中的规律和特征。而在计算机中,这些参数是以数字的形式存储和计算的,通常使用浮点数(如单精度浮点数 float32 或双精度浮点数 float64)来表示,以在精度和计算效率之间取得平衡。
为了表示这些参数,需要在计算机上开辟一些内存空间,开辟多大的内存空间就取决于这些参数存储的精度。如果参数的精度越低,所需的内存空间就越小,反之参数精度越高,所需内存空间就越大。比如把原本存储了 7 位小数的一个参数:3.1415926,转换成一个精度更低的值:3.14 来进行存储,很明显丢掉的精度仅仅为 0.0015926 ,但是却大大节省了存储空间,模型量化的本质其实就是把模型的参数从高精度转换成低精度的过程。在 Hugging Face 上可以看到模型参数的存储精度,比如 Qwen3-235B 的参数使用的是 BF16:
这里的 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,用整数表示权重和激活值,压缩模型体积并加速推理。优点:结构简单,占用空间小、缺点:表示范围有限,精度丢失较多。
以下是一些常见的模型参数的精度:
FP32(单精度):32 位 = 1 位符号 + 8 位指数 + 23 位尾数,能够表示的精度范围是:±3.4×10³⁸ ;
FP16(半精度):16 位 = 1 位符号 + 5 位指数 + 10 位尾数,能够表示的精度范围是: ±65,504;
BF16(脑浮点):;16 位 = 1 位符号 + 8 位指数 + 7 位尾数,范围与 FP32 相同(±3.4×10³⁸),但尾数更短。
INT8:8 位二进制,有符号范围 - 128~127,无符号 0~255。
INT4:4 位二进制,有符号范围 - 8~7,无符号 0~15。
这里可能大家会有一些疑问,INT 无法表示小数,这意味着要舍弃掉所有小数位吗?可以看到,上面的 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。
对话模板
对话模版一般我们选择默认就可以了,不过这里我们也简单了解一下为什么会有对话模版这样一个概念。
对话模板实际上是大语言模型与用户交互的"翻译器"。每个大语言模型(LLM)都有自己特定的输入格式要求,例如:Llama2 需要使用 [INST] 和 [/INST] 标记,而 Qwen 系列使用 <|im_start|> 和 <|im_end|>。对话模板提供了一个统一的接口,让开发者可以用相同的方式与不同的模型交互,而不必担心底层格式差异。
模型训练与推理的一致性保证:大语言模型在训练时使用特定格式,在推理(使用)时也必须保持相同的格式,否则性能会严重下降。对话模板确保了这种一致性,让模型能够:正确识别用户和系统的输入、明确知道自己应该从什么位置开始生成内容、停止在适当的位置(通过stop_words);
多轮对话的上下文管理:现代大语言模型都支持多轮对话,但需要正确地组织历史对话信息。对话模板可以:管理对话历史的格式、区分不同说话者(用户、助手、系统)、确保模型能正确理解对话流程;
特殊功能处理:除了基本的对话外,模板还处理许多高级功能:
系统提示(System Prompt):设置模型的角色和行为指南;
工具调用(Tool Calling):使模型能够调用外部工具和API;
思维链(Chain-of-Thought):通过ReasoningTemplate支持模型的分步思考;
多模态输入:处理文本以外的输入,如图像、音频等;
假设我们使用 Qwen 模板:
register_template(
name="qwen",
format_user=StringFormatter(slots=["<|im_start|>user\n{{content}}<|im_end|>\n<|im_start|>assistant\n"]),
format_assistant=StringFormatter(slots=["{{content}}<|im_end|>\n"]),
format_system=StringFormatter(slots=["<|im_start|>system\n{{content}}<|im_end|>\n"]),
format_function=FunctionFormatter(slots=["{{content}}<|im_end|>\n"], tool_format="qwen"),
format_observation=StringFormatter(
slots=["<|im_start|>user\n<tool_response>\n{{content}}\n</tool_response><|im_end|>\n<|im_start|>assistant\n"]
),
format_tools=ToolFormatter(tool_format="qwen"),
default_system="You are Qwen, created by Alibaba Cloud. You are a helpful assistant.",
stop_words=["<|im_end|>"],
replace_eos=True,
)
一个完整的工作流程是:
1 输入处理阶段:用户输入: "帮我写一首关于春天的诗"
转换后:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.
<|im_end|>
<|im_start|>user
帮我写一首关于春天的诗
<|im_end|>
<|im_start|>assistant
1 模型处理:模型接收这个格式化的输入,并从 <|im_start|>assistant 后开始生成内容;
2 输出处理阶段:模型会生成内容直到 <|im_end|> ,然后停止;
3 下一轮对话:如果用户继续对话,新的用户输入会被添加到历史中,形成新的输入。
加速方式
这里目前我们可以看到共支持三种方法:
FlashAttention
FlashAttention 能够加快注意力机制的运算速度,同时减少对内存的使用。
如果您想使用 FlashAttention,请在启动训练时在训练配置文件中添加以下参数:
flash_attn: fa2
Unsloth
Unsloth 框架支持 Llama, Mistral, Phi-3, Gemma, Yi, DeepSeek, Qwen等大语言模型并
且支持 4-bit 和 16-bit 的 QLoRA/LoRA 微调,该框架在提高运算速度的同时还减少了显存占用。
如果您想使用 Unsloth, 请在启动训练时在训练配置文件中添加以下参数:
use_unsloth: True
Liger Kernel
Liger Kernel 是一个大语言模型训练的性能优化框架, 可有效地提高吞吐量并减少内存占用。
如果您想使用 Liger Kernel,请在启动训练时在训练配置文件中添加以下参数:
enable_liger_kernel: True
比较熟悉的加速方式是 Unsloth,它默认就会采用动态的 4 位量化,这也是它一个非常重要的加速手段;
在 LLaMA Factory 中将量化等级选择为 4 bit,然后加速方法选择 Unsloth 时,模型微调的速度与内存占用和直接使用 Unsloth 是相似的。
另外两种加速方式,大家做简单了解即可,如果你对微调性能没有过多要求,可以选择默认(默认会使用 Flash Attention 加速),
如果本地硬件条件非常受限,可以选择启用 Unsloth + 4 位量化。
上一篇: 使用ms-swift基于Qwen3-8B微调小说模型
下一篇: 没有了
48960
48095
38835
35958
30375
27163
26156
20992
20826
19176
20°
719°
790°
767°
768°
747°
694°
816°
883°
1024°