GGUF类型模型文件

news2025/4/17 4:06:21

在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"开头表示量化位数,后跟特定变体,这些变体根据量化方案的不同而命名,影响模型的大小、性能和精度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数

标量、向量、张量 标量占据的是零维空间向量占据的是一维数据,例如语音信号矩阵占据的是二维数组,例如灰度图像张量占据的是三维乃至更高维的数组,例如RGB图像和视频 内积(点乘)概述 内积(inner product) 计算的则是两个向量之间的关系 两…

【读点论文】Segment Anything,视觉界的GPT,可以通过Prompt完成图像实体理解的视觉基础大模型,处理零样本任务

Segment Anything Abstract 我们介绍了Segment Anything(SA)项目:一种用于图像分割的新任务、模型和数据集。在数据收集循环中使用我们的高效模型,我们构建了迄今为止(迄今为止)最大的分割数据集&#xf…

QA测试开发工程师面试题满分问答11: web前端页面视频组件无法播放如何定位bug

当 web 前端页面的视频组件无法播放时,可以从以下维度进行分析和定位可能的 bug,分析维度包括但不限于:前端功能点、缓存、异常、后端功能点、资源占用、并发、网络等: 前端功能点: HTML5 视频支持:检查视频…

openstack之neutron介绍

核心组件 neutron-server:提供API接口,把对应的api请求传给plugin进; neutron-plugin:管理逻辑网络状态,调用agent; neutron-agent:在provider network上创建网络对象; neutron-…

万兆以太网MAC设计(2)MAC_RX模块

文章目录 前言一、模块功能二、代码三、仿真波形 前言 上文我们打通了了万兆以太网物理层和数据链路层,其实就是会使用IP核了,本文将正式开始MAC层设计第一篇,接收端设计。 一、模块功能 MAC_RX模块功能如下: 解析接收的报文&…

Android13 CameraServer启动流程

代码入口 frameworks/av/camera/cameraserver 里面包含了四个文件 我们先来看看Android.bp的内容 package {// See: http://go/android-license-faq// A large-scale-change added default_applicable_licenses to import// all of the license_kinds from "frameworks_a…

什么是MOV视频格式?如何把MP4视频转MOV视频格式?

一,前言 当然可以,MP4视频可以转换为MOV格式。这两种格式都是常见的视频文件格式,它们都可以用于存储和播放视频内容。虽然它们的编码方式和特性有所不同,但使用合适的视频转换工具可以轻松地将MP4视频转换为MOV格式。 二&#…

Science Robotics 封面论文:Google DeepMind 通过深度强化学习赋予双足机器人敏捷的足球技能

创造通用具身智能,即创造能够在物理世界中敏捷、灵巧和理解的智能体——就像动物或人类一样——是人工智能 (AI) 研究人员和机器人专家的长期目标之一。动物和人类不仅是自己身体的主人,能够流畅而轻松地执行和组合复杂的动作&…

【Hadoop】下载安装及伪分布式集群搭建教程

目录 1.概述 2.环境准备 3.hadoop安装 3.1.下载安装配置 3.2.伪分布式集群 3.3.注意事项 4.Hadoop集群的组成 1.概述 hadoop有三种安装模式 单机模式,只在一台机器上运行,存储用的本地文件系统而不是HDFS。 伪分布式模式,存储采用HD…

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀,从发布赛题一直到现在,总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

openGauss_5.0.1 企业版安装及问题记录(CentOS系统):主备模式服务器安装

目录 📚第一章 官方地址📗安装包下载地址📗文档指南 📚第二章 安装📗准备工作📗开始安装📕创建XML配置文件📕初始化安装环境📕执行安装📕验证 📚第…

前端用 HTML5 + CSS3 + JavaScript,后端连接什么数据库更简单?

当前端使用 HTML5、CSS3 和 JavaScript 进行开发时,后端连接何种数据库是一个非常重要的问题,因为数据库的选择直接影响着后端代码的编写、数据存储与查询的效率以及系统的可维护性。 1. 关系型数据库(SQL 数据库): …

关于“使用java中的二维矩阵方法生成二维码“ 以及 “Java加载外部字体文件时出错的原因“

生成二维码 铁铁们,这两日写了一个导出二维码的接口,要求有一个是在二维码下方生成字体,现在奉上生成二维码的代码: controller层 Operation(summary "导出机构二维码",description "导出机构二维码")GetMapping("/orgCode")public void getO…

Session缓存、Hibernate处理对象的状态了解

Session接口 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存,更新,删除和查询的方法。 Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到…

element table 使用了表格固定height高度和表格属性fixed属性出现了高度错乱bug

问题描述&#xff1a;因为使用了表格固定height高度所以 使用表格属性fixed属性出现了高度错乱bug知识点&#xff1a;使用element table 里提供的doLayout 方法 代码 // template <el-table ref"test" ></el-table>//js// 查询数据getList(obj{}) {get…

当你的项目体积比较大?你如何做性能优化

在前端开发中&#xff0c;项目体积优化是一个重要的环节&#xff0c;它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂&#xff0c;引入的依赖也越来越多&#xff0c;如何有效地减少最终打包文件的大小&#xff0c;成为了前端工程师需要面对的挑战。以下是一些常…

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

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

时钟周期检测标志信号

在某些情况下需要对系统时钟分频后的时钟进行周期检测&#xff0c;引出周期标志信号以便在后续其他情况的使用。虽然在大多数情况下我们能够知道分频后的时钟是系统时钟的几倍分频&#xff0c;但为增强在分频时钟改变情况下周期标志信号的复用性或对未知时钟的周期检测&#xf…

第六季:RTSP协议详解与实时流视频预览

目录 前言1 环境准备2 H.264编码原理和基本概念2.1 图像冗余信息2.2 h.264编码相关的一些概念2.3 h264视频流总体分析2.4 H264的NAL单元详解22.4.1 相关概念 2.5 NALU详解2.6 sps和pps详解2.7 H264的profile和level2.8 序列sequence 前言 本篇文章用于记录实验过程 1 环境准备…

【YUNBEE云贝-进阶课】MySQL8.0性能优化实战培训

众多已经学习过MySQL 8.0 OCP认证专家的课程的同学们对 MySQL 8.0 的安装部署、体系结构、配置监控、用户管理、主从复制、系统运维、MGR等基础操作和动手实验有了一定的学习基础.很多学员反馈希望更进一步提升技术能力、解决工作中碰到的性能问题。 针对MySQL8.0的数据库性能优…