零基础在windows环境下的WSL使用llamafactory(三)
2026/8/20 23:45:56 网站建设 项目流程

目录

数据蒸馏

如何基于给定文档蒸馏数据

现成工具--EasyDataSet

具体流程

文本块的获取

问题-答案对的生成

如何调参

基础功能

控制学习深度

控制测试集

用于控制显存

启用QLora

其他功能性参数

模型相关

swanLab相关

总结小练


数据蒸馏

❓ 为什么输入和输出数据要分开构造?
问题:能不能用一套流程同时生成问题和答案?
回答:不能,必须解耦。
如果混在一起做,一旦最终效果不好,你很难排查是“题目出得烂”还是“答案给得错”。
分开的好处:第一步专心造出高质量、多样化的“输入(问题)”;第二步拿着定好的问题去生成“输出(答案)”。这样就像流水线作业,哪一步出问题修哪一步,调试效率极高。
❓ 为什么要刻意提升提示词的差异化?
问题:用同一种指令模板批量生成数据不行吗?
回答:不行,那样模型会变“傻”。
如果提示词千篇一律,生成的数据就会缺乏变化。
目的:通过变换指令的语气、角度和复杂度(即提升差异化),强迫模型学习各种各样的表达方式。这样训练出来的模型才够灵活,能接住用户千奇百怪的提问。
❓ 为什么造数据时“有时不加示例,有时又要加”?
这是一个非常反直觉但关键的技巧:
1. 构造输入(出题)时:坚决不要示例
原因:防止“思维偷懒”和模仿。
如果你给了示例,大模型就会倾向于模仿示例的句式,导致生成的几千个问题长得都差不多。不给示例,才能逼它发散思维,创造出真正多样化的问题。
2. 蒸馏输出(解题)时:必须加示例
原因:为了“对齐标准”和“规范格式”。
这时候你的目的是让模型学会某种特定的回答风格或逻辑(比如由浅入深、带代码块等)。加上示例(Few-shot),就是给模型立规矩,让它照着样板答题,确保输出的质量稳定且符合预期。

如何基于给定文档蒸馏数据

现成工具--EasyDataSet

地址如下:https://github.com/ConardLi/easy-dataset/blob/main/README.zh-CN.md

具体流程

文本块的获取

首先思考,如何把一个超长的文档手册丢给ai去学习,然后让他能根据用户的提问根据手册的内容回答呢??存在着许多问题:1.上下文长度有限制2.问题质量太差3.数据集比较难获取。

将文档手册转化为 Markdown 格式并基于文本块大小进行切块(Chunking),是构建大模型检索增强生成(RAG)系统或进行知识库向量化时的核心预处理步骤。这个流程主要由解析转换智能切块两大核心阶段构成。

首先是格式规范化的清洗与转换阶段。原始的文档手册通常拥有各种复杂的排版,如 PDF 的双栏、Word 的样式、HTML 的标签或是 EPUB 等格式。在这个环节中,系统会通过专门的解析工具剥离掉冗余的页眉、页脚、图表干扰及噪声信息,并将内容统一转换为结构清晰的纯文本 Markdown 格式。转换后的 Markdown 会保留原文档丰富的层级语法,例如利用###等标题标签来明确界定内容的主题边界,同时利用有序或无序列表保持文本的逻辑结构,这为后续的精确切块打下了良好的语法基础。

接下来是基于文本块大小的语义与结构化切块阶段。传统固定长度的硬切块往往会粗暴地将一句话或一个完整段落拦腰截断,导致上下文严重丢失。因此,现代的切块流程通常采用结合了 Markdown 语法特征的递归或滑动窗口切块法。系统首先会优先依据 Markdown 的标题层级(H1、H2、H3)将长文档自然拆解成多个独立的章节模块,确保每一个模块都承载相对完整的局部语义。随后,如果某个章节的文本量依然超过了预设的“文本块大小(Token 限制或字符数限制)”,系统则会深入到段落、句子甚至是单词的粒度进行精细化拆分,同时引入“重叠区域(Overlap)”机制——即相邻两个文本块之间保留一部分交叉的上下文内容。

