使用mergekit 合并大型语言模型

模型合并是近年来兴起的一种新技术。它允许将多个模型合并成一个模型。这样做不仅可以保持质量,还可以获得额外的好处。

假设我们有几个模型:一个擅长解决数学问题,另一个擅长编写代码。在两种模型之间切换是一个很麻烦的问题,但是我们可以将它们组合起来,利用两者的优点。而且这种组合的方法可以不需要GPU来完成。

在本文中我们将介绍各种合并算法,研究如何实现它们,并深入研究它们的工作原理。还将使用mergekit工具合并Mistral、WizardMath和CodeLlama模型。

模型合并算法

有几种用于组合模型的算法。其中许多使用加权平均组合。但是在本文中,我将重点介绍一些更高级的算法,并将它们按复杂度递增的顺序排列。

1、Task Vector

这种方法引入了一种使用“Task Vector”修改神经网络行为的方法。这些向量表示预训练模型权重空间中的方向,可以表示在特定任务上改进的性能。

向量可以通过算术运算来计算,比如加法或者减法,从而允许在模型中进行有针对性的行为改变:

Task Vector提供了一种简单而有效的方法来编辑模型,从而实现性能改进、减少偏差和使用新信息更新模型。该方法已被证明可以很好地处理各种模型和任务。

基于Task Vector的模型编辑为控制和改进神经网络模型在各种任务中的性能提供了一种新颖而通用的方法。

论文地址:

https://arxiv.org/abs/2212.04089

2、SLERP

SLERP解决了传统加权平均方法在模型合并中的局限性。它提供了一种更细致的方法,以一种保留高维空间中每个父模型的独特特征和曲率的方式混合模型。

SLERP的优点如下:

平滑过渡:确保更平滑的参数过渡,在高维矢量插值至关重要。

特征保存:保持两个父模型的不同特征和曲率。

细致的混合:考虑矢量空间中的几何和旋转属性,从而产生准确反映两种模型特征的结果。

SLERP流程:

1、输入向量归一化为单位长度,关注方向而不是大小。

2、这些向量之间的角度是用它们的点积确定的。它根据插值因子和矢量之间的夹角计算尺度因子。

3将原始向量与这些因子加权并求和,得到插值向量。

SLERP能够以一种平滑地在参数之间转换的方式合并模型,并保留每个模型的独特特征,使其成为复杂模型合并任务的首选方法。尽管SLERP在同时合并两个模型方面很流行且有效,但它仅限于两两组合。

代码:

https://github.com/Digitous/LLM-SLERP-Merge

3、TIES

传统的模型合并在处理不同模型参数之间会获得不同的干扰。当合并多个模型时,这种干扰会导致性能的大幅下降。

为了克服这些挑战,TIES方法引入了三个步骤:

1、重置在微调期间只发生轻微变化的参数。这一步有助于减少冗余。

2、解决了由于不同模型的参数值符号不同而产生的冲突。

3、它只合并那些与最终商定的符号一致的参数。

ties - merge方法已被证明在各种设置下优于几种现有的merge方法。它有效地解决了干扰问题,特别是符号干扰,增强了合并模型的整体性能。

论文地址:

https://arxiv.org/abs/2306.01708

4、DARE

DARE不需要再训练或gpu。它主要关注于学习类似(同源)模型的参数,它使用与TIES类似的方法,但有两个主要区别:

Delta参数的修剪:通过将它们设置为零来识别和消除大多数Delta参数(微调和预训练参数之间的差异)。这个过程不会显著影响模型的功能。较大的模型可以较大比例丢弃这些参数。

重缩放权重:增加了一个重缩放步骤,其中调整模型的权重以保持输出期望大致不变。这可以将模型的“大”比例权重添加到具有比例因子的基本模型的权重中。

算法的工作步骤如下:

1、修剪将微调权重重置为原始预训练值,减少不必要的参数更改。

2、合并将多个模型中的参数进行平均,以创建一个统一的模型。

