文章目录
- 【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版本,校准集最贴合
质量通常优于社区二手转换
思考 && 总结
- 量化=精度换体积: FP16压到INT4体积缩至1/4;权重冗余+分组量化+校准集三板斧,让4bit精度损失小到可用。
- GGUF是CPU标准: llama.cpp/Ollama生态专属,单文件打包,Q4_K_M是默认甜点档位。
- GPU推理选AWQ: 激活感知保护1%关键权重,同档精度优于GPTQ,vLLM原生支持;GPTQ胜在社区存量。
- bitsandbytes服务训练:
load_in_4bit是QLoRA微调的显存救星,别拿它做推理部署。 - 选型三问: 跑在CPU还是GPU?推理还是训练?用什么框架?------三个答案一组合,格式自动浮现。
量化解决了"装得下"的问题,接下来的问题是"跑得动"------纯CPU上7B模型能跑到什么速度?llama.cpp是如何把CPU推理优化到极致的?下一篇专门拆解这个CPU推理的王者:llama.cpp。
结尾
各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!
源码骑士 --- Android Framework & 全栈开发
👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长
❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量
⭐ 收藏:把核心知识点存好,在需要时随时查、随时用
💬 评论:分享你的经验或疑问,评论区一起交流避坑
🔄 一键四连:不要忘记给博主"一键四连"哦!
🗡️ 寄语:技术之路难免有困惑,但同行的人会让前进更有方向
结语:量化的哲学是"抓大放小"------保住那1%的关键权重,剩下的放心压缩。看懂GGUF/GPTQ/AWQ/bitsandbytes的分工,模型仓库里那一排后缀从此都是老熟人。不要忘记给博主"一键四连"哦!