掘金 人工智能 05月16日 11:33
纯本地!零代码!一站式完整数据集准备到模型微调全流程!(一)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍如何使用LLaMA Factory和Easy DataSet,无需编写代码,在本地完成大模型的微调,涵盖数据集准备、模型微调全流程。内容包括微调基础知识回顾、LLaMA Factory工具介绍、安装、WebUI使用,以及通用配置详解。通过实践,帮助用户掌握大模型微调技能,提升特定领域或任务性能。

💡微调是提升通用大模型在特定领域或任务表现的关键技术,它通过领域专业化、适配不同任务、纠偏能力等方式,实现比从头训练更低的成本和更高的效率。

🛠️LLaMA Factory是一个零代码、高效的大型语言模型训练与微调平台,支持多种模型、微调方法和加速技术,用户可以通过WebUI完成模型配置、数据集加载、参数调优等全流程。

⚙️全参数微调、参数冻结微调和LoRA微调是三种常见的微调方法,LoRA因其高效性与适配性,成为目前最热门的选择,它通过调整少量低秩矩阵参数,显著降低计算量和内存占用,并降低过拟合风险。

💾模型量化是减小模型尺寸、加快推理速度的关键技术,通过降低权重和激活值的精度,实现模型压缩。常用的量化等级包括INT8、INT4等,选择合适的量化方法有助于在保持模型准确率的同时降低部署成本。

之前 如何把你的 DeePseek-R1 微调为某个领域的专家? 的微调教程发出后,很多小伙伴想在本地进行尝试微调,但是因为代码能力有限以及对微调过程中的各种知识了解不够深入,遇到了各种问题。因此很多小伙伴求助我能不能出一期零代码、纯本地微调的教程。所以今天这一期,我们来使用目前最热门的本地微调工具:LLaMA Factory 配合 Easy DataSet 一站式完成从数据集准备到模型微调的全流程。另外为了帮助大家更好的学习理解,在这个系列的课程中,我也会穿插讲解一些大模型的基础理论,所以这个教程比较长,我们将拆分成几个部分来讲解,课程大纲如下:


基础回顾

为了更好的学习效果,在学习本期教程前,建议大家先学习一下我之前的几期教程,了解一些模型微调的前置知识:我们先做个简单的回顾:







如果你对这些内容还不够了解,建议先学习这几期内容:

下面,我们来了解一下 LLaMa Factory 这个工具。

LLaMA Factory 介绍和基本使用

LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它,用户可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调。github.com/hiyouga/LLa…

全场景模型微调能力

极简操作与高效工具链

工程化部署与资源利用


LLaMA Factory VS unsloth

Unsloth 是一个开源工具,专门用来加速大语言模型(LLMs)的微调过程。

从以上描述中我们可以看出,Unsloth 主要突出的是更快的速度和更小的内存占用,并且在 Github 上公开了很多整理好的 Colab 笔记本:

通过这些 Colab ,我们可以在只改动一些关键参数(如模型、数据集等),就可以跟随指引一步步完整微调和模型导出的整个过程,并且整个过程不需要消耗我们本地的资源、速度也很快,所以非常推荐初学者使用。