3、重新缩放调整合并模型的权重以保持其预期性能。

DARE提供了一种独特而有效的方法,通过修剪和重新缩放参数来合并语言模型,从而使模型具有增强和多样化的功能,而无需进行大量的再训练。

论文地址:

https://arxiv.org/abs/2311.03099

合并模型演示

我们将使用mergekit合并模型,这是一个为合并预训练的语言模型而设计的工具包。它支持上面我们介绍的所有算法,并且设置起来非常简单。模型合并可以只在一个CPU上运行,当然有GPU会更好。

安装:

 python3 -m pip install --upgrade pip
 git clone https://github.com/cg123/mergekit.git
 cd mergekit && pip install -q -e .

我将下面三个模型进行混合:Mistral-7b, WizardMath-7b和CodeLlama-7b。这是yaml配置:

 models:
   - model: mistralai/Mistral-7B-v0.1  # no parameters necessary for base model
   - model: WizardLM/WizardMath-7B-V1.0
     parameters:
       density: 0.5  # fraction of weights in differences from the base model to retain
       weight:   # weight gradient
         - filter: mlp
           value: 0.5
         - value: 0
   - model: codellama/CodeLlama-7b-Instruct-hf
     parameters:
       density: 0.5
       weight: 0.5
 merge_method: ties
 base_model: mistralai/Mistral-7B-v0.1
 parameters:
   normalize: true
   int8_mask: true
 dtype: float16

运行:

 mergekit-yaml ultra_llm_merged.yaml output_folder \
     --allow-crimes \ # Allow mixing architectures
     --copy-tokenizer \ # Copy a tokenizer to the output
     --out-shard-size 1B \ # Number of parameters per output shard
     --low-cpu-memory \ # Store results and intermediate values on GPU. Useful if VRAM > RAM
     --write-model-card \ # Output README.md containing details of the merge
     --lazy-unpickle  # Experimental lazy unpickler for lower memory usage

同时合并多个模型需要大量的资源。我们这个测试是在30个vcpu的系统,资源和时间如下:

下载模式:大约5分钟。

合并过程:大约7分钟。

峰值内存使用:30Gb。

这些时间和资源消耗可能会根据正在合并的特定模型而变化。

总结

我们介绍了合并模型几种算法的工作原理。并且使用mergekit来对三个LLM进行了简单的合并实验,我相信在不久的将来,我们将看到通过合并创建的模型越来越多。因为这是一种结合有用技能而不需要微调的经济有效的方法。

最后mergekit使用也非常简单,并且支持很多模型和不同的合并方法,需要更详细的信息可以看他的github

https://github.com/cg123/mergekit

https://avoid.overfit.cn/post/9b2b050b705e449395038aa8acabe388

作者:Sergei Savvov

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353227.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云轻量应用Ubuntu服务器如何一键部署幻兽帕鲁Palworld私服?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏,在帕鲁的世界,玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活,也…

ORB-SLAM的重定位中使用的EPnP算法解析

EPnP: An Accurate O(n) Solution to the PnPProblem详解 EPnP算法的中心思想就是以四个世界坐标系下的控制点 [ c w 1 c w 2 c w 3 c w 4 ] [c_w^1 \quad c_w^2 \quad c_w^3 \quad c_w^4] [cw1​cw2​cw3​cw4​]通过投影约束和欧式变换下的距离不变约束,求解相机坐…

Redis学习——入门篇⑤

Redis学习——入门篇⑤ 7. SpringBoot集成Redis7.1 配置文件7.2 防火墙7.3 Jedis (了解即可)1.介绍2.步骤 7.4 Lettuce(相当于Jedis)1.介绍以及和Jedis的区别2.步骤 7.5 RedisTemplate (推荐)7.5.1 连接单机7.5.2 连接集群1.正常启…

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中,使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是:对RestSharp 库,根据项目需求再次进行封装。下面先做个简单的使用…

优雅的python(二)

🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…

