GGUF类型模型文件

在HuggingFace上,我们时不时就会看到GGUF后缀的模型文件,它是如何来的?有啥特点?

图片

https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGUF

GGUF 由来

Georgi Gerganov(https://github.com/ggerganov)是著名开源项目llama.cpp(https://github.com/ggerganov/llama.cpp)的创始人,它最大的优势是可以在CPU上快速地进行推理而不需要 GPU。

创建llama.cpp后作者将该项目中模型量化的部分提取出来做成了一个用于机器学习张量库:GGML(https://github.com/ggerganov/ggml),项目名称中的GG其实就是作者的名字首字母。它与其他张量库(tensor library)最大的不同,就是支持量化模型在CPU中执行推断。从而实现了低资源部署LLM。

而它生成的文件格式最初只存储了张量,这就是GGML工具,后来由于一些不足:

它无法有效地识别不同的模型架构,
对超参数的添加和移除具有破坏性,这使得模型的迭代和升级变得复杂。

为此,在2023年8月份,Georgi Gerganov推出了GGUF作为后续的替代者,即:GGUF格式标准:

https://github.com/ggerganov/ggml/blob/master/docs/gguf.md

  • GGUF (GPT-Generated Unified Format) 是一种二进制模型文件格式,

  • 专为GGML及其执行器快速加载和保存模型而设计。

  • GGUF 是 GGML、GGMF 和 GGJT 的后继文件格式,通过包含加载模型所需的所有信息来确保明确性。

  • GGUF 被设计为可扩展的,以便可以在不破坏兼容性的情况下将新信息添加到模型中。

GGUF 的特点

大语言模型的开发通常使用PyTorch等框架,其预训练结果通常也会保存为相应的二进制格式,如pt后缀的文件通常就是PyTorch框架保存的二进制预训练结果。

但是,大模型的存储一个很重要的问题是它的模型文件巨大,而模型的结构、参数等也会影响模型的推理效果和性能。

将原始模型预训练结果转换成GGUF之后,有下面优势:

一、可以更加高效的使用

原始的大模型预训练结果经过转换后变成GGUF格式可以更快地被载入使用,也会消耗更低的资源。

原因在于GGUF采用了多种技术来保存大模型预训练结果,包括采用紧凑的二进制编码格式、优化的数据结构、内存映射等。

1、二进制格式

GGUF作为一种二进制格式,相较于文本格式的文件,可以更快地被读取和解析。

二进制文件通常更紧凑,减少了读取和解析时所需的I/O操作和处理时间,这对于需要频繁加载不同模型的场景尤为重要。

2、优化的数据结构

GGUF采用了特别优化的数据结构,这些结构为快速访问和加载模型数据提供了支持。例如,数据可能按照内存加载的需要进行组织,以减少加载时的处理。

3、全面的信息包含

GGUF包含加载模型所需的所有信息,无需依赖外部文件。这大大简化了模型部署和共享的过程。

这就可以跨平台和跨设备地加载和运行模型,无需安装任何额外的依赖库。

二、量化技术,降低资源消耗

模型量化是一种将浮点计算转成低比特定点计算的技术,它可以有效的降低模型计算强度、参数大小和内存消耗,从而提高模型的推理速度和效率。

llama.cpp官方提供了转换脚本,可以将pt格式的预训练结果以及safetensors模型文件转换成GGUF格式的文件。转换的时候也可以选择量化参数,降低模型的资源消耗。这个过程性能损失很低!

GGML支持将模型权重量化为较低位数的整数,进一步减小模型大小并提高计算效率,同时也是一种平衡性能和精度的手段。

参看:QLoRa 低秩分解+权重量化的微调 权重量化部分。

图片

使用范围

在HuggingFace上gguf类模型有6K+个。
https://huggingface.co/models?library=gguf&sort=trending

可以看到这类模型不少了,是一种比较受欢迎的格式。

图片

文件名格式

GGUF 自身又有多种格式,主要区别在于浮点数的位数和量化的方式。不同的格式会影响模型的大小、性能和精度,一般来说,位数越少,量化越多,模型越小,速度越快,但是精度也越低。

在模型文件命名中,可以看到这样的文件名:

图片

上面命名中的关键字解释:

“Q”+用于存储权重(精度)的位数+特定变体。

1、Q(Quantization):

Q2、Q3、Q4、Q5、Q6 分别表示模型的量化位数。例如,Q2 表示 2 位量化,Q3 表示 3 位量化,以此类推。

量化位数越高,模型的精度损失就越小,但同时模型的大小和计算需求也会增加。

2、特定变体

特定变体的几个参数,我们从 https://github.com/ggerganov/ggml/blob/master/docs/gguf.md 文档可以看出,这些是量化方案的类型。

按照 https://towardsdatascience.com/quantize-llama-models-with-ggml-and-llama-cpp-3612dfbcc172 这里对每个变体的说明:

  • q2_k: Uses Q4_K for the attention.vw and feed_forward.w2 tensors, Q2_K for the other tensors.

  • q3_k_l: Uses Q5_K for the attention.wv, attention.wo, and feed_forward.w2 tensors, else Q3_K

  • q3_k_m: Uses Q4_K for the attention.wv, attention.wo, and feed_forward.w2 tensors, else Q3_K

  • q3_k_s: Uses Q3_K for all tensors

  • q4_0: Original quant method, 4-bit.

  • q4_1: Higher accuracy than q4_0 but not as high as q5_0. However has quicker inference than q5 models.

  • q4_k_m: Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q4_K

  • q4_k_s: Uses Q4_K for all tensors

  • q5_0: Higher accuracy, higher resource usage and slower inference.

  • q5_1: Even higher accuracy, resource usage and slower inference.

  • q5_k_m: Uses Q6_K for half of the attention.wv and feed_forward.w2 tensors, else Q5_K

  • q5_k_s: Uses Q5_K for all tensors

  • q6_k: Uses Q8_K for all tensors

  • q8_0: Almost indistinguishable from float16. High resource use and slow. Not recommended for most users.

https://huggingface.co/mlabonne/gemma-2b-it-GGUF 也有类似的说明。

可以看到不同变体其实就是采用了不同的量化方案来处理 attention.wv、attention.wo 和 feed_forward.w2 张量。

这些方案被命名为不同的变体,如 "q3_k_l"、"q3_k_m" 和 "q4_k_m"。这些变体的主要区别在于对于这些关键张量使用的量化方案的不同。

总结

GGUF 模型是一种二进制模型文件格式,专为在CPU上快速加载和保存模型而设计。它是 GGML、GGMF 和 GGJT 的后继文件格式,通过包含加载模型所需的所有信息来确保明确性,并且可以在不破坏兼容性的情况下扩展新信息。

GGUF 的特点包括:

  • 更高效的使用:GGUF 格式采用多种技术来保存模型,包括紧凑的二进制编码格式、优化的数据结构和内存映射,从而使模型在加载和使用时更快速,资源消耗更低。

  • 量化技术降低资源消耗:GGUF 支持模型量化,可以将模型权重量化为较低位数的整数,降低模型大小和内存消耗,提高计算效率,同时平衡性能和精度。

GGUF 模型在 HuggingFace 上已经有大量应用,文件名格式以"Q"开头表示量化位数,后跟特定变体,这些变体根据量化方案的不同而命名,影响模型的大小、性能和精度。

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

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

相关文章

机器学习基础入门(一)(机器学习定义及分类)

机器学习定义 给予计算机无需特意带有目的性编程便有学习能力的算法 深度学习算法 主要有监督学习和非监督学习两类 监督学习(supervised learning) 定义 1、学习由x映射到y的映射关系 2、主动给予机器学习算法正确示例,算法通过示例来学习…

Springboot+Vue项目-基于Java+MySQL的旅游网站系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

政安晨:【Keras机器学习实践要点】(二十七)—— 使用感知器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施前馈网络(FFN) 将创建修补程序作为一个层 实施补丁编码层 建立感知器模型 变换器模块 感知器模型 编译、培训和评估模式 政安晨的个人主页:政安晨 欢迎 👍点赞✍…

改写STM32标准库函数中的fputc

int fputc(int ch, FILE *f) {unsigned char temp[1] {ch};HAL_UART_Transmit(&huart1, temp, 1, 0xFFFF);return ch; // 或者返回 0,表示写入成功 }标准库中的 printf 函数在执行输出时会调用 fputc 函数,将字符一个个发送到输出流中。通过重写 fp…

redis-哨兵模式

一,哨兵的作用: 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配…

数仓维度建模

维度建模 数仓建模方法1. 范式建模法(Third Normal Form,3NF)2. 维度建模法(Dimensional Modeling)3. 实体建模法(Entity Modeling) 维度建模1. 事实表事实表种类事务事实表周期快照事实表累计快…

008Node.js模块、自定义模块和CommonJs

CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标 准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的…

强大的数据分析计算软件:Stata 15 for Mac 激活版

Stata 15 for Mac是一款高级统计分析软件,具有强大的数据管理和数据提取工具。以下是其功能和特点的详细介绍: 软件下载:Stata 15 for Mac 激活版版下载 数据管理:Stata 15 for Mac支持多种数据库、数据格式和计算机语言&#xff…

软件定义车队面临网络安全的曲折之路

当以色列 REE Automotive 设计其 P7 电动汽车底盘时,它是从软件开始工作的:扁平的车辆底盘完全可配置,每个轮胎附近有四个独立的模块,用于转向、制动、悬架和动力传动系统,每个模块均由电子驱动控制单元(EC…

小程序地理位置权限申请+uniapp调用uni.getLocation

文章目录 一、小程序地理位置权限申请二、uniapp调用uni.getLocation 一、小程序地理位置权限申请 需要确保小程序类目已经填写 点击左侧导航栏找到最后的“设置”——“基本设置”——“前往填写” 在开发管理——接口设置——地理位置中可以看到: 即可点击想要申…

python与设计模式之工厂模式的那些事儿

一、工厂模式 工厂模式实现了按需创建的最佳模式,其目的是为了隐藏创建类的细节与过程,通过一个统一的接口来创建所需的对象。 话说没了皇位争夺权的皇三接到了一个外征的工作,始皇给了5个亿的经费让皇三组建一个军队。打权总是要进行武器采…

ClickHouse--16--普通函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数(返回非日期)2、时间或日期截取函数(返回日期)3、日期或时间日期生成函数 二、类…

httpsok-快速申请谷歌SSL免费证书

🔥httpsok-快速申请谷歌SSL免费证书 使用场景: 部署CDN证书、OSS云存储证书证书类型: 单域名 多域名 通配符域名 混合域名证书厂商: ZeroSSL Lets Encrypt Google证书加密类型: ECC、 RSA 一、证书管理 进入 证书管…

基于Python的LSTM网络实现单特征预测回归任务(pytorch版)

一、数据集 自建数据集--【load.xlsx】。包含2列: date列(时间列,记录2022年6月2日起始至2023年12月31日为止,日度数据)price列(价格列,记录日度数据对应的某品牌衣服的价格,浮点数…

uni-app实现下拉刷新

业务逻辑如下: 1.在滚动容器中加入refresher-enabled属性,表示为开启下拉刷新 2.监听事件,添加refresherrefresh事件 3.在事件监听函数中加载数据 4.关闭动画,添加refresher-triggered属性,在数据请求前开启刷新动画…

戴尔 latitude 3490使用体验

最近体验了一下戴尔 latitude 3490,又体验了一下戴尔 latitude 3420.再把戴尔最近的主流轻薄本、当下主流轻薄本做对比. 感觉3490比3420好用,要流畅一些,但是有点重,整体设计感不如3420。 戴尔 Latitude 14 3000系列 3490(i5 82…

代码随想录算法训练营Day53|LC1143 最长公共子序列LC1035 不相交的线LC53 最大子数组和

一句话总结:秒了。 原题链接:1143 最长公共子序列 与昨天的最长重复子数组极度类似。 由于这里是子序列,两者不相等时有dp[i][j] Math.max(dp[i][j - 1], dp[i - 1][j])。同时由于子序列的缘故,dp数组及下标的含义也有了改变&am…

根据后端获取到的文档流,下载打开显示“无法打开文件”

原代码: download(item) {this.axios.get(api.download/item.name).then(res > {// console.log(res)let bob new Blob([res.data],{type: application/vnd.ms-excel})const link document.createElement(a);let url window.URL.createObjectURL(bob);link.d…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域,比较常用的轻量化软件交付方式,该技术是将3D应用等大模型的算力执行放在了服务器端,而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多,实时云渲染平台的国产信创化…

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,…