Mergekit——任務向量合并算法Ties解析

Mergekit——高頻合并算法 TIES解析

  • Ties背景
    • Ties 核心思想
    • 具體流程
    • 總結

mergekit項目地址
Mergekit提供模型合并方法可以概況為三大類:基本線性加權、基于球面插值、基于任務向量,今天我們來刷下基于任務向量的ties合并方法,熟悉原理和代碼。

Ties背景

首先明確:Ties方法建立在“任務向量”的概念之上,任務向量表示參考的微調模型和基本模型之間的區別,這種方法在mergekit中非常多,Ties只是其中一種變體。
TIES-Merging ——可將多個同構不同參數的模型合并為單個多任務模型。主要解決模型合并中的兩個主要挑戰:

1.模型參數冗余:它識別并消除特定任務模型中的冗余參數。這是通過關注微調期間所做的更改、識別前 k% 最重要的更改并丟棄其余的來實現的。
2.參數符號之間的不一致:當不同模型對同一參數提出相反的調整時,就會出現沖突。TIES-Merging 通過創建一個統一的符號向量來解決這些沖突,該符號向量代表所有模型中最主要的變化方向。

Ties 核心思想

稀疏化密度:通過僅保留一小部分最重要的參數(密度參數)并將其余參數重置為零,減少特定于任務的模型中的冗余。
符號共識: 通過根據累積幅度的最主要方向(正或負)創建統一的符號向量,解決不同模型之間的符號沖突。
不相交合并:對與統一符號向量對齊的參數值進行平均,不包括零值。

具體表現為當多個模型進行合并時候,稀疏化密度只保留最重要的權重高化,符號共識**保留多個模型再更新方向上一致的參數。

具體流程

通過分析代碼后,可以匯總為以下步驟:

  1. 計算任務向量——每個模型和base模型的差異,比較簡單
   def get_task_vectors(weight_info: WeightInfo,base_model: ModelReference,tensors: ImmutableMap[ModelReference, torch.Tensor],tensor_parameters: ImmutableMap[ModelReference, ImmutableMap[str, Any]],
) -> Tuple[List[Dict[str, Any]], torch.Tensor]:keys = list(tensors.keys())base = tensors[base_model]parameter_name = weight_info.nameres = []for model in keys:if model == base_model:continuex = tensors[model].to(base.dtype)if x.shape != base.shape:if weight_info.is_embed:x = x[: base.shape[0], : base.shape[1]]logging.warning(f"Using submatrix of {model}:{parameter_name}")else:logging.warning(f"skipping {model}:{parameter_name} due to size mismatch")continuedelta = x - basedel xdel tensors[model]d = {}d["model"] = modeld["delta"] = deltafor p in tensor_parameters[model]:d[p] = tensor_parameters[model][p]res.append(d)return res, base
  1. 稀疏化權重
# sparsifyif self.method.sparsification_method:for tv_info in tvs:kwargs = {}if "gamma" in tv_info:kwargs["gamma"] = tv_info["gamma"]if "epsilon" in tv_info:kwargs["epsilon"] = tv_info["epsilon"]tv_info["delta"] = sparsify(tv_info["delta"],density=tv_info["density"],method=self.method.sparsification_method,rescale_norm=self.rescale_norm,**kwargs,)

然后,如何計算權重幅度等等,在源碼中sparsify具備四種稀疏化方法:

  • magnitude: 基于權重大小的剪枝
  • random: 隨機剪枝
  • magnitude_outliers: 去除極大值和極小值的剪枝
  • della_magprune: 基于概率的漸進式剪枝方法

這里我們主要說ties 基于權重幅度剪枝—— 保留絕對值最大的k個元素,k=density*總元素數,簡單高效