我们可以在 LLaMa Factory 文档(llamafactory.readthedocs.io/zh-cn/lates… 作为一种加速手段出现在了 LLaMa Factory 的介绍里。

通过以上对 LLaMA Factory 的介绍,我们也可以看出 LLaMA Factory 是一个更全面、更完善的微调框架,通过配置模型量化、指定加速算子,也能够达成和 Unsloth 类似的加速效果,但是 LLaMA Factory 支持的模型种类、训练方法、优化方法、硬件适配等都要比 Unsloth 更丰富。另外,LLaMA Factory 支持基于 WebUI 零代码微调,而 Unsloth 仅能通过编码,因此:


LLaMA Factory 安装

我们在官网可以看到 LLaMa Factory 的安装方法:llamafactory.readthedocs.io/zh-cn/lates…

但是这里我们不建议 Clone 仓库后直接安装依赖,因为 Python 本身的依赖管理做的比较混乱,你可能会遇到各种 Python 依赖冲突的问题,建议使用虚拟环境,这里我们使用 Conda:

Conda 是一个开源的跨平台、语言无关的软件包管理系统与环境管理系统。它能方便地安装、运行和更新软件包及其依赖项,还可创建、切换和删除隔离的软件环境,广泛应用于数据科学、机器学习等领域 。

你可以根据自己的需求选择合适的发行版,从官方网站(AnacondaMiniconda)下载对应操作系统的安装程序,然后按照安装向导进行安装。

安装完成后,打开终端(Windows 用户可以使用 Anaconda Prompt 或 PowerShell),输入以下命令验证 conda 是否安装成功:

conda --version

如果安装成功,会显示 conda 的版本号。

然后使用 conda create 命令创建一个新的虚拟环境。例如,创建一个名为 lf (LLaMA Factory 简称)的虚拟环境,并指定 Python 版本为 3.10:

conda create -n lf python=3.10

其中,-n--name 用于指定虚拟环境的名称,python=3.10 表示使用 Python 3.10 版本。

创建好虚拟环境后,需要激活它才能使用,

我们运行 在终端中运行以下命令激活 lf 环境:

conda activate lf

激活后,终端的命令提示符会显示当前所处的虚拟环境名称,然后我们可以使用 conda env list 命令查看所有已创建的虚拟环境:

conda env list

该命令会列出所有虚拟环境的名称和对应的路径(前面带 * 的为当前已激活的虚拟环境):

然后我们在此虚拟环境中执行:

pip install -e ".[torch,metrics]"

依赖安装完成后,我们执行 llamafactory-cli version 验证安装情况:

然后我们测试执行 which llamafactory-cli 可以发现,llamafactory 被安装在了 conda 创建的虚拟环境目录下:


LLaMA Factory WebUI

依赖安装完成后,我们执行:llamafactory-cli webui,可以启动 LLaMa Factory 的 webui:

然后我们打开 http://127.0.0.1:7860 ,可以看到如下界面:

看起来配置非常多,但我们梳理一下可以分成通用设置、微调训练、模型评估、在线推理、模型导出五个部分,这里我们先做简单了解,后续我们会对关键配置进行具体讲解:





LLaMA Factory 微调通用设置

了解完 LLaMA Factory 的基础使用,下面我们开始实际启动一个模型微调任务,并且在这个过程中具体介绍各项参数,首先我们来看通用配置。

选择模型

第一步,我们需要选择一个用来微调的基础模型,我们可以直接在模型名称这里输入我们需要微调的模型关键词(比如 DeepSeek、Qwen3),基本上市面上所有主流的开源模型都可以在这里获取到,可以发现,一个模型其实有非常多的变体:

在之前 DeepSeek 的教程中,我们已经介绍了,在模型名称中,Distill 代表蒸馏过的模型,也了解了模型名称中的参数量表示:

在微调前,选择一个合适的基座模型非常重要,下面我们再具体介绍一下模型名称中其他参数代表的含义:

分类标识含义示例(模型名称)
功能与任务类型-Base基础模型,未经过特定任务微调,提供原始能力(用于二次开发)。Qwen3-14B-Base
-Chat对话优化模型,支持交互式聊天、问答,针对对话生成任务微调。DeepSeek-LLM-7B-Chat
-Instruct指令微调模型,擅长遵循具体任务指令(推理、生成、翻译等)。Qwen3-0.6B-Instruct
-Distill知识蒸馏模型,通过蒸馏技术压缩,模型更小、推理更高效。DeepSeek-R1-1.5B-Distill
-Math专注数学推理任务,优化数值计算、公式解析、逻辑证明等能力。DeepSeek-Math-7B-Instruct
-Coder针对代码生成、编程任务优化,支持代码补全、漏洞检测、算法实现等。DeepSeek-Coder-V2-16B
多模态-VL视觉-语言多模态(Vision-Language),支持图文联合输入输出。Kimi-VL-A3B-Instruct
-Video视频多模态模型,结合视频帧与文本进行交互。LLaVA-NeXT-Video-7B-Chat
-Audio支持音频输入输出,涉及语音识别(ASR)或语音生成(TTS)。Qwen2-Audio-7B
技术特性与优化-Int8/-Int4权重量化为8位/4位,降低显存占用,提升推理速度(适合低资源设备)。Qwen2-VL-2B-Instruct-GPTQ-Int8
-AWQ/-GPTQ特定量化技术(自适应权重/GPTQ量化),优化低精度下的模型性能。Qwen2.5-VL-72B-Instruct-AWQ
-MoE混合专家模型(Mixture of Experts),包含多个专用模块处理复杂任务。DeepSeek-MoE-16B-Chat
-RL使用强化学习(Reinforcement Learning)优化,提升对话质量或任务响应。MiMo-7B-Instruct-RL
版本与变体标识-v0.1/-v0.2模型版本号,标识开发阶段(alpha/beta/正式版)。Mistral-7B-v0.1
-Pure纯净版模型,去除领域数据或保留原始能力,避免预训练偏差。Index-1.9B-Base
-Character角色对话模型,专注角色扮演或特定人设(如虚拟助手、动漫角色)。Index-1.9B-Character-Chat
-Long-Chat支持长上下文对话(通常>4k tokens),处理超长输入输出。Orion-14B-Long-Chat
领域与应用标识-RAG检索增强生成模型,结合外部知识库检索与生成能力。Orion-14B-RAG-Chat
-Chinese中文优化版本,支持中文分词、方言、拼音纠错等本土化能力。Llama-3-70B-Chinese-Chat
-MT机器翻译专用模型,支持多语言翻译任务(如中英、英日互译)。BLOOMZ-7B1-mt

如果我们需要进行的是监督指令微调,建议选择带 -Instruct 后缀的模型:

选取模型后,模型路径的位置会自动关联 Hugging Face 上的模型标识,如果你没有在本地下载过此模型,LLaMA Factory 将自动从 Hugging Face 上拉取此模型。

选择好模型后,我们点击下方 Chat Tab ,然后直接点击加载模型:

然后我们可以直接与模型进行对话,当模型能够正常输出,说明模型被正确加载:

另外这里我们也可以直接执行一个本地的模型路径(注意重新加载模型前需要先卸载模型):


微调方法

接下来,我们选择一个微调方法,可以看到这里支持 Full(全参)、Freeze(冻结)、Lora(低秩矩阵) 三种方法:

全参数微调是最直接的迁移学习方法,通过在目标任务数据上继续训练预训练模型的全部参数。

通俗理解:就好比把一栋房子彻底拆掉重建。预训练模型就像已经建好的房子,里面的每一块砖、每一根梁,在全参数微调时都要重新调整。例如,当我们想用一个原本用于识别普通图片的模型,改造为识别医学影像的模型时,就要把模型里所有参数都更新一遍。

优点

缺点

全参数微调适用场景:有充足的计算资源、需要最大化模型性能、目标任务与预训练任务有显著差异、 或有足够的任务数据可以有效训练所有参数。


参数冻结微调通过选择性地冻结模型的某些部分,只更新剩余参数,从而减少计算量并防止过拟合。

通俗理解:像是给房子做局部装修。我们保留房子的框架结构,只对部分区域进行改造。在模型中,就是保留预训练模型的底层结构,只调整顶层的部分参数。比如在训练一个糖尿病问答模型时,我们可以把语言模型的前 24 层参数冻结起来,只训练最后 3 层专门用于医学领域问答的分类器。

优点

缺点

参数冻结微调适用场景:计算资源受限的环境、训练数据集较小、目标任务与预训练任务相似、模型主要需要学习任务特定的表示、需要防止过拟合。


LoRA 通过向预训练模型中注入小型、可训练的低秩矩阵,在保持原始参数不变的情况下实现高效微调。

通俗理解:可以想象成给房子安装智能设备,不改变房子的原有结构,却能让房子变得更智能。在模型里,它不会直接修改原有的参数,而是在关键位置插入可训练的 “小模块”。

优点

缺点

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 是属于一种模型参数的精度单位,常用的精度单位有:

计算机底层使用的是二进制存储(也就是只能存0 和 1)这里的 16、32 是二进制位数(bit),也就是计算机存储这个数时用了多少个 01。比如 FP32 就是用 32 个二进制位(4 字节,1 字节 = 8 位) 存一个浮点数。FP16 就是用 16 个二进制位(2 字节) 存一个浮点数。


以下是一些常见的模型参数的精度:


这里可能大家会有一些疑问,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|>。对话模板提供了一个统一的接口,让开发者可以用相同的方式与不同的模型交互,而不必担心底层格式差异。


假设我们使用 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,)

