model.save_pretrained_merged(output_dir, tokenizer, save_method="merged_16bit")
将经过微调的模型与分词器(tokenizer)一起,以合并后的16位精度格式保存到指定的输出目录。
具体参数解释如下:
-
output_dir
:指定模型和分词器保存的目标文件夹路径。 -
tokenizer
:与模型配套的分词器对象,用于处理文本的编码和解码。 -
save_method="merged_16bit"
:指示保存方法为合并后的16位精度格式。
在使用 LoRA(Low-Rank Adaptation)技术进行模型微调时,模型的权重会被调整,但这些调整通常以独立的适配器形式存在。save_pretrained_merged
方法会将这些 LoRA 适配器的权重与原始模型的权重合并,生成一个完整的、可直接部署的模型。选择 merged_16bit
作为保存方法,意味着合并后的模型权重将以16位精度存储,这在保持模型性能的同时减少了存储空间和内存占用。
需要注意的是,save_pretrained_merged
方法可能与特定的库或框架(如 Unsloth)相关联。在使用前,确保已正确安装并导入了相应的库。此外,合并和保存过程可能需要额外的内存和计算资源,建议在资源充足的环境下执行。
关于 save_pretrained_merged
方法的理解
save_pretrained_merged
方法通常用于保存 合并后的模型参数,在某些库(如 Unsloth
)中,它可能是一个特殊的方法,旨在 将低秩适配(LoRA)等增量权重合并回原始模型,然后保存整个模型。
这与 Hugging Face Transformers 中的 save_pretrained
方法有所不同,后者只是简单地保存当前模型的权重,而不会进行合并操作。
不同库或框架的对比
不同库在模型保存时可能有不同的行为:
框架/库 | 方法 | 主要用途 |
---|---|---|
Hugging Face Transformers | save_pretrained | 仅保存模型参数,不合并 LoRA 等适配层 |
PEFT (Hugging Face LoRA 库) | save_pretrained (PEFT) | 仅保存 LoRA 适配层参数 |
Unsloth | save_pretrained_merged | 先合并 LoRA,再保存完整模型 |
LLaMA.cpp | convert-lora-to-checkpoint.py | 手动合并 LoRA 权重到主模型 |
BitsAndBytes (bnb) | save_pretrained | 可能涉及量化保存,但不进行 LoRA 合并 |
Unsloth 和 Hugging Face Transformers 的联系与区别
联系
Unsloth
兼容 Hugging Face Transformers,并使用相同的模型结构,可以加载 HF 训练的模型。- 两者都支持 LoRA 低秩适配技术,并可以使用 PEFT 进行训练和微调。
区别
区别点 | Hugging Face Transformers | Unsloth |
---|---|---|
LoRA 适配层合并 | 需要手动调用 merge_and_unload() | 直接使用 save_pretrained_merged 进行合并并保存 |
主要优化 | 兼容性强,适用于各种模型 | 主要优化 LLaMA 相关模型,适用于高效微调 |
性能优化 | 适用于一般微调任务 | 采用更高效的数据加载和计算方式,加速训练 |
总结
save_pretrained_merged
主要用于 合并 LoRA 适配层并保存完整模型,适用于 Unsloth 这样的高效训练框架。- Hugging Face 及其他框架通常需要手动合并 LoRA 层,例如使用
merge_and_unload()
。 - 如果你用的是
Unsloth
进行 LLaMA 训练,那么save_pretrained_merged
可以帮助你保存完整的合并模型,而不只是 LoRA 适配参数。
你目前在用 Unsloth
进行 LLaMA 训练,所以这个方法对你来说很重要。如果你想用 Hugging Face 直接加载完整的微调模型,而不是 LoRA 适配层,你可以使用 save_pretrained_merged
来保存它。