def magnitude(tensor: torch.Tensor, density: float, rescale_norm: Optional[RescaleNorm] = None
) -> torch.Tensor:"""Masks out the smallest values, retaining a proportion of `density`."""if density >= 1:return tensork = int(density * tensor.numel())  #計算保留元素數量assert k > 0, "not gonna zero out the whole tensor buddy"mask = torch.zeros_like(tensor)w = tensor.abs().view(-1)if w.device.type == "cpu":w = w.float()topk = torch.argsort(w, descending=True)[:k]  #對絕對值進行降序排序,獲取前k大值的索引mask.view(-1)[topk] = 1  #將掩碼中對應top-k索引的位置設為1res = rescaled_masked_tensor(tensor, mask, rescale_norm)  #調用輔助函數應用掩碼并根據需要重新縮放,保持特定的范數特性,保證輸出和反向傳播計算的穩定性return res

通過上述計算,可以保留所謂權重幅度最大的參數,完成稀疏化。
3. 權重應用

		deltas = torch.stack([tv["delta"] for tv in tvs], dim=0)weights = torch.tensor([tv["weight"] for tv in tvs], dtype=deltas.dtype, device=deltas.device)while len(deltas.shape) > len(weights.shape):weights.unsqueeze_(-1)weighted_deltas = deltas * weights

4.符號共識
Ties提供兩種方式計算符號
”sum“: 加權,考慮參數幅度
”count“,基于符號數量統計

def get_mask(delta: torch.Tensor,method: Literal["sum", "count"] = "sum",mask_dtype: Optional[torch.dtype] = None,
):"""Returns a mask determining which delta vectors should be mergedinto the final model.For the methodology described in the TIES paper use 'sum'. For asimpler naive count of signs, use 'count'."""if mask_dtype is None:mask_dtype = delta.dtypesign = delta.sign().to(mask_dtype)  # 獲取每個元素的符號(-1, 0, +1)if method == "sum":sign_weight = delta.sum(dim=0) # 沿模型維度求和majority_sign = (sign_weight >= 0).to(mask_dtype) * 2 - 1    # 轉換為±1del sign_weightelif method == "count":majority_sign = (sign.sum(dim=0) >= 0).to(mask_dtype) * 2 - 1else:raise RuntimeError(f'Unimplemented mask method "{method}"')return sign == majority_sign  #生成bool mask

在Sum方法中也是ties的論文方法,考慮差異的幅度和方向:

對每個參數位置,計算所有模型差異的總和;如果總和≥0,多數符號為+1,否則為-1,這樣幅度的差異大對結果影響較大;

在count方法中,對每個參數位置,統計正負號數量,正號多則多數符號為+1,否則為-1,忽略差異幅度,只考慮方向

計算更簡單但可能不夠精確。

  1. 合并

回到主線代碼,這里我們已經拿到了掩碼,可以確定哪些參數變化(deltas)應該被合并

if self.method.consensus_method:mask_dtype = torch.int8 if self.int8_mask else base.dtypemask = get_mask(weighted_deltas,method=self.method.consensus_method,mask_dtype=mask_dtype,) #拿到mask后mixed_delta = (weighted_deltas * mask).sum(dim=0) #直接對所有加權deltas求和divisor = (weights * mask).sum(dim=0) #計算有效權重的和(用于歸一化)divisor[divisor == 0] = 1else:mixed_delta = weighted_deltas.sum(dim=0) #只保留被掩碼選中的deltas并求和divisor = weights.sum(dim=0)divisor[divisor.abs() < 1e-8] = 1if self.normalize:  # 歸一化mixed_delta /= divisor if self.lambda_ != 1: #系數縮放mixed_delta *= self.lambda_return (base + mixed_delta).to(base.dtype) 合并

總結

Mergekit ties的配置參考