一个完整的工作流程是:

    输入处理阶段:
用户输入: "帮我写一首关于春天的诗"转换后: <|im_start|>systemYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|><|im_start|>user帮我写一首关于春天的诗<|im_end|><|im_start|>assistant
    模型处理:模型接收这个格式化的输入,并从 <|im_start|>assistant 后开始生成内容;输出处理阶段:模型会生成内容直到 <|im_end|> ,然后停止;下一轮对话:如果用户继续对话,新的用户输入会被添加到历史中,形成新的输入。

加速方式

这里目前我们可以看到共支持三种方法:

比较熟悉的加速方式是 Unsloth,它默认就会采用动态的 4 位量化,这也是它一个非常重要的加速手段;我们在 LLaMA Factory 中将量化等级选择为 4 bit,然后加速方法选择 Unsloth 时,模型微调的速度与内存占用和直接使用 Unsloth 是相似的。

另外两种加速方式,大家做简单了解即可,如果你对微调性能没有过多要求,可以选择默认(默认会使用 Flash Attention 加速),如果本地硬件条件非常受限,可以选择启用 Unsloth + 4 位量化。

今天这一期,我们就讲到这里,下一期,我会带大家一起学习 LLaMA Factory 的数据集要求,以及使用 Easy Dataset 完成数据集的构造并在 LLaMA Factory 中加载和验证数据集。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LLaMA Factory 大模型 微调 零代码 模型量化
相关文章