问题-答案对的生成

如何基于给定的文本块,生成问题-答案对呢?一是分别让大模型独立生成问题和答案,便于调试整个生成过程。二是千方百计的增加问题的丰富度。

「文体」是指内容的知识表达框架,「受众」是指内容的目标读者群体,这个就叫做「GA」对

例如让大模型根据原来的文档生成5组GA对,将每个问题的GA对填充到提示词中,让模型参考生成问题。这样子实现了可以让大模型在对同一个文本块站在不同的视角生成不同的问题。注意一个问题,针对模型生成的问题,随机剔除百分之60的问号,防止模型过于依赖问号来回答问题。这样子就可以根据文本框得到不同的问题了。接下来就是根据问题生成答案了。输入文本块和问题,让模型严格按照文本块来生成答案。dsR1在训练冷启动阶段的几千条数据和SFT的80w条数据。其实也是有人工介入筛选的。

如何调参

也就是常见的「教师」「学生」模型

目前将参数划分为基础功能、控制学习深度、控制测试集、用于控制显存、其他功能性参数这五个范围。接下来将逐一进行学习

基础功能

  • model_name_or_path--指定你要加载的基础模型(Base Model)所在的路径或者在 Hugging Face 远程仓库上的名字。
  1. 本地文件夹路径:比如你在本地下载或保存好的模型文件夹目录(如 /home/xing/study/finetune/models/Qwen3-0.6B)。

  2. 远程模型名称:比如 Hugging Face 官网或 ModelScope 上的开源模型仓库 ID(如 Qwen/Qwen3.5-2B)。建议去 ModelScope 下载快速一点

  • template--告诉框架如何将你的数据集(如instructionoutput)包装成该模型在训练时所熟悉的特定对话格式(例如包含特定的角色标记、系统提示词前缀或对话结束符)。
  1. 不同系列的模型(如 Qwen、ChatGLM、Llama 等)通常有各自专属的对话格式。如果使用了错误的 template,模型在训练时就无法正确理解输入和输出的边界,从而影响训练效果。例如在 Qwen 模型中,通常会将其设置为qwen
  • stage--用来指定当前任务运行的流水线阶段。它主要包含四个核心阶段:
  1. pretrain(预训练阶段):使用大量的无监督原始文本进行底座模型的预训练或继续预训练,让模型学习语言的基本规律和海量知识。
  2. sft(监督微调阶段):使用带有明确输入输出对的指令数据(如问答、代码生成等)对模型进行微调,让其学会理解和遵循人类指令。
  3. rm(奖励模型训练阶段):在人类反馈强化学习(RLHF)中使用,训练一个能够为主模型的回答打分排序的奖励模型。
  4. ppodpo等(强化学习/偏好对齐阶段):通过人类偏好数据或强化学习算法,进一步对齐模型价值观,使其输出更符合人类习惯和安全规范。

  • 这三个参数用来控制当前运行脚本所要执行的具体任务动作(布尔值,通常填truefalse):
  1. do_train:控制是否进行训练。设置为true时,程序会开始执行模型的训练流程(如微调)。

  2. do_eval:控制是否进行评估(验证)。设置为true时,程序会在训练过程中或单独运行验证集,用来评估模型当前的准确率或损失。

  3. do_predict:控制是否进行预测(推理测试)。设置为true时,程序会使用测试集让模型进行批量推理预测,生成对应的输出结果。

  • finetuning_type--用来指定你所采用的微调训练方法(参数高效微调类型)
  1. lora:高效参数微调(PEFT),只训练少量的低秩适配器参数,显存占用低、速度快。

  2. full:全量微调,更新模型的所有参数,效果上限高但需要极大的显存。

