如何继续训练?基于已有checkpoint的增量微调法

在大模型应用日益普及的今天,一次性微调已难以满足持续迭代的需求。业务场景变化、用户反馈积累、新数据不断产生——这些都要求我们能够对已微调过的模型进行增量更新,而不是每次都从头开始训练。

本文将围绕 “如何基于已有 LoRA checkpoint 继续训练” 这一核心问题展开,结合 单卡十分钟完成 Qwen2.5-7B 首次微调 镜像环境,手把手教你实现低开销、高效率的增量微调,真正让模型“越用越聪明”。


1. 为什么需要增量微调?

你可能已经完成了第一次 LoRA 微调,比如把 Qwen2.5-7B-Instruct 的自我认知改为“由 CSDN 迪菲赫尔曼开发”。但随着使用深入,你会发现:

  • 新增了更多身份描述需求(如支持英文问答)
  • 原有回答不够准确或表达不一致
  • 想加入新的功能指令(如代码风格偏好)

如果每次都要重新准备全部数据、从头训练,不仅浪费时间,还会导致旧知识遗忘过拟合新数据

增量微调正是解决这一问题的关键:它允许你在已有 LoRA 权重的基础上,加载并继续训练,保留历史学习成果的同时吸收新知识。


2. 增量微调的核心原理

2.1 LoRA 是什么?为何适合增量训练?

LoRA(Low-Rank Adaptation)是一种轻量级微调技术,它不修改原始模型权重,而是通过在特定层插入可训练的低秩矩阵来实现参数高效调整。

其最大优势在于:

  • 显存占用低(仅需训练少量参数)
  • 训练速度快
  • 权重独立于主模型,便于保存和切换

正因为 LoRA 权重是“附加式”的,我们可以轻松地:

  1. 加载已有 LoRA 权重作为初始状态
  2. 在此基础上继续优化
  3. 生成新的 checkpoint,形成版本演进

这为持续学习提供了天然支持。

2.2 增量训练 vs 全量重训:关键区别

对比维度全量重训增量微调
初始权重原始模型已训练的 LoRA
数据要求必须包含所有历史+新增数据可只用新增数据
显存消耗高(重新初始化)相同甚至更低
训练轮数多轮以巩固记忆少轮即可收敛
知识保留依赖数据回放天然继承前期成果

核心结论:只要合理设计训练策略,增量微调可以做到“边用边学”,显著降低维护成本。


3. 实战:基于已有 checkpoint 的增量微调

假设你已完成首次微调,路径为 /root/output/v2-20250401/checkpoint-100,现在希望增加以下能力:

  • 支持英文提问“Who developed you?”
  • 补充关于“隐私政策”的回答
  • 强化“不能联网”的说明

我们将演示如何在此基础上继续训练。

3.1 准备增量数据集

创建一个新的 JSON 文件 incremental_data.json,仅包含新增样本:

cat <<EOF > incremental_data.json
[
    {"instruction": "Who developed you?", "input": "", "output": "I was developed and maintained by CSDN Diffie-Hellman."},
    {"instruction": "Are you connected to the internet?", "input": "", "output": "No, I cannot access the internet. My responses are based solely on pre-trained knowledge and your input."},
    {"instruction": "What is your privacy policy?", "input": "", "output": "Your conversations are not stored or shared. All data remains private and is used only for the current session."}
]
EOF

建议:即使只新增几条数据,也建议至少训练 3~5 个 epoch,确保稳定融入。

3.2 启动增量训练命令

使用 swift sft 命令,并通过 --resume_from_checkpoint 参数指定已有 checkpoint 路径:

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model Qwen2.5-7B-Instruct \
    --train_type lora \
    --dataset incremental_data.json \
    --torch_dtype bfloat16 \
    --num_train_epochs 5 \
    --per_device_train_batch_size 1 \
    --learning_rate 5e-5 \  # 建议使用较低学习率
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --gradient_accumulation_steps 16 \
    --save_steps 10 \
    --logging_steps 5 \
    --max_length 2048 \
    --output_dir output/incremental \
    --system 'You are a helpful assistant.' \
    --warmup_ratio 0.05 \
    --model_author swift \
    --model_name swift-robot \
    --resume_from_checkpoint /root/output/v2-20250401/checkpoint-100
关键参数解析:
  • --resume_from_checkpoint: 指定上次训练的最终 checkpoint,自动恢复 LoRA 权重和优化器状态
  • --learning_rate 5e-5: 增量阶段建议使用比首次训练更低的学习率(如 1e-4 → 5e-5),防止破坏已有知识
  • --num_train_epochs 5: 数据量少时可适当减少 epoch 数
  • --output_dir output/incremental: 推荐单独目录保存增量结果,便于管理版本

