- 不写代码能微调模型吗?微调的各种参数到底怎么调?微调的过程要怎么观察?微调后的模型要怎么用?怎么评估模型微调的效果?
之前 如何把你的 DeePseek-R1 微调为某个领域的专家? 的微调教程发出后,很多小伙伴想在本地进行尝试微调,但是因为代码能力有限以及对微调过程中的各种知识了解不够深入,遇到了各种问题。因此很多小伙伴求助我能不能出一期零代码、纯本地微调的教程。所以今天这一期,我们来使用目前最热门的本地微调工具:LLaMA Factory
配合 Easy DataSet
一站式完成从数据集准备到模型微调的全流程。另外为了帮助大家更好的学习理解,在这个系列的课程中,我也会穿插讲解一些大模型的基础理论,所以这个教程比较长,我们将拆分成几个部分来讲解,课程大纲如下:
基础回顾
为了更好的学习效果,在学习本期教程前,建议大家先学习一下我之前的几期教程,了解一些模型微调的前置知识:我们先做个简单的回顾:
- 为什么需要模型微调?
- 通用大模型在特定领域或任务表现可能不佳,微调可实现领域专业化、适配不同任务、纠偏能力,还能保障数据安全,且成本效率高于从头训练,故需模型微调。相比长文本、知识库,微调能深度内化专业知识与任务逻辑,无需依赖实时检索或长文本处理,定制化强,显著提升特定场景性能,且数据安全可控,成本效率更高。
- 模型任务有哪些常见分类?
- 监督微调,含指令微调(明确任务指令,如翻译)、对话微调(多轮对话数据,如客服)、领域适配(特定领域术语,如医疗)、文本分类(结构化标签,如情感分析)、模型推理微调(思维链标注,如数学解题);知识蒸馏,将复杂模型知识迁移至轻量模型,降低推理成本;强化学习,结合人类反馈优化生成质量,提升安全性与风格一致性;多模态微调,处理文本、图像、语音等跨模态数据,实现图文问答、视频分析等场景。
- 微调的基本流程是怎样的?
- 选定一款用于微调的预训练模型、准备好用于模型微调的数据集、准备一些问题,对微调前的模型进行测试(用于后续对比)、设定模型微调需要的超参数、执行模型微调训练、观测微调过程、对微调后的模型进行测试,并对比效果、如果效果不满意,继续调整前面的数据集以及各种超参数,直到达到满意效果、导出并部署微调好的模型。
- 微调数据集有哪些常见格式?
- 模型微调数据集无明确格式要求,一般在代码中抹除差异,将其转为格式化字符串数组。主流格式有 Alpaca 和 ShareGPT:前者结构简洁,适用于单轮任务、指令微调;后者支持多轮对话与工具调用。
- 微调数据集有哪些常见用途?
- 训练集、验证集、测试集构成学习闭环,分别如日常练习题、模拟考试卷、最终期末考试,缺一不可。训练集助模型学规律,验证集调策略防过拟合,测试集验真实水平且需隔离。完整集含三者,常按比例划分,数据不足可用交叉验证等,时间序列数据按时间划分。
- 微调过程中有哪些关键参数?
- 模型训练关键超参数有三:训练轮数:指遍历训练数据次数,少则不熟、多则过拟合;学习率决定参数调整幅度,大则进步快易走偏,小则稳定但慢;批量大小是每次更新用的样本数,大则快而粗、小则慢而细。实际需调参验证,小白用默认即可。
如果你对这些内容还不够了解,建议先学习这几期内容:
下面,我们来了解一下 LLaMa Factory
这个工具。
LLaMA Factory 介绍和基本使用
LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它,用户可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调。github.com/hiyouga/LLa…
全场景模型微调能力
- 多模型支持:高效适配超 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;资源利用:支持单机多卡训练与不同硬件环境适配,实现资源高效利用与流程无缝衔接。
LLaMA Factory VS unsloth
Unsloth 是一个开源工具,专门用来加速大语言模型(LLMs)的微调过程。
- 高效微调:Unsloth 的微调速度比传统方法快 2-5 倍,内存占用减少 50%-80%。这意味着你可以用更少的资源完成微调任务。低显存需求:即使是消费级 GPU(如 RTX 3090),也能轻松运行 Unsloth。例如,仅需 7GB 显存就可以训练 1.5B 参数的模型。支持多种模型和量化:Unsloth 支持 Llama、Mistral、Phi、Gemma 等主流模型,并且通过动态 4-bit 量化技术,显著降低显存占用,同时几乎不损失模型精度。开源与免费:Unsloth 提供免费的 Colab Notebook,用户只需添加数据集并运行代码即可完成微调。
从以上描述中我们可以看出,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 仅能通过编码,因此:
- Unsloth 适合:
- 资源受限场景:由于其出色的内存优化能力和快速的微调速度,非常适合在资源受限的环境中使用,如个人开发者使用消费级 GPU 进行大模型微调,或者企业在低成本硬件上进行模型实验和开发。快速迭代场景:对于需要快速迭代模型的场景,如学术研究中的实验验证、企业的快速原型开发等,Unsloth 的高效微调能力可以帮助用户在更短的时间内获得微调后的模型,加快项目进度。
- 通用场景:由于其支持多种模型和训练算法,适用于各种通用的大语言模型训练和微调场景,无论是文本生成、情感分析还是机器翻译等任务,都可以使用 LLaMa Factory 进行模型的定制化训练。企业级应用:提供了API Server 和一站式 WebUI Board,方便企业进行模型的管理和部署。零代码:适合不会写代码或代码基础比较弱的同学快速上手进行微调。
LLaMA Factory 安装
我们在官网可以看到 LLaMa Factory 的安装方法:llamafactory.readthedocs.io/zh-cn/lates…
但是这里我们不建议 Clone 仓库后直接安装依赖,因为 Python 本身的依赖管理做的比较混乱,你可能会遇到各种 Python 依赖冲突的问题,建议使用虚拟环境,这里我们使用 Conda:
Conda 是一个开源的跨平台、语言无关的软件包管理系统与环境管理系统。它能方便地安装、运行和更新软件包及其依赖项,还可创建、切换和删除隔离的软件环境,广泛应用于数据科学、机器学习等领域 。
你可以根据自己的需求选择合适的发行版,从官方网站(Anaconda 或 Miniconda)下载对应操作系统的安装程序,然后按照安装向导进行安装。
安装完成后,打开终端(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 ,可以看到如下界面:
看起来配置非常多,但我们梳理一下可以分成通用设置、微调训练、模型评估、在线推理、模型导出五个部分,这里我们先做简单了解,后续我们会对关键配置进行具体讲解:
- **通用设置:**可以设置 WebUI 展示的语言、需要微调的模型、微调的方法、是否量化、微调的加速方式等配置:
- 微调训练:包括以下几部分配置:
- 微调训练的阶段:预训练、指令微调、强化学习等等;微调使用的数据集:数据集的格式、路径、验证集的比例等等;关键微调参数:在我们之前教程中重点学习的:学习率、训练轮数、批量 大小等等;**LoRA 参数:**当使用 Lora 微调时需要配置的一些特殊参数;**RLHF 参数:**当训练阶段为强化学习时需要配置的一些特殊参数;**特殊优化参数:**当选择使用 GaLore、APOLLO 和 BAdam 优化器时需要配置的一些参数;**SwanLab 参数:**一款开源的模型训练跟踪与可视化工具;
- **模型评估:**在完成模型训练后,可以通过此模块来评估模型效果,这里可配置模型评估所需的数据集等:
- 在线推理:可以选择使用 huggingface、vllm 等推理引擎和模型在线聊天,主要用来测试加载模型:
- 模型导出:可以指定模型、适配器、分块大小、导出量化等级及校准数据集、导出设备、导出目录等。
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(低秩矩阵) 三种方法:
全参数微调是最直接的迁移学习方法,通过在目标任务数据上继续训练预训练模型的全部参数。
通俗理解:就好比把一栋房子彻底拆掉重建。预训练模型就像已经建好的房子,里面的每一块砖、每一根梁,在全参数微调时都要重新调整。例如,当我们想用一个原本用于识别普通图片的模型,改造为识别医学影像的模型时,就要把模型里所有参数都更新一遍。
优点
- 最大化性能:通常能够在目标任务上达到最佳性能完全适应性:允许模型充分适应新任务的特性灵活性:可以用于各种不同的下游任务实现简单:概念直接,实现相对简单
缺点
- 计算资源需求高:需要大量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
- INT4:4 位二进制,有符号范围 - 8
这里可能大家会有一些疑问,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,)
一个完整的工作流程是:
- 输入处理阶段:
用户输入: "帮我写一首关于春天的诗"转换后: <|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 中加载和验证数据集。