控制学习深度

  • lora_rank是 LoRA 微调中的低秩矩阵阶数参数。它决定了 LoRA 注入的旁路低秩矩阵的大小。
  1. 核心作用lora_rank的值越大,低秩矩阵的容量就越高,模型能学习到的细节和复杂特征就越多(但显存开销和参数量也会微幅上升);值越小,参数越少、显存占用越低。
  2. 常见取值:通常设为8163264等。对于轻量级微调或小数据集,通常从816开始尝试。

  • learning_rate--是大模型微调和神经网络训练中最核心的超参数。
  1. 它用来控制模型参数在每次梯度更新时的调整步子有多大:学习率过大:模型在训练时步子迈得太大,会导致损失函数(Loss)剧烈震荡甚至无法收敛。学习率过小:模型步子迈得太小,训练速度会极其缓慢,或者容易陷入局部最优解。

  • warmup_ratio--用来指定在训练初期进行学习率预热(Warmup)的步数占总训练步数的比例(例如 0.1 代表前 10% 的步骤)。
  1. 在预热阶段,学习率会从 0 逐渐爬升到设定的目标学习率,这能有效防止模型在训练初期因为梯度过大而导致训练崩溃或不稳定。
  • max_samples--用来限制每个数据集中最多参与训练的样本数量。
  1. 如果你的数据集非常大,但你只想快速跑通流程、测试代码或者进行小规模验证,就可以设置一个数值(如 1000),系统会自动截取前指定数量的样本进行训练,从而大幅缩短单轮测试的时间。
  • num_train_epochs--是用来指定模型训练总轮数(Epochs)的参数。
  1. 它决定了整个训练数据集会被模型完整学习和遍历多少次。

  2. 数值过大:模型可能会过度拟合训练数据(即过拟合),导致在面对新问题时泛化能力下降。

  3. 数值过小:模型可能还没来得及充分学习数据中的规律就结束了训练,导致欠拟合。

控制测试集

  • 大模型训练中用于控制模型评估与权重保存频率的核心参数
  1. eval_strategy--用来指定何时对模型进行验证集评估(例如设置为 steps 表示按步数评估,或者设为 epoch 表示按轮次评估)。通过评估可以实时监控模型在验证集上的表现。

  2. val_steps--当 eval_strategy 设置为按步数(steps)评估时,该参数用来控制每隔多少训练步数执行一次验证评估。

  3. save_steps--用来控制每隔多少训练步数保存一次模型的权重检查点(Checkpoint)。这能防止训练中断时进度丢失,也方便挑选出效果最好的历史权重。

用于控制显存

  • cutoff_len--是大模型微调中用来设置文本最大截断长度(上下文长度限制)的参数。
  1. 限制输入模型的所有样本(包括 prompt 和 response 拼接后的总长度)的最大 Token 数量。
  2. 如果某条数据的长度超过了这个设定值,系统会对其进行截断;如果低于这个值,则会保留完整内容。这能有效防止显存溢出(OOM),并确保输入维度的统一。

  • per_device_train_batch_size--用来设置单张显卡(每个设备)上的训练批次大小(Batch Size)的参数。它决定了模型在每一次参数更新时,单张显卡同时处理多少条样本数据:
  1. 数值调大:可以提高显卡利用率和训练速度,但会占用更多的显存。如果设置过大容易导致显存溢出(OOM)。
  2. 数值调小:显存占用低,适合显存较小的显卡。如果需要达到较大的总批次效果,通常可以配合gradient_accumulation_steps(梯度累积)来一起使用。

  • gradient_accumulation_steps--用来在显存受限时模拟大批次训练的核心参数。它的工作原理是:
  1. 尽管你的 per_device_train_batch_size(单卡批次)设得很小(比如 1),但模型不会每处理完 1 步就立刻更新参数。
  2. 而是将多次前向传播计算出的梯度累加起来,等到累积够了指定的步数(例如 8 步)之后,才统一对模型参数进行一次真正的更新。
  3. 这样可以在几乎不增加额外显存开销的前提下,达到增大总批次大小(Effective Batch Size)的效果,从而让训练过程更加平稳。

  • quantization_bit--是用来设置模型量化位数的参数(常见可选值为48)。它的核心作用是:
  1. 降低显存占用:通过将模型的权重从高精度(如 FP16/BF16)压缩为低精度(如 4 比特或 8 比特),大幅减少显存消耗,让消费级显卡也能跑得动大模型。

  2. 代价:量化位数越低(例如从 8bit 降到 4bit),显存省得越多,但模型的精度和输出质量可能会受到一定程度的轻微损失。如果不进行量化,该参数通常留空或不设置。