注意:--model 仍指向原始模型路径,LoRA 增量是在此基础上叠加的。


4. 增量训练后的效果验证

训练完成后,新权重将保存在 /root/output/incremental/checkpoint-xx 目录下。

使用 swift infer 加载该 checkpoint 进行测试:

CUDA_VISIBLE_DEVICES=0 \
swift infer \
    --adapters /root/output/incremental/checkpoint-5 \
    --stream true \
    --temperature 0 \
    --max_new_tokens 2048

依次输入以下问题,验证是否同时具备原有能力新增能力

用户: 谁开发了你?
模型: 我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。

用户: Who developed you?
模型: I was developed and maintained by CSDN Diffie-Hellman.

用户: 你能联网吗?
模型: 我不能主动联网,只能基于已有知识和用户输入回答问题。

用户: What is your privacy policy?
模型: Your conversations are not stored or shared...

若以上回答均正确,则说明增量微调成功,且未发生明显知识遗忘。


5. 增量微调的最佳实践与避坑指南

5.1 数据组织策略

场景推荐做法
新增少量样本单独构建增量数据集,配合低学习率训练
修改已有行为在增量数据中重复原指令+新答案,强化覆盖
修复错误输出构造“错误→纠正”样本对,加入增量训练集

重要提示:若发现模型“忘记”旧知识,可在增量数据中混入部分关键历史样本(如 10%),起到“防遗忘锚定”作用。

5.2 学习率设置建议

训练阶段推荐学习率
首次微调1e-4 ~ 3e-4
增量微调5e-5 ~ 1e-4(建议 ≤ 首次训练)
多次连续增量逐步递减(如 1e-4 → 5e-5 → 2e-5)

过高学习率可能导致“灾难性遗忘”,即覆盖掉之前学到的知识。

5.3 Checkpoint 管理规范

建议采用如下命名规则管理多个版本:

output/
├── v1-initial/                # 初始版本
│   └── checkpoint-100/
├── v2-add-english/            # 增加英文支持
│   └── checkpoint-50/
├── v3-fix-network-behavior/   # 修正网络相关回答
│   └── checkpoint-30/
└── latest -> v3-fix-network-behavior  # 软链接指向最新版

这样既能追溯演进过程,又方便部署调用。

5.4 常见问题排查

❗ 增量训练报错:“Key mismatch in state_dict”

原因:LoRA 配置(如 lora_rank, target_modules)与原始 checkpoint 不一致。

解决方案:

  • 确保 --lora_rank--lora_alpha--target_modules 完全一致
  • 检查 --train_type lora 是否启用
❗ 模型“忘记”旧知识

原因:新数据未充分融合,或学习率过高。

解决方案:

  • 降低学习率至 5e-5 或以下
  • 在增量数据中加入 3~5 条核心历史样本
  • 增加训练 epoch 数(建议 ≥3)
❗ 显存不足无法 resume

原因:某些框架会尝试同时加载 base model + adapter + optimizer states。

解决方案:

  • 使用 --bf16--fp16 减少显存占用
  • 减小 --per_device_train_batch_size 至 1
  • 升级显卡或使用梯度检查点(--gradient_checkpointing

6. 进阶技巧:混合数据滚动训练

如果你希望模型始终保持通用能力 + 持续注入领域知识,推荐采用滚动训练策略

swift sft \
    --model Qwen2.5-7B-Instruct \
    --train_type lora \
    --dataset \
        'AI-ModelScope/alpaca-gpt4-data-zh#200' \
        'AI-ModelScope/alpaca-gpt4-data-en#200' \
        'self_cognition.json' \
        'incremental_data.json' \
    --num_train_epochs 3 \
    --learning_rate 1e-4 \
    --resume_from_checkpoint /root/output/v2-20250401/checkpoint-100 \
    --output_dir output/rolling-v3

这种方式相当于“温故而知新”,既保留基础能力,又持续进化专项技能。


7. 总结

增量微调不是高级玩法,而是大模型落地过程中必不可少的工程能力。借助 LoRA 技术和 ms-swift 框架的强大支持,我们完全可以在单卡环境下实现高效的模型持续进化。

本文带你完成了从理论到实战的完整闭环:

  • 理解了增量微调的价值与原理
  • 掌握了基于 checkpoint 继续训练的具体方法
  • 学会了数据组织、参数设置与版本管理的最佳实践

下一步,你可以尝试:

  • 将用户反馈自动构建成增量数据集
  • 设计自动化训练流水线(CI/CD for AI)
  • 结合评估指标判断何时触发再训练

让模型不再是一次性产品,而是持续成长的智能体


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