106-模型量化技术-GGUF-GPTQ-AWQ-bitsandbytes对比

文章目录

  • 【106.Python+AI】模型量化技术:GGUF、GPTQ、AWQ、bitsandbytes四大量化方案全对比
    • 导入语
    • [1 ~> 量化的数学本质:精度换体积](#1 ~> 量化的数学本质:精度换体积)
      • [1.1 从FP16到INT4](#1.1 从FP16到INT4)
      • [1.2 两个保住精度的关键技术](#1.2 两个保住精度的关键技术)
    • [2 ~> 四大方案逐个拆解](#2 ~> 四大方案逐个拆解)
      • [2.1 GGUF:CPU 世界的标准格式](#2.1 GGUF:CPU 世界的标准格式)
      • [2.2 GPTQ:GPU 推理的老牌劲旅](#2.2 GPTQ:GPU 推理的老牌劲旅)
      • [2.3 AWQ:激活感知的新锐](#2.3 AWQ:激活感知的新锐)
      • [2.4 bitsandbytes:训练场景的御用工具](#2.4 bitsandbytes:训练场景的御用工具)
    • [3 ~> 四方案对比与选型](#3 ~> 四方案对比与选型)
      • [3.1 实测画像对比](#3.1 实测画像对比)
      • [3.2 选型决策树](#3.2 选型决策树)
      • [3.3 三条避坑提示](#3.3 三条避坑提示)
    • [思考 && 总结](#思考 && 总结)
    • 结尾

【106.Python+AI】模型量化技术:GGUF、GPTQ、AWQ、bitsandbytes四大量化方案全对比

📖 文章简介: 本文系统讲解大模型量化的原理与四大主流方案的选型,回答"为什么7B模型4GB显存就能跑"这个每个本地部署者都会遇到的问题。文章从量化的数学本质切入------把FP16的16位浮点权重压缩成INT4的4位整数,模型体积直接缩到1/4,而精度损失为什么可以忽略不计;用"图书馆藏书从精装本变口袋本"的类比讲清量化粒度(per-channel/group量化)与校准集的作用;随后逐一拆解四大方案:GGUF(llama.cpp生态标准格式,CPU推理首选,Q4_K_M等后缀的含义解读)、GPTQ(GPU推理老牌方案,逐层量化的代表,AutoGPTQ生态)、AWQ(激活感知量化,保护关键权重的新锐,vLLM原生支持)、bitsandbytes(训练场景御用,QLoRA微调的8bit/4bit加载方案);给出四方案在推理速度、精度损失、硬件要求、适用框架上的实测对比表,以及"CPU推理选GGUF、GPU推理选AWQ、微调选bitsandbytes"的选型决策树。配以Mermaid流程图展示从原始模型到量化部署的完整路径,适合本地部署时被各种量化格式绕晕的开发者阅读参考。


🎬 个人主页: 源码骑士

专栏传送门: 《Android开发基础》《python基础课程》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介:

5年Android Framework系统开发经验,曾主导多项系统级性能优化专项

技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)

累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"


导入语

上一篇我们用Ollama拉起了qwen2.5:7b,下载体积4.7GB。等等------7B模型,70亿参数,就算每个参数只占2字节(FP16),也应该是14GB才对,怎么下载包只有三分之一?

答案就是模型页面上那串神秘后缀:Q4_K_M、GGUF、AWQ......它们都是"量化"的产物。 量化把每个参数的存储精度从16位砍到4位,体积缩到四分之一,显存需求同步跳水------原本要24GB显卡才带得动的模型,压缩后8GB就能跑,而且聪明程度几乎不打折。

但打开模型仓库,GGUF/GPTQ/AWQ十几种格式、Q2到Q8一排档位,新手直接懵圈:它们有什么区别?我该下载哪一个? 这篇文章把量化从数学原理到方案选型一次讲透,看完你就能对着模型列表像老师傅一样点兵点将。


1 ~> 量化的数学本质:精度换体积

1.1 从FP16到INT4

bash 复制代码
一个参数的存储变迁:

FP16(半精度浮点):16位 = 2字节
  能表示 ±65504 范围内的精细数值
  7B模型 × 2字节 = 14GB

INT4(4位整数量化):4位 = 0.5字节
  只能表示 16 个离散刻度
  7B模型 × 0.5字节 = 3.5GB   ← 缩到 1/4

直觉上,16个刻度表示原来几万个精度值,信息应该损失惨重。但大模型有个反直觉的特性:权重值高度冗余 ------绝大部分权重挤在一个很小的数值区间里,真正影响输出的差异远比想象的小。量化的艺术就在于:用有限的刻度,保住最关键的数值差异。

1.2 两个保住精度的关键技术

bash 复制代码
技术一:分组量化(group-wise)
  不给整个矩阵用一把尺子,每128个权重一组、每组各配一组缩放系数
  → 刻度跟着局部数值范围走,误差大幅缩小

技术二:校准(calibration)
  量化前用一小批代表性文本跑一遍模型,统计真实的数值分布
  → 刻度照着"实际会遇到的值"来排,而不是理论范围

这两条是所有现代量化方案的公共地基------GGUF、GPTQ、AWQ的差异,是在地基之上"怎么更聪明地保护重要权重"。


2 ~> 四大方案逐个拆解

2.1 GGUF:CPU 世界的标准格式

bash 复制代码
定位:llama.cpp 生态的专属格式,CPU/混合推理的首选
特长:单文件打包(权重+配置+词表一体),极致的CPU优化

命名解读(以 Q4_K_M 为例):
  Q4   → 4位量化
  K    → K-quants系列(新一代分组算法)
  M    → Medium,组内精度档位(S/M/L从小到大)

常用档位速查:
  Q4_K_M → 体积/质量最平衡,默认就选它
  Q5_K_M → 质量略好,体积+20%
  Q8_0   → 几乎无损,体积约为FP16一半
  Q2_K   → 极限压缩,质量明显下降,仅救急

2.2 GPTQ:GPU 推理的老牌劲旅

bash 复制代码
定位:最早的实用化GPU量化方案,AutoGPTQ生态成熟
原理:逐层量化,每量化一层就用校准数据修正剩余层的误差
     → 误差被逐层"分摊消化",4bit下精度依然稳

特点:GPU上推理快,与Transformers/vLLM生态打通
短板:只推理不训练;更新锐的AWQ出现后排位下滑

2.3 AWQ:激活感知的新锐

bash 复制代码
定位:激活感知量化(Activation-aware Weight Quantization)
核心洞察:模型里只有约1%的权重对输出影响巨大
  → 找出这1%的"关键权重",给它们保留更高精度
  → 其余99%放心压到4bit
效果:同档位下精度普遍优于GPTQ,尤其在小模型上差距明显
生态:vLLM原生支持,生产推理框架的宠儿

2.4 bitsandbytes:训练场景的御用工具

bash 复制代码
定位:不换格式、不改文件,加载时即时量化
用法:from_pretrained(..., load_in_4bit=True)
场景:QLoRA微调的事实标准(第79篇用过)
     → 基座4bit加载省显存,LoRA适配器FP16训练
注意:它服务的是"训练时省显存",不是推理格式
     推理部署别选它,速度不如前三个专用格式

3 ~> 四方案对比与选型

3.1 实测画像对比

维度 GGUF GPTQ AWQ bitsandbytes
主战场 CPU/混合推理 GPU推理 GPU推理(新锐) 训练时加载
配套框架 llama.cpp/Ollama AutoGPTQ vLLM/Transformers Transformers/PEFT
4bit精度 中上 中上 中上
推理速度 CPU上最快 最快 一般
模型可得性 社区转换最全 越来越多 任意模型即时量化

3.2 选型决策树

#mermaid-svg-aAtIT9YtneRCZse7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aAtIT9YtneRCZse7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aAtIT9YtneRCZse7 .error-icon{fill:#552222;}#mermaid-svg-aAtIT9YtneRCZse7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aAtIT9YtneRCZse7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aAtIT9YtneRCZse7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aAtIT9YtneRCZse7 .marker.cross{stroke:#333333;}#mermaid-svg-aAtIT9YtneRCZse7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aAtIT9YtneRCZse7 p{margin:0;}#mermaid-svg-aAtIT9YtneRCZse7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aAtIT9YtneRCZse7 .cluster-label text{fill:#333;}#mermaid-svg-aAtIT9YtneRCZse7 .cluster-label span{color:#333;}#mermaid-svg-aAtIT9YtneRCZse7 .cluster-label span p{background-color:transparent;}#mermaid-svg-aAtIT9YtneRCZse7 .label text,#mermaid-svg-aAtIT9YtneRCZse7 span{fill:#333;color:#333;}#mermaid-svg-aAtIT9YtneRCZse7 .node rect,#mermaid-svg-aAtIT9YtneRCZse7 .node circle,#mermaid-svg-aAtIT9YtneRCZse7 .node ellipse,#mermaid-svg-aAtIT9YtneRCZse7 .node polygon,#mermaid-svg-aAtIT9YtneRCZse7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aAtIT9YtneRCZse7 .rough-node .label text,#mermaid-svg-aAtIT9YtneRCZse7 .node .label text,#mermaid-svg-aAtIT9YtneRCZse7 .image-shape .label,#mermaid-svg-aAtIT9YtneRCZse7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-aAtIT9YtneRCZse7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aAtIT9YtneRCZse7 .rough-node .label,#mermaid-svg-aAtIT9YtneRCZse7 .node .label,#mermaid-svg-aAtIT9YtneRCZse7 .image-shape .label,#mermaid-svg-aAtIT9YtneRCZse7 .icon-shape .label{text-align:center;}#mermaid-svg-aAtIT9YtneRCZse7 .node.clickable{cursor:pointer;}#mermaid-svg-aAtIT9YtneRCZse7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aAtIT9YtneRCZse7 .arrowheadPath{fill:#333333;}#mermaid-svg-aAtIT9YtneRCZse7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aAtIT9YtneRCZse7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aAtIT9YtneRCZse7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aAtIT9YtneRCZse7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aAtIT9YtneRCZse7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aAtIT9YtneRCZse7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aAtIT9YtneRCZse7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aAtIT9YtneRCZse7 .cluster text{fill:#333;}#mermaid-svg-aAtIT9YtneRCZse7 .cluster span{color:#333;}#mermaid-svg-aAtIT9YtneRCZse7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aAtIT9YtneRCZse7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aAtIT9YtneRCZse7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-aAtIT9YtneRCZse7 .icon-shape,#mermaid-svg-aAtIT9YtneRCZse7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aAtIT9YtneRCZse7 .icon-shape p,#mermaid-svg-aAtIT9YtneRCZse7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aAtIT9YtneRCZse7 .icon-shape .label rect,#mermaid-svg-aAtIT9YtneRCZse7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aAtIT9YtneRCZse7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aAtIT9YtneRCZse7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aAtIT9YtneRCZse7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CPU推理/笔记本/无显卡
GPU在线推理服务

否, Transformers推理
QLoRA微调训练
边缘设备/手机
需要量化模型
用在什么场景?
GGUF

选 Q4_K_M 档位

配 llama.cpp/Ollama
框架是vLLM?
AWQ

vLLM原生支持

同档精度最优
AWQ优先

GPTQ备选

社区存量大
bitsandbytes

load_in_4bit

基座4bit+适配器FP16
GGUF 低档量化

Q4以下甚至IQ系列

配合ARM优化

3.3 三条避坑提示

bash 复制代码
提示一:不要盲目追低档位
  Q2/Q3省的那点显存,换来的质量下降肉眼可见
  4bit是甜点,3bit是底线,2bit只用于极限场景

提示二:同一模型不同格式的答案可能有细微差异
  量化是有损的,换格式≈换了个"几乎一样"的模型
  做A/B评测时锁定同一格式同一档位

提示三:先看官方是否提供原生量化版
  Qwen等厂商官方发布的AWQ/GPTQ版本,校准集最贴合
  质量通常优于社区二手转换

思考 && 总结

  1. 量化=精度换体积: FP16压到INT4体积缩至1/4;权重冗余+分组量化+校准集三板斧,让4bit精度损失小到可用。
  2. GGUF是CPU标准: llama.cpp/Ollama生态专属,单文件打包,Q4_K_M是默认甜点档位。
  3. GPU推理选AWQ: 激活感知保护1%关键权重,同档精度优于GPTQ,vLLM原生支持;GPTQ胜在社区存量。
  4. bitsandbytes服务训练: load_in_4bit是QLoRA微调的显存救星,别拿它做推理部署。
  5. 选型三问: 跑在CPU还是GPU?推理还是训练?用什么框架?------三个答案一组合,格式自动浮现。

量化解决了"装得下"的问题,接下来的问题是"跑得动"------纯CPU上7B模型能跑到什么速度?llama.cpp是如何把CPU推理优化到极致的?下一篇专门拆解这个CPU推理的王者:llama.cpp。


结尾

各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!

源码骑士 --- Android Framework & 全栈开发

👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长

❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量

收藏:把核心知识点存好,在需要时随时查、随时用

💬 评论:分享你的经验或疑问,评论区一起交流避坑

🔄 一键四连:不要忘记给博主"一键四连"哦!

🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向

结语:量化的哲学是"抓大放小"------保住那1%的关键权重,剩下的放心压缩。看懂GGUF/GPTQ/AWQ/bitsandbytes的分工,模型仓库里那一排后缀从此都是老熟人。不要忘记给博主"一键四连"哦!

相关推荐
御风之翼_唤星者1 小时前
LoadFramePackModel模块报错bad escape
python·ai
民乐团扒谱机1 小时前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
小白勇闯网安圈2 小时前
Django Ajax、批量操作与分页实践
python·django
Logintern092 小时前
Langgraph使用MemorySaver建立有记忆的图
开发语言·windows·python
Uncommon.3 小时前
使用pandas处理csv并转为张量
pytorch·python·深度学习·pandas
上玄code3 小时前
【Agent精讲】调一个LLMAPI背后的工程问题
java·开发语言·python·chatgpt
Uncommon.3 小时前
使用Pytorch操作张量(多维数组)
人工智能·pytorch·python
码云骑士3 小时前
105-Ollama本地部署-Llama3-Qwen2-Modelfile-REST-API
python
晚安code3 小时前
MCP Server 开发入门:手把手写一个能跑的 Server,三种协议怎么选
python·ai编程