启用QLora

  • quantization_bit--设置模型量化位数的参数(常见可选值为48
  1. 降低显存占用:通过将模型的权重从高精度(如 FP16/BF16)压缩为低精度(如 4 比特或 8 比特),大幅减少显存消耗,让消费级显卡也能跑得动大模型。

  2. 代价:量化位数越低(例如从 8bit 降到 4bit),显存省得越多,但模型的精度和输出质量可能会受到一定程度的轻微损失。如果不进行量化,该参数通常留空或不设置。

其他功能性参数

模型相关

swanLab相关

  • swanlab_mode--控制SwanLab 实验追踪与日志记录模式的参数(常见选项包括onlineofflinedisabled等)
  1. 联网记录 (online):将训练过程中的损失值(Loss)、学习率、评估指标等实时同步并上传到 SwanLab 云端,方便在网页端实时监控训练曲线。

  2. 离线记录 (offline):将日志保存在本地,不实时联网,适合网络不便或需要离线跑实验的场景。

  3. 禁用 (disabled):关闭 SwanLab 日志记录功能。

  • swanlab_project--设置SwanLab 实验项目名称的参数
  1. 归类与管理:在你使用 SwanLab 进行实验追踪时,所有属于同一个大模型微调项目或同一类实验的不同次训练(Run),都可以归类到同一个项目名称下。
  2. 网页端展示:当你在 SwanLab 的面板中查看训练可视化曲线时,项目名称能帮你清晰地把不同任务、不同数据集或者不同架构的实验区分开来。
  • swanlab_run_name--设置SwanLab 单次实验(Run)名称的参数
  1. 精准标识:在同一个实验项目(swanlab_project)下,往往会进行多轮不同超参数或不同数据集的训练。通过给每次训练起一个独特的运行名称(Run Name),你可以一眼区分出哪次实验对应哪组配置(例如 qwen-lora-lr1e-4)。
  2. 便于对比:在 SwanLab 的网页端看板中,清晰的实验名称能让你直观地对比不同参数组合下的训练效果与 Loss 曲线走势
  • swanlab_api_key--配置 SwanLab 账号授权密钥(API Key)的参数
  1. 身份认证:在你的训练环境(如服务器终端)与 SwanLab 云端平台之间建立安全连接。当你将实验数据上传并同步到云端时,系统需要通过这个密钥来验证你的用户身份,确保日志能正确存入你的个人或团队账户中。

总结小练

根据题目参数,计算总参数更新次数的核心步骤如下:

1. 确定训练集样本数
总样本数为 1000,验证集占比 10%,故训练集样本数为: 1000×(1−0.1)=900

2. 计算每个 epoch 的 batch 数
每个 batch 包含 2 个样本,因此每个 epoch 的 batch 数为: 900/2=450

3. 考虑梯度累积机制
梯度累积步数为 5,即每 5 个 batch 才执行一次参数更新。因此每个 epoch 的参数更新次数为: 450/5=90

4. 计算总参数更新次数
训练共进行 4 个 epoch,因此总更新次数为: 4×90=360

最终结果:总共更新参数 360 次。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询