量化是一种通过降低模型参数的表示精度来减少模型的大小和计算存储需求的方法,如把单精度fp32转化为int8来减少存储和计算成本。

常见的是线性量化,公式 r = S(q-Z),将实数值r映射为量化的整数值q,其中缩放因子S和零点Z根据参数分布统计计算得来。

以下是几种llama.cpp采用的主要量化方法。

1 传统量化方法

Qx_y命名,x是量化位数,比如4、5、6等,y是0或1,0表示对称量化,1表示非对称量化。

对称量化是在正负范围内是对称的,零点是0。

w = q * block_scale

非对称量化允许零点偏移,适应于数据均值非0的情况,因此也比对称量化多一个参数。

w = q * block_scale + block_minimum

每个量化块包含32个权重,量化权重可以通过位移、按位与和乘法来快速解码,对非对称变体还需要加法。

llama.cpp传统量化示例:

Q8_0: 8-bit舍入到最近值量化,每个块32个权重,权重公式:  w = q * block_scale.

Q8_1: 8-bit 舍入到最近值量化,每个块32个权重, 权重公式: w = q * block_scale + block_minimum.

Q4_0: 5-bit舍入到最近值量化,每个块32个权重,权重公式:  w = q * block_scale.

Q4_1: 5-bit 舍入到最近值量化,每个块32个权重, 权重公式: w = q * block_scale + block_minimum.

Q4_0: 4-bit舍入到最近值量化,每个块32个权重,权重公式:  w = q * block_scale.

Q4_1: 4-bit 舍入到最近值量化,每个块32个权重, 权重公式: w = q * block_scale + block_minimum.

2 K系列量化方法

不仅对权重进行量化,还对尺度因子block_scale和零点block_minimum再次进行量化,实现层次化的量化。

每256个权重组成一个超级块,层次化量化过程如下

1)首先以组大小16,对权重进行初始量化,如此1个超级块有256/16=16个尺度因子。

2)对初始尺度因子再次进行量化,得到一个二阶的尺度因子,减少了存储这些辅助信息的空间。

llama.cpp K系列量化示例:

Q8_K: 8位量化,每个超块有256个权重,仅用于量化中间结果,适用于2-6位点积运算,权重公式 w = q * block_scale

Q6_K:  8位量化,超块有16个块组成,每个块16个权重,权重公式 w = q * block_scale(8位),平均每个权重6.5625位。

Q5_K: 5位量化,超块有8个块组成,每个块32个权重,权重公式 w = q * block_scale(6位) + block_minimum(6位),平均每个权重5.5位。

Q4_K: 4位量化,超块有8个块组成,每个块32个权重,权重公式 w = q * block_scale(6位) + block_minimum(6位),平均每个权重4.5位。

Q3_K: 3位量化,超块有16个块组成,每个块16个权重,权重公式 w = q * block_scale(6位) ,平均每个权重3.4375位。

Q2_K: 4位量化,超块有8个块组成,每个块32个权重,权重公式 w = q * block_scale(4位) + block_minimum(4位),平均每个权重2.5625位。

3 IQ系列量化方法

使用了矢量量化和重要性矩阵

1)矢量量化,就是将多个权重视为一个矢量,在高维空间一起量化,捕捉了权重之间的相关性。这些矢量被影射到一个预训练码本(cookbook)中的某个条目,如此条目编号就可以表示一起量化的n个权重,所需空间约为原始权重空间的1/n。

2)重要性矩阵,利用重要性矩阵对权重进行分组,评估每个权重或组的重要性程度,对重要的权重使用更精细和码本或更高的量化精度,对不太重要的权重使用更粗略的码本或更低的量化精度。

这类量化方法还有一些特别后缀,比如M、S、XS、XXS,表示的是码本的精细程度,码本越小,模型的压缩率越大。

llama.cpp IQ系列量化示例:

IQ4_NL: 4位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得。

IQ4_XS: 4位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重4.25位。

IQ3_S: 3位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重3.44位。

IQ3_XXS: 3位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重3.06位。

IQ2_XXS: 2位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重2.06位。

IQ2_S: 2位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重2.5位。

IQ2_XS: 2位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重2.31位。

IQ1_S: 1位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重1.56位。

IQ1_M: 1位量化,每个超块有256个权重,权重通过super_block_sacle和重要性矩阵获得,平均每权重1.75位。

---

llama.cpp

https://github.com/ggml-org/llama.cpp

gguf

https://huggingface.co/docs/hub/gguf

GGUF量化原理详解

https://www.zhihu.com/question/633365088

在mac m1基于llama.cpp运行deepseek

https://blog.csdn.net/liliang199/article/details/149246699

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车级MCU选型新方向:eVTOL垂桨控制监控芯片的替代选型技术分析

摘要:随着eVTOL(电动垂直起降航空器)领域的蓬勃发展,对于高性能、高可靠性的垂桨控制监控芯片的需求日益迫切。本文旨在深入探讨汽车级MCU(微控制单元)在这一新兴领域的应用潜力,以国科安芯推出…

Deepoc具身智能大模型:送餐机器人如何学会“读心术”

Deepoc具身智能大模型:送餐机器人如何学会“读心术”深夜十点的商场火锅店,一台银色机器人正穿越喧闹的人群。当它感知到奔跑的儿童突然变向,驱动轮立即反向微调0.3度;托盘上的牛油锅底因顾客推椅产生晃动,平衡系统瞬间…

学习设计模式《十七》——状态模式

一、基础概念 状态模式的本质是【根据状态来分离和选择行为】。 状态模式的定义:允许一个对象在其内部状态改变时改变它的行为;对象看起来似乎修改了它的类。 认识状态模式序号认识状态模式说明1状态和行为通常指的是对象实例的属性的值;而行…