【Go 快速入门】数组 | 切片 | 映射 | 函数 | 结构体 | 方法和接收者

文章目录 数组切片append 函数copy 函数删除元素 映射delete 函数 函数init 特殊的函数defer 语句panic / recover 错误处理 类型结构体内存对齐JSON 序列化与反序列化方法和接收者 项目代码地址:03-ArraySliceMapFuncStruct 数组 基本格式:var 数组变…

C#,最小生成树(MST)普里姆(Prim)算法的源代码

Vojtěch Jarnk 一、Prim算法简史 Prim算法(普里姆算法),是1930年捷克数学家算法沃伊捷赫亚尔尼克(Vojtěch Jarnk)最早设计; 1957年,由美国计算机科学家罗伯特普里姆独立实现; 19…

智慧交通的“大脑”与“神经”:物联网与车联网双轮驱动,智慧交通加速驶入未来

目录 一、物联网:智慧交通的“大脑” 二、车联网:智慧交通的“神经” 三、物联网与车联网的协同发展 四、智慧交通的未来展望 五、物联网与车联网在智慧交通中的应用案例 六、智慧交通面临的挑战与解决方案 七、政策与法规在智慧交通发展中的作用…

35、WEB攻防——通用漏洞XSS跨站反射存储DOM盲打劫持

文章目录 XSS产生于前端的漏洞,常产生于: XSS分类: 反射型(非持久型) 存储型(持久型),攻击代码被写入数据库中。常见于:写日志、留言、评论的地方 DOM型 DOM型XSS与…

【深度学习】【AutoDL】【SSH】通过VSCode和SSH使用AutoDL服务器训练模型

身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、注册AutoDL并配置环境 首先打开AutoDL官网,注册账号并租赁自己期望的显卡资源 点击“租赁”之后,我们要继续选择基础环境。此处,我们让其自动配置好基础的pytor…

抖去推短视频矩阵系统+实景无人直播系统技术源头开发

抖去推爆款视频生成器,通过短视频矩阵、无人直播,文案引流等,打造实体商家员工矩阵、用户矩阵、直播矩阵,辅助商家品牌曝光,团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术,它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架,并且使…

MCU启动文件小解一下

GD32启动文件分析 启动文件的一些指令.s启动文件分析栈空间分配堆空间管理中断向量表定义堆空间定义Reset_Handler复位程序HardFault_Handler_main文件分析用户堆栈初始化 GD32启动文件主要做了以下工作: 初始化SP_initial_sp , PCReset_Handler指针,设置…

Linux下安装openresty

Linux下安装openresty 十一、Linux下安装openresty11.1.概述11.2.下载OpenResty并安装相关依赖:11.3.使用wget下载:11.4.解压缩:11.5.进入OpenResty目录:11.6.编译和安装11.7.进入OpenResty的目录,找到nginx:11.8.在conf目录下的nginx.conf添…

React一学就会(3): 强化练习一

前言 兄弟们点个关注点点赞,有什么建议在评论里留言说一下,一定要和我多多互动啊,这样我才有动力创作出更有品质的文章。 这节课我们用前两节课的知识做一个实践,在实战中巩固我们所学。本来我想借用官方的示例翻译一下&#xf…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码: package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS,封装http网络请求 前提: 要想使用http请求,系统必须要具备ohos.permission.INTERNET权限,在model.json5文件中的module模块下添加如下请求权限: 在module.json5文件中 配置 "requestPermi…

1949-2022年交通运输设备行业数据

1949-2022年交通运输设备行业数据 1、时间1949-2021年 2、指标:民用驳船保有量(艘)_AmoCivBar、民用机动船保有量(艘)_AmoCivMotBoat、民用运输机保有量(架)_AmoPlaTra、民用其他汽车保有量(万辆)_AmoOthAutCiv、私人其他汽车保有量(万辆)_AmoOthAutPri、新注册民…

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载:MySQL :: Download MySQL Community Server 二、上传软件…