训练、微调与数据1080 字

基于TIES合并微调模型

·全库 307 / 611

《基于TIES合并微调模型》共 0.1 万字,通篇围绕 LoRA、微调、成本、向量 展开,归在「训练、微调与数据」这一层。

覆盖LoRA微调成本向量预训练CUDA

适合要自己训模型、或者判断这一版该不该训的人

目录骨架(3 节)
  1. 示例代码
  2. 合并方法
  3. 合并 (IA)³ 模型
目录 · 3 节

示例代码

📎 附件:ties-merge.zip(zip, 9KB)

原文链接:https://www.yuque.com/attachments/yuque/0/2025/zip/2424104/1747014138731-7115e9cf-041b-410b-8bef-147b63f259c6.zip

前言

为每个任务训练模型可能成本高昂、占用存储空间,并且模型无法学习新信息来提高其性能。多任务学习可以通过训练一个模型来学习多个任务来克服其中一些限制,但训练成本很高,并且为其设计数据集具有挑战性。模型合并 通过将多个预训练模型组合成一个模型,为这些挑战提供了一种解决方案,使其无需任何额外训练即可拥有每个单独模型的组合能力。

PEFT 提供了几种合并模型的方法,例如线性或 SVD 组合。本指南重点介绍两种更有效的方法,通过消除冗余参数来合并 LoRA 适配器

  • TIES - TrIm, Elect, and Merge (TIES) 是一种用于合并模型的三步方法。首先,修剪冗余参数,然后将冲突的符号解析为聚合向量,最后对符号与聚合符号相同的参数进行平均。此方法考虑了某些值(冗余和符号不一致)可能会降低合并模型的性能。
  • DARE - Drop And REscale 是一种可以用于准备其他模型合并方法(如 TIES)的方法。它的工作原理是根据丢弃率随机丢弃参数并重新调整剩余参数的比例。这有助于减少多个模型之间冗余和可能相互干扰的参数数量。

模型通过 add_weighted_adapter() 方法合并,并且特定的模型合并方法在 combination_type 参数中指定。

合并方法

使用 TIES 和 DARE,通过将 combination_type 和 density 设置为要从各个模型保留的权重值来启用合并。例如,让我们合并三个微调的 TinyLlama/TinyLlama-1.1B-intermediate-step-1431k-3T 模型:tinyllama_lora_nobots、tinyllama_lora_sql 和 tinyllama_lora_adcopy。

当您尝试使用 TIES 合并完全训练的模型时,您应该注意每个模型可能已添加到嵌入层中的任何特殊 token,这些 token 不是原始检查点词汇表的一部分。这可能会导致问题,因为每个模型可能已将特殊 token 添加到相同的嵌入位置。如果是这种情况,您应该使用 resize_token_embeddings 方法来避免在相同的嵌入索引处合并特殊 token。

​

如果您仅合并从同一基础模型训练的 LoRA 适配器,则这不应成为问题。

加载基础模型,可以使用 load_adapter() 方法加载并为每个适配器分配一个名称

from peft import PeftConfig, PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

config = PeftConfig.from_pretrained("smangrul/tinyllama_lora_norobots")
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, load_in_4bit=True, device_map="auto").eval()
tokenizer = AutoTokenizer.from_pretrained("smangrul/tinyllama_lora_norobots")

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求