models:- model: psmathur/orca_mini_v3_13b        #參考模型1parameters:density: [1, 0.7, 0.1] # density gradient   這是稀疏化的密度列表 對應不同層的稀疏化成都weight: 1.0                                #權重值- model: garage-bAInd/Platypus2-13B         #參考模型2 其余同上parameters:density: 0.5                           weight: [0, 0.3, 0.7, 1] # weight gradient- model: WizardLM/WizardMath-13B-V1.0       #參考模型3 其余同上parameters:density: 0.33weight:- filter: mlp  #對于MLP是取0.5 其他層是0value: 0.5- value: 0
merge_method: ties
base_model: TheBloke/Llama-2-13B-fp16      #選擇這個模型作為基礎模型
parameters:normalize: trueint8_mask: true
dtype: float16

這里當參數為List時候,Mergekit會進行映射到不同層,在處理每個參數時候根據位置選擇List中的密度或者權重值,保留嵌入層 、中間層、末尾層對應不同密度稀疏,考慮使用線性插值來計算中間層的密度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv8 在單片機上部署的缺點和應對方案

YOLOv8 在單片機上部署的主要挑戰與缺陷 將 YOLOv8 部署到單片機上確實面臨諸多技術挑戰&#xff0c;主要源于單片機有限的計算資源與 YOLOv8 模型的高復雜度之間的矛盾。以下是具體的缺陷和限制&#xff1a; 1. 計算資源嚴重不足 算力限制&#xff1a;典型單片機&#xff0…

搭建一個永久免費的博客

搭建永久免費的博客&#xff08;1&#xff09;基本介紹 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下載安裝git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…

基于SpringBoot的小型民營加油站管理系統

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

推薦一個Winform開源的UI工具包

從零學習構建一個完整的系統 推薦一個開源、免費的適合.NET WinForms 控件的套件。 項目簡介 Krypton是一套開源的.Net組件&#xff0c;用于快速構建具有豐富UI交互的WinForms應用程序。 豐富的UI控件&#xff0c;提供了48個基礎控件&#xff0c;如按鈕、文本框、標簽、下拉…

社交平臺推出IP關聯機制:增強用戶體驗與網絡安全的新舉措

社交平臺為我們提供與親朋好友保持聯系、分享生活點滴的便捷渠道&#xff0c;還成為了信息傳播、觀點交流的重要平臺。然而&#xff0c;隨著社交平臺的普及&#xff0c;網絡空間中的虛假信息、惡意行為等問題也日益凸顯。為了應對這些挑戰&#xff0c;許多社交平臺相繼推出IP關…

系統架構設計(八):三層架構

什么是三層架構&#xff08;Three-Tier Architecture&#xff09; 三層架構是將系統分為三大邏輯層&#xff1a;表示層&#xff08;Presentation&#xff09;、業務邏輯層&#xff08;Business Logic&#xff09;、數據訪問層&#xff08;Data Access&#xff09;&#xff0c;…

C語法備注01

&#xff08;1&#xff09;char 字符類 char 既可以是 整數 類型&#xff0c;也可以是 字符 類型。z字符 類型可以轉化為對應的ASC2值。 int main(){char c;char e;c 1;char d 1;e A;printf("c %d\n", c);printf("d %d\n", d);printf("e %d\n…

CVE-2015-2183 Zeuscart SQL注入漏洞

CVE-2015-2183 Zeuscart SQL注入漏洞 主頁 訪問/admin/進行登錄 訪問&#xff1a;http://192.168.1.3/admin/?doeditcurrency&cid1 單引號測試&#xff0c;發現頁面發生變化&#xff0c;進一步測試 order by 5 &#xff0c;頁面正常&#xff0c;order by 6時頁面發生變…

Go 語言即時通訊系統開發日志-日志day2-5:架構設計與日志封裝

Go語言即時通訊系統開發日志day2 計劃&#xff1a;學習go中MySQL&#xff0c;Redis的使用&#xff0c;使用MySQL和Redis完成一個單聊demo。 總結&#xff1a;現在每天下午用來開發這個項目&#xff0c;如果有課的話可能學習時間只有3-4個小時&#xff0c;再加上今天的學習效率不…

對盒模型的理解