python的婚纱影楼管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具:Navicat/SQLyog等都可以 随着婚纱…

滤波电路Multisim电路仿真实验汇总——硬件工程师笔记

目录 1 滤波电路基础知识 1.1 滤波电路的分类 1.1.1 按频率选择性分类 1.1.2 按实现方式分类 1.2 滤波电路的设计 1.2.1 确定滤波器类型 1.2.2 计算截止频率 1.2.3 选择滤波阶数 1.2.4 考虑元件参数 1.2.5 仿真验证 1.3 滤波电路的应用 1.3.1 电源滤波 1.3.2 音频…

C++随机打乱函数:简化源码与原理深度剖析

文章目录一、Fisher-Yates洗牌算法核心原理二、std::random_shuffle简化实现与缺陷分析简化源码(核心逻辑)原理层面的致命缺陷三、std::shuffle的现代改进与实现简化源码(核心逻辑)原理层面的关键改进四、随机数生成器工作原理URB…

DBeaver连接MySQL8.0报错Public Key Retrieval is not allowed

DBeaver 链接本地mysql8.0服务报错Public Key Retrieval is not allowed为什么会出现这个错误?MySQL 8.0 默认使用新的认证插件:caching_sha2_password某些客户端(比如老版本的 JDBC 驱动或配置不当的 DBeaver)在连接时&#xff0…

SpringBoot系列—统一功能处理(拦截器)

上篇文章: SpringBoot系列—MyBatis-plushttps://blog.csdn.net/sniper_fandc/article/details/148979284?fromshareblogdetail&sharetypeblogdetail&sharerId148979284&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 拦…

《汇编语言:基于X86处理器》第7章 整数运算(3)

本章将介绍汇编语言最大的优势之一:基本的二进制移位和循环移位技术。实际上,位操作是计算机图形学、数据加密和硬件控制的固有部分。实现位操作的指令是功能强大的工具,但是高级语言只能实现其中的一部分,并且由于高级语言要求与平台无关&am…

应用笔记|数字化仪在医学SS-OCT中的应用

引言近些年来,OCT(光学相干断层扫描,Optical Coherence Tomography)作为一种非破坏性3D光学成像技术逐渐在医学眼科设备中流行起来。OCT可提供实时一维深度或二维截面或三维立体的图像,分辨率可达微米(μm&…

Ubuntu 22.04与24.04 LTS版本对比分析及2025年使用建议

Ubuntu 22.04与24.04 LTS版本对比分析及2025年使用建议 在2025年的技术环境下,Ubuntu 22.04和24.04 LTS各有优势,选择哪一个取决于具体应用场景和用户需求。经过对系统内核、桌面环境、软件生态、生命周期支持等多方面因素的综合分析,本报告将…

Linux进程的生命周期:状态定义、转换与特殊场景

前言 在Linux系统中,进程是资源分配和调度的基本单位,而进程状态则是理解进程行为的关键。从运行中的任务(TASK_RUNNING)到僵尸进程(EXIT_ZOMBIE),每个状态都反映了进程在内核调度、资源等待或父…

神经网络简介

大脑的基本计算单位是神经元(neuron)。人类的神经系统中大约有860亿个神经元,它们被大约10^14-10^15个突触(synapses)连接起来。下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。每…

多路由协议融合与网络服务配置实验(电视机实验)

多路由协议融合与网络服务配置实验文档 一、实验用途和意义 (一)用途 本实验模拟企业复杂网络环境,整合 OSPF、RIPv2 动态路由协议,结合 DHCP、FTP、Telnet 服务配置及访问控制策略,实现多区域网络互联、服务部署与…

在指定conda 环境里安装 jupyter 和 python kernel的方法

在 Conda 的指定环境中安装 Jupyter 和 Python Kernel 是一个常见操作,以下是详细步骤,确保在指定环境中正确配置 Jupyter 和 Python Kernel: 1. 准备工作 确保已安装 Anaconda 或 Miniconda,Conda 环境管理工具可用。确认已创建或计划使用的 Conda 环境。2. 步骤:安装 J…

【数据结构与算法】数据结构初阶:详解顺序表和链表(四)——单链表(下)

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为…

Java+AI精准广告革命:实时推送系统实战指南

⚡ 广告推送的世纪难题 用户反感&#xff1a;72%用户因无关广告卸载APP 转化率低&#xff1a;传统推送转化率<0.5% 资源浪费&#xff1a;40%广告预算被无效曝光消耗 &#x1f9e0; 智能广告系统架构 &#x1f525; 核心模块实现&#xff08;Java 17&#xff09; 1. 实时…

JVM组成及运行流程 - 面试笔记

JVM整体架构 JVM&#xff08;Java Virtual Machine&#xff09;是Java程序运行的核心环境&#xff0c;主要由以下几个部分组成&#xff1a;1. 程序计数器&#xff08;Program Counter&#xff09; 特点&#xff1a;线程私有&#xff0c;每个线程都有独立的程序计数器作用&#…

JavaEE——线程池

目录前言1. 概念2. 线程池相关参数3. Executors的使用总结前言 线程是为了解决进程太重的问题&#xff0c;操作系统中进程的创建和销毁需要较多的系统资源&#xff0c;用了轻量级的线程来代替部分线程&#xff0c;但是如果线程创建和销毁的频率也开始提升到了一定程度&#xf…

3 c++提高——STL常用容器(一)

目录 1 string容器 1.1 string基本概念 1.2 string构造函数 1.3 string赋值操作 1.4 string字符串拼接 1.5 string查找和替换 1.6 string字符串比较 1.7 string字符存取 1.8 string插入和删除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector构造函数…