基于 LLaMA-Factory 的模型 LoRA 微调实战记录零代码 WebUI 方案本文记录了我使用 LLaMA-Factory 的 WebUI 进行零代码 LoRA 微调的全过程包括数据集准备、训练配置、参数调优、断点续训机制验证以及最终效果评测。适合初学者参考。0、前言本文运行的前提是您已经配置好LLaMA-Factory项目并下载完成需要进行微调的模型具体方案可以参考我的上一篇文章。LLaMA-Factory 部署与 DeepSeek-R1-Distill-Qwen 模型乱码问题解决全记录一、数据集准备1. 数据集格式Alpaca 风格我准备了一份关于项目问答的 Alpaca 格式数据集示例如下{instruction:计算这些物品的总费用。,input:输入汽车 - $3000衣服 - $100书 - $20。,output:汽车、衣服和书的总费用为 $3000 $100 $20 $3120。}2. 放置数据集将 JSON 文件放到LLaMA-Factory/data/目录下与其他 demo 文件同级。3. 注册数据集修改dataset_info.json按照已有其他格式添加新数据集的条目alpaca_strategy_forge:{file_name:alpaca_strategy_forge.json,}二、启动 WebUI 并开始训练1. 启动命令必须在LLaMA-Factory 根目录下执行否则会找不到dataset_info.jsonllamafactory-cli webui若在错误目录启动会报错[WARNING] Cannot open data/dataset_info.json due to [Errno 2] No such file or directory: data/dataset_info.json.2. 查看数据集启动后在 Train 页面的数据集下拉列表中可以看到新增的数据集。点击预览可查看数据样例3. 训练方式选择选择SFT有监督微调4. 选择基础模型本次测试使用DeepSeek-R1-Distill-Qwen-1.5B5. 训练参数参考初始参数设置如下这是一套错误参考基本是默认参数不建议学这里起初以为是没有设置测试集导致的无法计算损失函数导致函数图像为空后来发现单纯是训练轮数太少了导致的。训练完成后可在saves/目录下看到生成的 LoRA 权重三、初次测试与问题1. 加载 LoRA 进行对话在 Chat 页面选择检查点路径加载刚训练的 LoRA 模型2. 测试结果不理想模型回答未能按照训练集中的格式输出与预期不符它把我训练的知识和另一个同名的项目弄混了。3. 增加训练轮数将轮数增加到 30 轮损失图像终于出现但看起来仍欠拟合继续追加轮数直至达到拟合。参数参考如下简单来说就是一直训练增加轮数直到函数的损失函数达到预期范围。理想的损失函数大概类似下图下图实际上看起来也不是很完美理想的图片应该下降得更快一些也许是我用的1.5B模型比较笨训练好多轮才达到拟合之后换成7B模型只需要很少的轮数就能拟合了首先损失会快速下滑而后基本保持不变如果损失有回弹可能是过拟合了最终损失大概期望控制在0.1上下。由于我是不断在上次一的训练基础上叠加训练的期间多次训练得到的损失函数图如下四、断点续训机制探索在使用llama-factory训练的过程中我们难免一次训练达不到预期需要多次训练可能在上次的实验路径上直接进行实验也可能是新建一条路径读取之前的某个checkpoint继续实验因此难免好奇对于在同一路径下多次进行实验llama-factory框架是如何处理的是会直接粗暴覆盖实验呢还是会断点续传叠加实验由此我进行了进一步的测试研究。关键发现对于在同一个实验路径下的训练若不修改输出目录只降低训练轮数如从 100 改为 20并不会覆盖之前的高轮次检查点。LLaMA-Factory 会检测已有检查点若当前目标步数 ≤ 已训练步数则直接退出不进行实际训练。实验验证实验 1从 50 轮检查点继续实验目标轮数设为 20第一步进行首先的50轮训练配置7B的模型做第一轮50轮次的训练参数如下得到结果看起来已经接近拟合了(效果真的比之前1.5B好很多喔)第二部再上次训练的基础上但是不改变实验目录直接进行训练选择检查点checkpoint-100对应 50 轮设置轮数 20总步数 40输出目录保持不变训练完成后此时可以看到输出的图像也没有变化日志显示[INFO] Resuming training from checkpoint with epoch 50 and global step 100 [INFO] Fast-forwarding the dataloader past 50 epochs and 0 batches to resume from the exact training state. [INFO] Training completed.训练瞬间完成无 loss 输出证明未进行任何实际训练。实验 2不选检查点直接设轮数 20同样系统自动从目录中最新的检查点恢复检测到已训练 50 轮目标仅 20 轮直接跳过。[INFO|2026-07-04 22:06:54] trainer.py:1478 Total optimization steps 40 [INFO|2026-07-04 22:06:54] trainer.py:1479 Number of trainable parameters 20,185,088 [INFO|2026-07-04 22:06:54] trainer.py:1482 Resuming training from checkpoint with epoch 50 and global step 100 [INFO|2026-07-04 22:06:54] trainer.py:1486 Fast-forwarding the dataloader past 50 epochs and 0 batches to resume from the exact training state. [INFO|2026-07-04 22:06:54] trainer.py:1823 Training completed. Do not forget to share your model on huggingface.co/models )实验 3目标轮数设为 100大于已训练的 50不设置检查点使用和之前训练50轮相同的目录此时系统从checkpoint-100继续训练日志显示 loss 正常下降且损失函数图像是在上次训练的基础上继续下降的从日志可以进一步确认是从100步位置坐的叠加训练也就是虽然没有设置checkpoint但是它自动检测到了同目录下上次训练的进度自动追加了训练。[INFO|2026-07-04 22:14:17] trainer.py:1476 Total train batch size (w. parallel, distributed accumulation) 64 [INFO|2026-07-04 22:14:17] trainer.py:1477 Gradient Accumulation steps 8 [INFO|2026-07-04 22:14:17] trainer.py:1478 Total optimization steps 200 [INFO|2026-07-04 22:14:17] trainer.py:1479 Number of trainable parameters 20,185,088 [INFO|2026-07-04 22:14:17] trainer.py:1482 Resuming training from checkpoint with epoch 50 and global step 100 [INFO|2026-07-04 22:14:17] trainer.py:1486 Fast-forwarding the dataloader past 50 epochs and 0 batches to resume from the exact training state. [INFO|2026-07-04 22:14:24] logging.py:144 {loss: 1.3129, learning_rate: 2.3430e-05, epoch: 52.89, throughput: 51376.91} [INFO|2026-07-04 22:14:29] logging.py:144 {loss: 1.2277, learning_rate: 2.1477e-05, epoch: 55.00, throughput: 31868.31} [INFO|2026-07-04 22:14:35] logging.py:144 {loss: 1.0345, learning_rate: 1.9546e-05, epoch: 57.89, throughput: 21679.81} [INFO|2026-07-04 22:14:40] logging.py:144 {loss: 1.0071, learning_rate: 1.7649e-05, epoch: 60.00, throughput: 17822.70} [INFO|2026-07-04 22:14:46] logging.py:144 {loss: 0.8158, learning_rate: 1.5797e-05, epoch: 62.89, throughput: 14582.92} [INFO|2026-07-04 22:14:51] logging.py:144 {loss: 0.7418, learning_rate: 1.4002e-05, epoch: 65.00, throughput: 12969.94} [INFO|2026-07-04 22:14:58] logging.py:144 {loss: 0.6239, learning_rate: 1.2274e-05, epoch: 67.89, throughput: 11389.01} [INFO|2026-07-04 22:15:02] logging.py:144 {loss: 0.6259, learning_rate: 1.0625e-05, epoch: 70.00, throughput: 10515.47} [INFO|2026-07-04 22:15:09] logging.py:144 {loss: 0.5263, learning_rate: 9.0644e-06, epoch: 72.89, throughput: 9587.54} [INFO|2026-07-04 22:15:13] logging.py:144 {loss: 0.5112, learning_rate: 7.6022e-06, epoch: 75.00, throughput: 9035.56} [INFO|2026-07-04 22:15:20] logging.py:144 {loss: 0.4293, learning_rate: 6.2472e-06, epoch: 77.89, throughput: 8426.14} [INFO|2026-07-04 22:15:25] logging.py:144 {loss: 0.4917, learning_rate: 5.0079e-06, epoch: 80.00, throughput: 8046.11} [INFO|2026-07-04 22:15:31] logging.py:144 {loss: 0.3387, learning_rate: 3.8918e-06, epoch: 82.89, throughput: 7610.67} [INFO|2026-07-04 22:15:36] logging.py:144 {loss: 0.3492, learning_rate: 2.9059e-06, epoch: 85.00, throughput: 7334.85} [INFO|2026-07-04 22:15:42] logging.py:144 {loss: 0.3851, learning_rate: 2.0561e-06, epoch: 87.89, throughput: 7014.66} [INFO|2026-07-04 22:15:47] logging.py:144 {loss: 0.3665, learning_rate: 1.3479e-06, epoch: 90.00, throughput: 6803.48} [INFO|2026-07-04 22:15:54] logging.py:144 {loss: 0.3145, learning_rate: 7.8542e-07, epoch: 92.89, throughput: 6554.39} [INFO|2026-07-04 22:15:58] logging.py:144 {loss: 0.2759, learning_rate: 3.7227e-07, epoch: 95.00, throughput: 6387.81} [INFO|2026-07-04 22:16:05] logging.py:144 {loss: 0.3118, learning_rate: 1.1095e-07, epoch: 97.89, throughput: 6189.13} [INFO|2026-07-04 22:16:09] logging.py:144 {loss: 0.3289, learning_rate: 3.0842e-09, epoch: 100.00, throughput: 6055.64} [INFO|2026-07-04 22:16:09] trainer.py:3815 Saving model checkpoint to saves/DeepSeek-R1-7B-Distill/lora/train_2026-07-04-21-38-32/checkpoint-200 [INFO|2026-07-04 22:16:10] configuration_utils.py:769 loading configuration file /home/xiezhongjun/hugging-face/hub/models--deepseek-ai--DeepSeek-R1-Distill-Qwen-7B/snapshots/916b56a44061fd5cd7d6a8fb632557ed4f724f60/config.json实验 4继续提升至 150 轮为了确保完全拟合训练继续最终损失降至 0.1 左右基本拟合五、最终测试效果简单问答如询问名字模型能正确回答训练集中出现的名称没有上之前一样把他和同名项目弄混了说明训练集内容在模型中的权重得到了提高复杂问题超出训练集模型会“乱编”一些训练集中没有的内容说明数据集覆盖度不足六、显存占用情况加载 7B 模型并进行 LoRA 对话测试时显存占用仅约3.5GB非常友好卸载模型后占用是0.53GB可供对比七、总结与建议断点续训逻辑LLaMA-Factory 会自动从输出目录中读取最新的检查点。若目标总步数 ≤ 已训练步数则直接跳过训练不会覆盖。若要继续训练只需增加轮数或步数并保持输出目录不变。数据集质量至关重要即使模型在训练集上拟合得很好对于训练集外的问题仍可能产生幻觉。建议扩大数据集的多样性和覆盖面。WebUI 零代码方案非常适合快速验证和调参无需编写任何代码所有操作通过界面完成。硬件需求低7B 模型 LoRA 对话仅需 3.5GB 显存看起来很理想可以在消费级显卡上不部署运行等待后续进一步验证测试。