對CSS盒模型的深入理解 CSS盒模型是網頁布局的基礎概念&#xff0c;它描述了HTML元素在頁面中所占的空間以及如何計算這些空間。以下是關于盒模型的全面解析&#xff1a; 1. 盒模型的基本組成 每個HTML元素都被視為一個矩形的盒子&#xff0c;這個盒子由內到外由四部分組成&…

RV1126多線程獲取SMARTP的GOP模式數據和普通GOP模式數據

通過代碼的方式同時獲取SMARTP模式的VENC碼流數據和普通GOP模式的VENC碼流數據&#xff0c;并進行對比畫質。 一.RV1126 VI采集攝像頭數據并同時編碼SMARTP模式和普通GOP模式的編碼碼流流程 RV1126利用多線程同時獲取普通GOP的VENC碼流數據和SMARTP的碼流數據一般如上圖&#…

在Ubuntu使用 Ansible 配置 Azure 資源的動態清單

使用 Ansible 配置 Azure 資源的動態清單 簡介1.安裝pipx2.通過 pipx 安裝 Ansible3.安裝azure.azcollection4.安裝集合所需的依賴項5.生成動態庫存 簡介 在主機變化不定的云環境中&#xff0c;Ansible 的動態清單功能可以消除維護靜態清單文件的負擔 本教程將帶你使用 Azure…

車載診斷架構 ---車載總線對于功能尋址的處理策略

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

Github 2025-05-16 Java開源項目日報 Top9

根據Github Trendings的統計,今日(2025-05-16統計)共有9個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Java項目9Netty:異步事件驅動的網絡應用程序框架 創建周期:5043 天開發語言:Java協議類型:Apache License 2.0Star數量:33219 個Fork數量:…

大語言模型(LLM)如何通過“思考時間”(即推理時的計算資源)提升推理能力

大語言模型(LLM)如何通過“思考時間”(即推理時的計算資源)提升推理能力 核心圍繞人類思維機制、模型架構改進、訓練方法優化等展開 一、人類思維的啟發:快思考與慢思考 類比心理學: 人類思維分兩種模式: 快思考(系統1):直覺驅動,快速但易出錯(如估算簡單問題)。…

【ubuntu24.04】pycharm 死機結束進程

windows 遠程pycharm到ubuntu執行程序 pycharm 在調試過程中&#xff0c;內存耗盡&#xff0c;然后死機了 pycharm 進程 (base) rootk8s-master-pfsrv:/home/zhangbin/下載# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …

從虛擬仿真到行業實訓再到具身智能--華清遠見嵌入式物聯網人工智能全鏈路教學方案

2025年5月23-25日&#xff0c;第63屆中國高等教育博覽會&#xff08;高博會&#xff09;將在長春中鐵東北亞國際博覽中心舉辦。作為國內高等教育領域規模大、影響力廣的綜合性展會&#xff0c;高博會始終聚焦教育科技前沿&#xff0c;吸引全國高校管理者、一線教師、教育科技企…

本地部署dify+ragflow+deepseek ,結合小模型實現故障預測,并結合本地知識庫和大模型給出維修建議

1.準備工作 使用ollama 拉取deepseek-r1:7b 官網下載ollama ollama run deepseek-r1:7b ollama list Ragflow專注于構建基于檢索增強生成&#xff08;RAG&#xff09;的工作流&#xff0c;強調模塊化和輕量化&#xff0c;適合處理復雜文檔格式和需要高精度檢索的場景。Dify…

https://api.ipify.org/?format=json 不好使

https://api.ipify.org/?formatjson 打不開&#xff0c;用下面新地址 https://api64.ipify.org/?formatjson

Linux基礎開發工具三(git,gdb/cgdb)

不知道你?作或學習時&#xff0c;有沒有遇到這樣的情況&#xff1a;我們在編寫各種?檔時&#xff0c;為了防??檔丟失&#xff0c;更改 失誤&#xff0c;失誤后能恢復到原來的版本&#xff0c;不得不復制出?個副本&#xff0c;?如&#xff1a; “報告-v1” “報告-v2” …