1. swift_output 文件中的模型是什么?
在 SWIFT 框架中,使用像 LoRA (Low-Rank Adaptation) 这样的 PEFT 方法进行微调后,swift_output 文件夹中得到的并不是一个完整的、可以独立运行的模型。
它里面存放的主要是所谓的 “适配器(Adapter)” 或者叫 “增量权重(Delta Weights)”。
让我们用一个形象的比喻来理解:
想象一下,基础模型(Base Model) 就像是一本内容庞大、知识全面的百科全书原著。这本书你不能直接修改,因为它太大了,而且修改成本很高。
现在,你想让这本百科全书增加一些关于“人工智能最新进展”的知识(也就是微调)。你不会去重新印刷整本百科全书,而是在旁边加了几页 “附录”或“勘误表”,专门记录这些新的知识点。
在这个比喻里:
百科全书原著 = 基础模型 (例如 Qwen-7B, Llama3-8B)
附录/勘误表 =
swift_output中的模型文件 (也就是 LoRA 适配器)
这些适配器文件非常小,通常只有几十到几百 MB,而完整的基础模型则有几十个 GB。这是因为在微调过程中,我们冻结了基础模型 99.9% 的参数,只训练了极少数(例如 0.1%)新添加的、代表着“变化量”的参数。swift_output 里存储的就是这些被训练的、微小的“变化量”。
所以,结论是:swift_output 中得到的是一个轻量级的适配器模型,它记录了模型为了适应新任务而需要进行的“增量调整”,它本身无法独立工作。
2. 为什么要和基础模型合并(Merge)?
理解了 swift_output 是“附录”之后,合并的理由就非常清晰了。
当你需要使用这本“增加了新知识的百科全书”时,你不能只读“附录”,因为“附录”里的内容(例如:“参见原书第582页第三段,并做如下补充…”)只有结合原著才有意义。
所以,你有两种使用方式:
加载时合并(Inference-time Merge): 你一手拿着原著,一手拿着附录,对照着看。这就是在推理时同时加载基础模型和 LoRA 适配器,框架会自动将两者的计算结合起来。
物理合并(Physical Merge): 你下定决心,把附录里的所有修改都誊写、粘贴到原著的对应位置,形成一本全新的、内容完整的“第二版百科全书”。之后你只需要带着这本新书就行了,不再需要那个小附录。
将这个逻辑对应到大模型中,合并的目的主要有以下几点:
(1) 为了部署和推理(Deployment & Inference)
-
简化部署流程: 合并后,你会得到一个单一的、完整的、包含了新知识的模型。在部署到生产环境时,你只需要加载这一个模型即可,而不需要同时管理基础模型和多个独立的适配器文件。这大大简化了运维和模型服务的复杂度。
-
提升推理性能: 虽然在推理时同时加载基础模型和适配器是可行的,但这会带来额外的计算开销(需要将适配器的计算动态地应用到模型层上)。将适配器权重预先合并到基础模型权重中,可以消除这部分开销,使得推理速度更快,延迟更低。这对于需要快速响应的在线服务至关重要。
(2) 为了后续处理或分发
-
方便模型共享: 如果你想把微调后的模型分享给其他人,提供一个合并后的完整模型通常比提供一个基础模型外加一个适配器文件要方便得多。接收方可以直接加载使用,无需了解如何加载和应用适配器。
-
作为新的基础模型: 有时,你可能想在一个已经微调过的模型基础上,再针对另一个任务进行二次微调。将第一次微调的适配器合并后,可以得到一个新的、更强大的基础模型,为下一次微调提供一个更好的起点。
总结
| 项目 | swift_output 中的模型 | 基础模型 (Base Model) | 合并后的模型 (Merged Model) |
|---|---|---|---|
| 本质 | 增量权重/适配器 (小抄/附录) | 完整的预训练模型 (百科全书原著) | 吸收了新知识的完整模型 (第二版百科全书) |
| 大小 | 很小 (MB 级别) | 巨大 (GB 级别) | 巨大 (和基础模型几乎一样大) |
| 能否独立工作 | 否 | 是 | 是 |
| 合并的目的 | 部署方便、推理加速、易于分发 | - | - |
因此,“训练时分离,部署时合并” (Train separate, merge for deployment) 是使用 LoRA 等 PEFT 方法进行大模型微调的一个标准且高效的实践流程。SWIFT 框架提供了便捷的工具来完成从训练到合并的全过程。