ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

消费级显卡也能跑:xTuring 实现大模型 LoRA/QLoRA 微调实战指南

消费级显卡也能跑:xTuring 实现大模型 LoRA/QLoRA 微调实战指南 xTuring用一张消费级显卡就能跑通的大模型微调实践最近我花了一整周时间把手上这堆大模型微调工具挨个试了一遍最后真正留下并跑完整个流程的是 stochasticai 团队开源的 xTuring。如果你手里有普通显卡想微调 LLaMA、Mistral、Qwen 这类开源大模型又不想被繁琐的环境配置劝退那这篇文章应该能帮你省掉不少弯路。简单说xTuring 是一个大语言模型的微调框架核心思路是把 LoRA、QLoRA 这类参数高效微调方法做到开箱即用。它能做什么一句话概括在显存有限的情况下把通用大模型调教成符合你自己业务需求的私有模型比如让模型学会你的客服话术、行业术语、特定写作风格。适合谁来用想入门大模型微调的算法工程师、做私有化部署的架构师以及有数据但不太想从零手写训练逻辑的研究者都可以上手。这篇文章我会从框架设计思路、环境搭建、数据准备、实操微调、模型推理到常见坑位排解把整套流程完整拆开来讲尤其是 QLoRA 的显存计算、LoRA rank 值怎么选、数据集格式为什么必须是这种结构这类细节保证你能看完就上手。1. 整体设计思路xTuring 解决了微调过程中的哪些痛点1.1 从全量微调到参数高效微调的转变先聊点背景。大模型刚火起来那会儿微调的主流做法是全量微调Full Fine-tuning那就是把所有参数比如 LLaMA-7B 的 70 亿参数全部参与训练。听起来简单但实际跑起来非常痛苦。以 7B 模型为例全量微调光在训练阶段的显存占用就能到约 15-20GB 甚至更高这还没算梯度累积和中间激活的开销基本告别消费级显卡直接上 A100/H100 这类专业卡才靠谱。但绝大多数开发者和中小企业根本摸不到这种硬件因此微调大模型这个事在早期一直是圈内人的专属玩法门槛高得离谱。后来出现了参数高效微调PEFT思路核心逻辑是主干模型的权重保持冻结不参与梯度更新在模型旁挂上少量可训练参数比如 LoRA 的低秩矩阵训练时只更新这些轻量参数。这样显存占用和计算量自然大幅缩减。xTuring 走的就是这个路线而且它在封装上做得比较彻底LoRA、QLoRA、Intel LoRA 等主流高效微调方案都集成了命令行和 Python SDK 两条入口都给足了不必深入理解内部机制就可以开始微调同时又有细粒度的配置项供进阶玩家调参。1.2 xTuring 与同类工具的核心差异微调框架现在不少比较常见的有 Hugging Face 的 PEFT、LLaMA-Factory、Unsloth 等。xTuring 相对让我有好感的地方一个是它把数据准备—微调—推理整条链路都封装好了从准备数据集到启动训练再到最后跑推理基本不需要东拼西凑对刚开始接触微调的朋友来说最需要的就是这种一体化工具。另一个是它对不同模型结构的兼容性做得不错一条命令就能看到当前支持的模型列表。当然它也不是没有缺点比如社区活跃度相比 LLaMA-Factory 和一些成熟框架稍低文档更新有时会滞后。但胜在代码结构清晰、依赖简单你完全可以在它基础上做定制。我的评价是如果你主要用 7B、13B 这个规模的开源模型做领域微调xTuring 是非常顺手的选择如果追求极致训练速度可能 Unsloth 这类优化更激进但它们的侧重点和 xTuring 不太一样一个是通用封装一个是省显存加速看你自己优先级。2. 环境搭建与硬件配置把地基打牢2.1 硬件要求与显存估算逻辑先来算清楚一个关键问题跑微调到底需要多大的显存这是很多人第一步就被卡住的地方。尤其是 QLoRA 方案它通过 4-bit 量化把原始权重压到极小体积但很多人不知道的是LoRA 训练时真正耗显存的不只是模型权重还有优化器状态、梯度、中间激活值这些隐藏开销。我直接把自己实测的一组显存占用数据放出来以 LLaMA-2 7B 为例QLoRA 微调这里有个简单的估算方法模型权重按 4bit 算7B 模型大约需要 3.5GB 左右显存但训练过程中反向传播会额外产生梯度和优化器状态再加上激活值缓存实际峰值视序列长度和 batch size 而定我跑 512 长度、batch size 为 1 时实测峰值在 6-8GB 之间。也就是说一张 8GB 显存比如 RTX 3070 Ti、4060Ti的显卡理论上能跑 7B 的 QLoRA 微调但比较紧张如果是 12GB 的 3060、4070 或者 16GB 的 4080、4090体验会顺畅很多。如果跑 13B 模型QLoRA 实测下来 16GB 的显卡基本是下限能跑但不建议把 batch size 调大否则很容易爆显存。所以硬件这块我的建议很直接7B 模型配 12GB 以上显存13B 模型配 24GB 或者用双卡方案更稳妥除非你只是做很小规模的 LoRA 实验。2.2 安装步骤与依赖坑位xTuring 的安装有两条路线如果你只是想快速体验直接pip install xTuring就行但这相当于装了一个基础包许多依赖可能还需要自己找补。如果你想改源码、看内部实现或者调试那最好用源码安装方式git clone https://github.com/stochasticai/xTuring.git cd xTuring pip install -r requirements.txt装完以后强烈建议验证一下关键依赖的版本兼容性。我在第一次运行时就碰上了 transformers 和 accelerate 版本不匹配的问题导致训练时报告模型权重加载失败。个人测试下来比较稳定的组合是transformers 4.30.0accelerate 0.20.0peft 0.4.0bitsandbytes 0.39.0torch 2.0.0另外如果你是 Windows 用户有些地方需要注意。bitsandbytes 在 Windows 上的预编译包支持不是很好经常出现无法导入libbitsandbytes_cuda相关报错建议优先使用 WSL2 环境或者在 Linux 服务器上跑。Windows 原生跑 QLoRA 我踩过不少次坑最后才发现是环境问题而非代码问题。如果确实只能在 Windows建议装 Visual Studio 的 C 构建工具再自己编译 bitsandbytes但这会增加不少折腾时间孰轻孰重自己判断。2.3 验证环境是否正常装完环境先做一次快速验证确保各类 CUDA 算子真正生效避免训练中期才发现设备问题import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_name meta-llama/Llama-2-7b-hf model AutoModelForCausalLM.from_pretrained(model_name, device_mapauto) tokenizer AutoTokenizer.from_pretrained(model_name) print(模型加载成功) print(CUDA 可用:, torch.cuda.is_available()) print(设备名称:, torch.cuda.get_device_name(0))这一步的意义在于提前把 Hugging Face 的缓存下载好、验证预训练权重能正常加载同时确认 CUDA 环境没问题。测试时建议先跑一个最简单的文本生成确保推理链路通畅再进入微调环节。3. 核心细节解析LoRA 和 QLoRA 到底在做什么3.1 LoRA 的低秩分解直觉很多第一次接触 LoRA 的朋友会困惑为什么只训练一小部分参数效果还能逼近全量微调这里有个很核心的观察大模型的权重在微调过程中的变化通常具有低秩特性。换句话说微调时要做的大规模权重更新矩阵其有效自由度其实没有想象中那么高可以用一个更小的矩阵来近似表达。这个更小的矩阵就是 LoRA 的核心思想。具体做法是假设原始权重为 W形状是 d x k我们不直接更新 W而是在旁边挂两个小矩阵 A形状是 d x r和 B形状是 r x k其中 r 远小于 d 和 k。前向传播时模型的输出变成 h Wx ABx训练过程中 W 冻结不动只更新 A 和 B。因为 r 通常取 8、16、32 这种小数值可训练参数量只占原始模型的百分之零点几却能把微调的核心能力学到。你可以把全量微调理解为用大刷子把整面墙重新刷一遍LoRA 则是在关键位置贴上几张小贴纸——只要贴纸位置够准效果并不差。3.2 QLoRA 的 4-bit 量化与显存解放QLoRA 在 LoRA 基础上更进一步它先把原始模型权重做 4-bit 量化NormalFloat 格式然后在量化后的骨架上挂 LoRA 低秩适配器。这样一来原始权重从 FP16 的 2 字节直接压到 4-bit 的 0.5 字节7B 模型的权重部分从约 14GB 降到约 3.5GB显存占用大幅下降。这也是为什么消费级显卡能跑 7B 模型微调的关键。原理上理解起来不难但实操中有几点要注意4-bit 量化会带来一定的精度损失训练时的稳定性稍差所以 xTuring 里通常建议使用bitsandbytes和transformers配合的 NF4 量化方式同时开启double quantization。这些参数目前仍是微调时比较推荐的基础配置。我自己的经验是QLoRA 训练时的 loss 收敛曲线有时不如 LoRA 平滑但只要学习率不要调太高整体影响不大。3.3 为什么要强调 SFT指令微调和 LoRA 的区别新手很容易把微调当成一个笼统的概念但实际有三种常见的玩法继续预训练Continued Pre-training用大量无标注领域文本让模型继续读书提升领域词汇能力代价是训练成本高、周期长。监督微调SFT用指令-回答对教模型学会按指令回答问题这是目前绝大多数业务场景更常用的方式。偏好对齐RLHF/DPO在 SFT 基础上再让模型学会什么回答更符合用户偏好一般需要额外采集人类偏好数据。xTuring 最适合的是第二种也就是 SFT。它内置的数据格式和训练管线主要也是围绕输入指令 期望输出设计的。如果你想做三、四阶段的对齐训练那 xTuring 其实不太合适需要换更专业的框架。这点在选型时要提前想清楚避免做了一半才发现工具不适合。4. 实操过程用 xTuring 微调一个可用的文本生成模型4.1 数据准备格式与预处理是成败关键微调模型的成败往往在数据准备环节就已决定。xTuring 默认支持的数据格式是 JSONL每一行一条 JSON 数据字段包括指令instruction、输入input、输出output。我在实际准备数据时发现很多第一次用的人容易忽略input字段的灵活性——它可以是空的。数据的格式大约长这样{instruction: 介绍一下自动驾驶技术, input: , output: 自动驾驶技术是...的人工智能系统。}如果你的任务包含上下文和问题就把上下文放在input字段里任务指令放在instruction里。数据量方面如果你只做几百条效果会不太理想建议至少准备 1000 条高质量样本如果可以做 3000-5000 条微调后的效果会比较明显。当然数据量不是唯一标准数据的多样性、覆盖面和答案质量往往比单纯堆数量更重要。哪怕是 1000 条数据如果内容高度重复模型学到的也只是记忆而非泛化能力。我在准备行业数据时有一个习惯每条数据在放入训练集之前先人工抽查 10%-20% 的比例把格式错误、空输出、超长回答这类脏数据清掉。这一道工序虽然费时间但能避免训练时 loss 不正常波动。4.2 使用命令行快速启动 LoRA 微调xTuring 的官方 API 提供了一套很简洁的命令行交互界面可以在终端里逐步完成模型选择、数据路径配置、训练参数设置等操作。直接运行python -m xturing.cli.main然后按菜单提示选择你想要的模型比如meta-llama/Llama-2-7b-hf、微调方式LoRA 或 QLoRA、输入数据路径它会自动为你创建训练任务。这套交互式命令行对新手非常友好因为它会提示你每一步要填写什么不用靠记忆去记所有参数。不过我自己的偏好是用 Python SDK 来跑因为自动化程度更高参数控制也更细。核心代码分为几步第一步构建训练数据使用Dataset.from_jsonl加载 JSONL 文件第二步准备模型配置比如使用 QLoRA、设置 LoRA rank 为 16、学习率 2e-4 等第三步开始微调并保存模型。from xturing.datasets import InstructionDataset from xturing.models import BaseLLM from xturing.config import DEFAULT_CONFIG # 1. 加载数据集 dataset InstructionDataset.from_jsonl(path/to/your/data.jsonl) # 2. 加载预训练模型LLaMA-2 7B model BaseLLM.from_pretrained(meta-llama/Llama-2-7b-hf)这里需要说明的是不同版本的 xTuring API 细节会调整比如老版本用InstructionDataset新版本统一成Datasetfrom_pretrained之后如果直接调用.finetune()跑的是默认 LoRA 配置如果要用 QLoRA 还需要在模型初始化时指定量化参数。遇到 API 不匹配的问题优先查当前版本源码或 README 里的 Use Case别硬记别人的代码。4.3 LoRA 关键参数选型rank、学习率、batch size微调效果的好坏很大程度取决于几个超参。以下是我实测多轮之后觉得比较有代表性的参数范围整理成表格供参考参数名推荐范围我的实际选择备注LoRA rank4-6416任务简单取低值任务复杂可加大rank 太大并不能带来显著收益反而增加训练参数学习率1e-5 到 3e-42e-4LoRA、1e-4QLoRA太高容易过拟合太低收敛很慢训练轮数epochs3-105轮数太少学不透太多会过拟合最好观察 loss 变化曲线batch size1-8取决于显存1-2显存不足时用梯度累积兜底序列最大长度256-1024512取决于业务数据的最长文本不是越长越好学习率调度器cosine 或 linearcosine微调时 cosine 表现更平滑特别是训练轮数较多时这里额外聊一下 LoRA rank 的选择逻辑。rank 可以理解为低秩矩阵的秩决定了可训练参数的数量。rank 越高能表达的信息越丰富但计算量和过拟合风险也会增加。我在一些简单场景比如让模型学会固定格式的输出用 rank8 就够了但在需要模型学会较复杂的推理逻辑时rank16 或者 32 会更稳妥。rank64 的话除非你的数据量非常大否则不建议因为它已经接近全量微调的参数量失去了 LoRA 的意义。学习率这块LoRA 因为只训练少量参数学习率通常比全量微调高一些。我通常用 2e-4 作为起点如果 loss 在前几百步内没有下降再逐步调低QLoRA 由于量化带来的精度影响学习率不宜太高1e-4 比较保守稳定。另外如果你用的是 AdamW 优化器weight decay 一般取 0.01这个值在大多数情况下都适用。4.4 完整微调流程以中文指令数据为例下面是一条可以直接抄作业的完整微调示例我用了一份 2000 条中文客服问答数据模拟跑通from xturing.datasets import Dataset from xturing.models import BaseLLM from xturing.config import LoRAConfig, QLoRAConfig # 1. 数据加载每行一条 JSON格式为 instruction / input / output dataset Dataset.from_jsonl(customer_service_data.jsonl) # 2. 配置 QLoRArank16lr2e-4目标模块为注意力层的 q_proj, v_proj lora_config QLoRAConfig( lora_r16, lora_alpha32, # 一般是 lora_r 的 2 倍 lora_dropout0.05, target_modules[q_proj, v_proj, k_proj, o_proj, gate_proj, down_proj, up_proj], learning_rate2e-4, batch_size1, gradient_accumulation_steps16, optimizeradamw, lr_scheduler_typecosine, trainable_parametersall ) # 3. 初始化模型并微调 model BaseLLM.from_pretrained( meta-llama/Llama-2-7b-hf, lora_configlora_config, quantizationTrue # QLoRA 开启 4bit 量化 ) # 4. 开始训练 model.finetune(datasetdataset, output_dirmodels/my_lora_model)这里有一个很关键的思考点target_modules该选哪些层理论上 LoRA 可以挂在模型中的任何线性层上但注意力层的q_proj、v_proj是大多数实现中的默认选择效果也经过了大量实践验证。如果想要更好效果可以把k_proj、o_proj以及 FFN 层的gate_proj、down_proj也加入这样可训练参数量会增加、模型的适应能力更强代价是显存和训练时间上升。我的建议是第一轮只挂 q、v 两个投影层快速验证数据质量和流程如果能跑通再扩展到全部投影层看效果是否提升。别开局就把所有模块都挂上万一数据本身有问题排查起来会很痛苦。训练过程中你会看到类似这样的输出Epoch: 1/5, Step: 100/400, Loss: 1.5346, LR: 2e-4 Epoch: 1/5, Step: 200/400, Loss: 1.2011, LR: 1.87e-4正常情况下loss 应该是缓慢下降的。如果 loss 出现剧烈震荡或者不降反升优先检查学习率是否过大、数据格式是否正确而不是急着加数据量或改模型结构。4.5 模型保存与合并LoRA 权重和完整模型的区别训练完成后模型的状态通常分成两部分原始预训练权重冻结状态和 LoRA 适配器权重新增的低秩矩阵。xTuring 默认会把 LoRA 权重单独存下来这种保存方式的优点是体积小只有几十 MB 到几百 MB迁移到其他训练任务的成本也低缺点是使用时必须同时加载基础模型和适配器部署链路稍微多一点。如果你希望得到一个可以直接用AutoModelForCausalLM加载的完整模型就需要把 LoRA 权重合并回基础模型。在 xTuring 里模型保存之后默认生成的是带着额外适配器信息的目录如果你用 Hugging Face 的方式加载可能还需要编译一次。以下是一个参考做法在训练后用 PEFT 的 APIModel 合并工具或直接把 saved_lora_weights 目录里的 adapter_model.bin 用peft库的PeftModel.from_pretrained和merge_and_unload合并回原始模型最终保存成一个完整的 checkpoint。这个过程我踩过一次坑合并模型的路径和基础模型的路径写错导致推理时输出的内容完全脱离数据风格。这里提醒一下合并且保存前花几秒测试一下合并后的模型输出是否正常再把它丢进部署流程能省很多无谓的排查时间。5. 推理验证与效果评测怎么确认你的微调真的有效5.1 加载微调后的模型做推理训练结束只是第一步验证微调效果才是更重要的环节。加载微调模型的方式和保存方式有关如果你的模型是 LoRA 保存的按下面方式加载from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel base_model AutoModelForCausalLM.from_pretrained(meta-llama/Llama-2-7b-hf) model PeftModel.from_pretrained(base_model, models/my_lora_model) model model.merge_and_unload() model.eval()然后把你的测试指令丢进去建议准备 30-50 条模型没见过的测试样本观察回答质量。如何判断微调有没有真的生效几个简单维度回答是否遵循指令格式比如应该先输出你好再输出解决方案而不是一上来就乱侃领域术语是否准确比如医疗、法律类内容用错一个词就是事故级别是否还有严重的幻觉现象编造不存在的知识、捏造数据与基础模型的输出相比是否变得更懂你要的东西5.2 从 loss 之外评估效果人工打分与泛化测试经常有人只看 loss 降没降然后就宣布微调成功。但 loss 下降只代表模型在训练集上的拟合程度不能完全代表业务效果。我自己通常用两个额外手段来评测第一设计小规模的人工评测集。挑 20 条训练时没见过的真实用户输入让微调前和微调后的模型分别生成回答然后从回答与业务口径的匹配度和语言自然流畅度两个维度打分。这个打分不需要纠结 1-5 分还是 1-10 分核心是复现业务真实效果。第二做对抗性输入测试。故意输入一些有误导性的问题、带错别字的问题、甚至模型训练数据中没见过的边缘场景看模型会不会崩溃或者胡说八道。这一步能帮你发现过拟合风险。一个反常但真实的现象如果微调数据质量不高比如有大量模板化输出你会发现 loss 性能很好但模型生成的回答非常机械甚至连换一种表达方式都不会。这其实是过拟合的另一种表现需要用更复杂的数据来对冲而不是继续加训练轮数。5.3 模型合并后部署到推理服务微调完成并验证效果后接下来通常要部署到线上提供推理服务。最简单的方案是用 vLLM 或 Text Generation Inference 加载合并后的完整模型这样吞吐量高、并发能力强适合实际生产环境。部署时通常要先把模型文件放到你这台推理服务器的本地目录然后再启动服务首次加载时把 FP16 权重全部读到显存里7B 模型大约需要 15GB 左右所以部署机器的显存配置要提前规划好。另一个常见方案是结合transformers的pipeline快速起一个测试接口但它只适合实验验证线上并发一高就撑不住了。我的建议是如果是企业内部小流量场景比如内部知识库助手vLLM 是首选如果是边缘设备或者 CPU 推理那需要考虑把模型量化到 INT8 或 INT4那就完全是另一套优化路径了。6. 常见问题与排查技巧实录6.1 显存不足与 OOM 的应对策略显存不足OOMOut of Memory大约占微调踩坑的一半以上。特别是用 QLoRA 想跑 13B 模型但只有 16GB 显存的时候非常容易中途崩掉。我的处理优先级是这样的先把batch_size降为 1。这是最简单也是见效最快的办法先跑通再说。如果 batch 已经为 1 还是不行的再启用梯度累积gradient_accumulation_steps用多步累积模拟更大的 batch但显存占用不会线性上涨这也是我推荐的方式。第三考虑降低序列长度。可以把训练时的max_length从 1024 降到 512也就是把样本截断或裁剪到更短。很多数据集里的长文本其实有大量冗余信息截掉之后对效果影响不大。最后可以调整target_modules先只保留注意力层的 q、v 两个投影层减少可训练参数量降低激活值内存。需要特别说明的是显存不足不一定都表现为CUDA out of memory。有时候表现为训练突然变慢、CPU 内存不停增长很可能是你设置了过大的eval_steps导致在验证阶段加载额外状态导致内存飙升。遇到这种情况把验证频率调低或者关闭评估环节只保留训练能减少不少压力。6.2 数据格式错误与训练异常用 JSONL 格式时最常见的错误是某一行的 JSON 格式不合法或者多了一个逗号、少了一个引号。xTuring 在加载数据时如果遇到某个 JSON 解析失败有可能会跳过该条数据而不给明显警告导致你训练集实际数量少于预期。这个很坑因为你满怀期待地看到训练开始却不知道数据其实是残缺的。我的建议是在加载数据后打印一下len(dataset)再随机抽几条检查内容确认数量和内容都对得上再继续。另外有一个非常反常的情况如果训练 loss 一直不下降从头到尾保持在一个固定值附近那 90% 的概率不是模型问题而是数据标签和指令完全对不上。举个例子你把instruction和output字段顺序写反了或者 input 字段和 output 字段混在一起模型在学习和预测时就失去了规律loss 自然不降。先检查数据处理部分再考虑调参。6.3 模型输出质量异常的处理思路微调完成后测试如果发现以下现象要对应着排查问题现象可能原因初步排查方案模型回答和指令完全不搭边数据集格式问题或模型合并加载错误检查数据集字段顺序重新加载合并后的模型模型只输出训练集中的原话过拟合增大数据多样性、降低 epoch、调低 rank回答内容通顺但没有采用训练风格LoRA rank 太低或学习率过小适当提高 rank、调整学习率模型总是重复同一个短句学习率过高或训练不稳定调低学习率、增加 warmup steps中文效果比基础模型还差中文数据量太少或质量不均衡补充高质量中文数据检查是否出现语言混杂6.4 关于交叉熵 loss 很好但业务效果差这件事很多新手把训练 loss 当作唯一的疗效指标但我在实际项目中见过太多 loss 很漂亮、上线一测就翻车的案例。最典型的一种情况是你的数据集中有大量重复模板模型学会了输出模板本身但一旦用户换个问法它就露馅。这也解释了为什么我一直强调数据质量管理比调参更重要。我个人的习惯是微调之后一定要做一次盲测——让完全没有参与训练的人来打分而不是自己凭主观印象判断。因为训练者很容易对模型产生亲密感觉得它已经变好了但实际上并没有。用第三方的客观眼光检验效果比任何花哨的指标都更有说服力。7. 我的实测经验与后续扩展建议7.1 实际跑完一轮的体会在我自己完整跑通 LLaMA-2 7B 的 QLoRA 微调流程后最大的感受是xTuring 这类封装好的工具把过去需要手动写大量样板代码的工作量压缩到了很低的程度但框架替你做了不等于你不需要理解底层原理。反而是因为封装层多一旦出问题如果你不懂 LoRA 的工作原理、不理解量化对显存的影响排查起来会非常困难。所以我的建议很直接第一次跑的时候用最小的数据集、最少的参数先把全流程跑通跑通之后再逐步增加数据量和调整参数让每一步变化都可控、可回溯。7.2 这个流程可以怎么继续扩展微调本身不是终点后面可以做的方向还挺多。比如将微调后的 LoRA 权重发布到社区或者在公司内部建立 LoRA 适配器仓库按业务场景管理不同版本。把微调后的权重再做一次 4-bit 量化部署到手机端或边缘设备让模型在无网环境也能跑。结合 RAG检索增强生成方案先检索领域文档、再把检索结果输入微调后的模型提升回答的准确性和时效性。用 DPO 方式做偏好对齐让模型在微调基础上进一步学会该说什么、不该说什么。7.3 最后一个实用小心得最后分享一个我在多次训练中摸索出来的小技巧LoRA 微调过程中建议把训练时的save_steps设得小一点每隔几百步就保存一次检查点。这样做不是为了炫耀而是当你发现 loss 在后半段开始回升时可以回滚到某个较早的检查点用它作为最终模型。我之前有一轮训练第 3 个 epoch 还很正常第 4 个 epoch loss 也正常但到第 5 个 epoch 时明显过拟合正是因为保留了中间的检查点我才毫发无伤地回退到了一个效果更好的版本。如果只保存最终结果那一次失误就得全部重跑时间和显卡成本都白费了。
返回列表