模型压缩之量化详解

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

【模型压缩】量化(Quantization)详解:从原理到 BERT 实战压缩

量化概念图

一句话总结:量化就是把模型的 FP32 高精度参数"降级"成 INT8 低精度整数,在精度几乎不掉的前提下,让模型体积缩小约 4 倍、推理速度大幅提升。

本文是黑马《文本分类实战项目》系列笔记之一。项目里用到的 BERT 模型,经过量化后体积从 390M 降到 145M、CPU 推理速度从 66ms 提升到 23ms,而精度只掉了不到 1 个百分点——量化为什么这么神奇?下面从原理到代码一步步讲透。

一、为什么需要模型压缩

先看一个真实的痛点。在文本分类项目里,我们训练了 4 种方案:随机森林、fasttext、BERT、LLM+Prompt,它们的"体积 + 响应时间"对比如下:

方案本地模型体积响应时间
随机森林1.47G(pkl)32ms 左右
fasttext800M 左右(bin)1ms 左右
BERT 预训练+微调390M(pt)CPU 60ms / GPU 25ms
LLM+Prompt无需本地存储(远程调用)1300ms 左右

BERT 精度最高(0.93 左右),但 390M 的体积在 CPU 上跑一次要 60ms。如果要把模型部署到移动端、嵌入式设备,或者要支撑高并发的线上服务,这个体积和速度就是瓶颈。

模型压缩的意义:在模型精度不受太大影响的情况下,尽可能让模型变得更小、更简单,最终提升推理速度。

BERT 模型压缩常见的有四种方式:

模型压缩

模型量化

模型蒸馏

模型剪枝

低秩分解

FP32 → INT8
大模型变小数

教师模型
→ 学生模型

移除冗余权重
完整 → 残缺

大矩阵拆成
小矩阵相乘

本篇文章只聚焦第一个方向:模型量化

二、什么是量化

2.1 一个形象的比喻:高清 → 模糊

可以把模型量化理解成"高清图片变模糊图片":

高清与模糊对比图

  • 高清图(FP32):每个像素用 32 位浮点数表示,信息丰富,但文件大。
  • 模糊图(INT8):每个像素只用 8 位整数表示,细节少了一些,但文件小、加载快。

人眼(模型的精度)几乎察觉不到模糊带来的差异,但文件体积(存储)和加载速度(推理)改善巨大——量化就是这个思路。

2.2 量化的正式定义

量化是模型压缩的技术之一,在对模型性能影响不大的情况下,尽可能减小模型参数的存储空间(float32 → qint8),最终提升推理速度。

关键点拆开看:

  1. 存储空间变小:FP32 每个参数占 4 字节,INT8 每个参数占 1 字节,理论上体积直接缩小 4 倍
  2. 计算变快:整数运算比浮点运算快,而且 INT8 能充分利用 CPU 的 SIMD 指令(如 AVX512)和专用加速硬件。
  3. 精度损失可控:通过合理的量化策略,精度下降可以控制在 1 个百分点以内。

2.3 量化的数学原理

量化的本质是:用一个缩放因子(scale)和零点(zero_point),把连续的浮点数映射到离散的整数区间

对称量化:正负范围对称,零点固定为 0,公式最简单:

q = round(r / scale)
scale = max(|r_max|, |r_min|) / 127

非对称量化:不要求对称,多了一个零点偏移,能充分利用 0~255 的全部范围,对分布不均匀的数据更友好:

q = round(r / scale + zero_point)

反量化(推理时把 INT8 结果还原成浮点)就是上面的逆运算:

FP32 权重
4 字节

× scale + zero_point
(量化)

INT8 整数
1 字节

存储 / 矩阵计算

(反量化)
r = scale × (q - zero_point)

FP32 输出

精度损失主要来自 round()舍入误差——这也是量化感知训练(QAT)存在的意义:让模型在训练时就学会适应这种舍入误差。

三、三种主流量化方式

根据"量化的时机"和"量化哪些东西",常见的有三种方式:

三种量化方式示意图

训练后

训练中

QAT 量化感知训练
前向/反向传播中插入伪量化节点
模拟 INT8 舍入误差

DQ 动态量化
只量化权重
激活动态计算
无需校准数据

PTQ 静态量化
权重 + 激活都量化
需要校准数据集
统计激活动态范围

精度最高、成本最高

最简单、省心、只对权重生效

性价比最高、推理最快

3.1 DQ:动态量化(训练后,最简单)

  • 核心思想:训练结束后,在推理时动态地把权重从 FP32 实时转成 INT8 计算,算完再转回 FP32。
  • 特点:只量化权重,激活值(每层的输入输出)推理时动态计算,所以叫"动态"。
  • 优点:不需要校准数据集,不需要重新训练,一行 API 搞定。
  • API
import torch

# 只量化指定的层类型(线性层、Embedding 层)
quantized_model = torch.quantization.quantize_dynamic(
    model,                            # 原始 FP32 模型
    {torch.nn.Linear, torch.nn.Embedding},  # 要量化的层
    dtype=torch.qint8                 # 量化成 8 位整数
)

⚠️ 注意:设备必须是 CPU。 PyTorch 原生的 torch.quantization 只支持 CPU 推理。

3.2 PTQ:静态量化(训练后,性价比最高)

  • 核心思想:训练结束后,准备一个小型的校准数据集(几百条样本就够),输入模型做前向传播,预先统计每一层激活值的动态范围(最大值、最小值),算出最优的量化缩放参数。这个过程叫校准
  • 特点:校准完成后,权重和激活值都被量化成 INT8,推理时省去了动态转换的开销,速度比 DQ 更快。
  • 步骤prepare(插入量化节点)→ 喂校准数据 → convert(真正量化)。
import torch

model.eval()

# 1. 配置量化方式(fbgemm 面向 x86 CPU;qnnpack 面向 ARM)
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')

# 2. 插入量化节点,准备校准
torch.quantization.prepare(model, inplace=True)

# 3. 用校准数据集前向传播,统计激活值范围
with torch.no_grad():
    for texts, labels in calibration_dataloader:  # 几百条数据即可
        model(texts)

# 4. 真正执行量化
torch.quantization.convert(model, inplace=True)

3.3 QAT:量化感知训练(训练中,精度最高)

  • 核心思想:在模型训练/微调阶段,就在网络的前向和后向传播中插入伪量化节点(Fake Quantize)。它模拟了 INT8 量化带来的数值截断和舍入误差,让模型在训练过程中就"学会"适应这种精度损失。
  • 特点:训练完成后,把这些伪量化节点替换为真正的量化算子,导出 INT8 模型。因为误差被提前纳入训练,精度损失最小,有时甚至能略高于原始 FP32 模型
  • 代价:需要重新训练/微调,成本最高。
import torch

model.train()
# 1. 使用 QAT 专用的 qconfig
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')

# 2. 准备 QAT(把普通层替换为带伪量化节点的层)
torch.quantization.prepare_qat(model, inplace=True)

# 3. 正常训练/微调若干轮次(伪量化节点模拟 INT8 误差)
for epoch in range(epochs):
    for texts, labels in dataloader:
        loss = criterion(model(texts), labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

# 4. 训练完转成真正的 INT8 模型
model.eval()
torch.quantization.convert(model, inplace=True)

3.4 三种方式横向对比

对比维度DQ 动态量化PTQ 静态量化QAT 量化感知训练
量化时机训练后训练后训练中
是否需要校准数据❌ 不需要✅ 需要(几百条)❌ 不需要
是否需要重新训练❌ 不需要❌ 不需要✅ 需要
量化对象只量化权重权重 + 激活权重 + 激活
推理速度较快最快最快
精度损失较小损失可控损失最小(甚至更高)
实现成本极低(一行 API)
适用场景快速部署、模型以线性层为主追求推理速度的线上服务精度敏感、能接受重训练

四、CPU 与 GPU 怎么选

很多人以为量化只跟 GPU 有关,其实恰恰相反:

  • CPU 是量化的主战场:PyTorch 原生 torch.quantization 只支持 CPU 推理,配合 AVX512 等指令集,INT8 能获得显著加速。
  • GPU 上 PyTorch 原生不支持 PTQ:NVIDIA 显卡请用 Torch-TensorRT,流程是:
    1. 校准:用 modelopt.torch.quantization 在 GPU 上跑一遍校准数据,插入伪量化节点;
    2. 编译:用 torch_tensorrt.compile 把模型编译成 TensorRT 引擎,获得真正的 INT8 加速。

这也是为什么很多项目里"量化后 GPU 反而没变快甚至变慢"——没有对应的 INT8 kernel 和引擎,量化转换反而增加了额外开销。

五、实战:BERT 文本分类模型量化

5.1 项目背景

在《文本分类实战项目》中,我们训练了 BERT 模型做新闻标题分类(训练数据 18w,10 个类别),基线精度 0.93 左右。模型以 torch.nn.Lineartorch.nn.Embedding 层为主,非常适合做动态量化。

5.2 动态量化完整代码

import torch

# 加载训练好的 FP32 BERT 模型
model = torch.load(config.bert_model_path, map_location='cpu')
model.eval()

# 动态量化:一行 API,量化 Linear 和 Embedding 层
quantized_model = torch.quantization.quantize_dynamic(
    model,
    {torch.nn.Linear, torch.nn.Embedding},
    dtype=torch.qint8
)

# 保存量化后的模型(145M)
torch.save(quantized_model, config.bert_quantized_model_path)

5.3 量化效果对比(项目实测数据)

对比项量化前(FP32)量化后(INT8)变化
精度0.93降低不到 1 个百分点基本无损
模型体积390M145M减小约 63%
CPU 推理速度0.066 秒0.023 秒快约 3 倍
GPU 推理速度23ms23ms 左右无明显变化甚至更慢

5.4 结果分析

  1. 精度几乎不掉:文本分类任务对数值精度不敏感,0.93 → 0.92+,完全可接受。
  2. 体积大幅缩小:390M → 145M,部署到服务器、内存占用都友好很多。
  3. CPU 加速明显:66ms → 23ms,因为 CPU 的 INT8 指令集发挥了作用。
  4. GPU 没有加速:PyTorch 原生量化没有生成 GPU 上的 INT8 kernel,转换开销反而可能拖慢速度。如果想要 GPU 加速,需要走 Torch-TensorRT 路线。

💡 经验总结:CPU 部署、追求体积和速度 → 量化首选;GPU 部署 → 优先考虑蒸馏或 TensorRT 量化。

六、总结

知识点一句话记忆
量化的本质FP32 → INT8,用 4 倍体积压缩换轻微精度损失
DQ 动态量化训练后,只量化权重,一行 API,最省心
PTQ 静态量化训练后,权重+激活都量化,需要校准数据,性价比最高
QAT 量化感知训练训练中插入伪量化节点,精度最高,成本最高
CPU vs GPU原生量化只支持 CPU;GPU 走 Torch-TensorRT
本项目效果390M → 145M,CPU 66ms → 23ms,精度不掉 1 个点

模型量化是部署环节的"神技",但它不是万能的:精度敏感的模型建议用 QAT 或蒸馏,追求 GPU 极致加速建议用 TensorRT。下一篇可以继续聊聊模型蒸馏(教师模型 → 学生模型,本项目把它压到了 25.3M),感兴趣的同学关注一下。

七、面试常问

  1. 量化的原理是什么? 通过 scale 和 zero_point 把 FP32 浮点数映射到 INT8 整数,用舍入误差换体积和速度。
  2. DQ、PTQ、QAT 的区别? 时机不同(训练后/训练后/训练中)、量化对象不同(权重/权重+激活/权重+激活)、成本和精度不同。
  3. 为什么量化后 GPU 没有加速? PyTorch 原生量化没有 GPU 的 INT8 kernel,需要 TensorRT 等引擎支持。
  4. 什么时候用蒸馏而不是量化? 对精度极度敏感、且能接受重训练成本时,蒸馏(本项目压到 25.3M)通常比量化体积更小。

本文数据来源于《文本分类实战项目》实际训练与部署记录,图片为示意配图。

TensorFlow模型压缩量化与剪枝技术详解 你是否遇到过这样的场景?用Python训练了一个准确率95%的图像分类模型,但想部署到手机APP时,发现模型文件500MB太大无法下载,或者手机CPU跑一次推理要2秒,用户等得不耐烦?本文的目的就是解决这类问题:通过TensorFlow提供的模型压缩技术(量化+剪枝),将大模型“瘦身”到原来的1/4甚至更小,同时尽量保持准确率,最终实现在手机、嵌入式设备等“小身材”硬件上流畅运行。本文覆盖从基础概念到实战代码的全流程,适合从入门到进阶的开发者。 阅读详情

相关推荐

AI模型压缩中的量化技术详解:INT8量化实战教程

内存限制:FP32模型每参数占4字节,2500万参数需约100MB内存,部分设备无法容纳;计算耗时:FP32矩阵乘法需大量浮点运算,手机CPU/GPU处理速度受限;功耗过高:浮点运算能耗是整数运算的数倍,影响设备续航。本文聚焦解决这些问题的核心技术——INT8量化,覆盖从原理到实战的全流程。本文先通过生活案例解释量化本质,再用数学公式拆解量化过程,接着用PyTorch实现INT8量化实战,最后总结实际应用场景与未来趋势。PyTorch通过。

AIGC应用创新大全的博客 930

DamoFD-0.5G模型量化压缩技术详解

本文介绍了如何在星图GPU平台上一键自动化部署DamoFD人脸检测关键点模型-0.5G镜像,实现高效的人脸检测与关键点定位。该量化压缩模型适用于移动端和边缘设备的实时人脸识别应用,如智能安防、人脸解锁等场景,显著提升推理速度并降低资源消耗。

weixin_42522857的博客 21

Chord模型量化压缩技术详解

本文介绍了Chord视频时空理解模型量化压缩技术,以解决其部署时面临的体积与速度挑战。用户可在星图GPU平台上自动化部署该镜像,快速搭建高效的视频分析环境。压缩后的模型能显著提升处理效率,典型应用于智能安防监控、短视频内容理解等需要实时视频分析的场景。

weixin_32287387的博客 351

一文详解模型压缩四剑客:量化、剪枝、蒸馏、二值化

随着深度学习的飞速发展,模型的规模和复杂度也在不断攀升。以 GPT-175B 为例,它拥有 1750 亿参数,至少需要 320GB 的半精度(FP16)格式存储空间,推理时至少需要五个 A100 GPU,每个 GPU 配备 80GB 内存。如此庞大的模型虽然性能强大,但对硬件资源的要求极高,极大地限制了其在实际场景中的应用。例如,在嵌入式设备、移动设备等资源受限的环境中,这些设备的算力和内存有限,无法直接运行如此庞大的模型

2301_76168381的博客 2378

模型压缩量化技术GPTQ与AWQ原理详解

模型里的大数字(比如 16 位浮点数)换成小数字(比如 4 位整数),让模型体积缩小好几倍,跑得更快,显存占用更少。# 自定义校准数据——使用你实际业务场景的文本# 这样量化出来的模型在你的场景下效果更好"你的业务文本1...","你的业务文本2...","你的业务文本3...",# 建议准备 128~256 条,覆盖你的使用场景# 传入自定义校准数据tokenizer,calib_data=custom_calib_data, # 关键:传入自定义数据。

qq_44803615的博客 358

模型压缩:剪枝与量化技术详解

量化方法包括训练后量化量化感知训练。训练后量化直接对训练好的模型进行量化,可能引入性能损失。量化感知训练在训练过程中模拟量化效果,生成更适应低精度表示的模型。实验表明,结合剪枝和量化可将模型大小减少10倍以上,计算速度提升2-4倍,精度损失控制在1%以内。剪枝流程包括训练原始模型、评估参数重要性、剪枝不重要参数、微调模型。常用的量化策略有对称量化、非对称量化、逐层量化和逐通道量化。先剪枝减少参数数量,再量化降低参数精度,能在保持模型性能的同时实现高效压缩。实施量化时,推荐使用量化感知训练,减少精度损失。

2501_94073026的博客 341

BGE Reranker-v2-m3模型量化压缩技术详解

本文介绍了如何在星图GPU平台上自动化部署BGE Reranker-v2-m3重排序系统镜像,实现高效的文本重排序功能。通过量化压缩技术,该镜像在保持高精度的同时大幅降低资源消耗,适用于搜索引擎、推荐系统等需要快速响应和多语言处理的场景,提升用户体验和部署效率。

weixin_33608403的博客 475

模型压缩技术详解:剪枝、量化与知识蒸馏,让你的大模型量化部署

本文系统介绍了深度学习模型压缩的三大核心技术:剪枝通过移除冗余连接减少参数;量化降低数值精度实现存储压缩;知识蒸馏采用"教师-学生"模式让大模型指导小模型学习。文章还详细阐述了技术组合的最佳顺序:知识蒸馏→剪枝→量化,帮助优化模型实现更小尺寸、更快推理速度和边缘设备部署能力。

weixin_55154866的博客 940

Local AI MusicGen模型量化压缩技术详解

本文介绍了在星图GPU平台上自动化部署🎵 Local AI MusicGen镜像的方法,并详解了其模型量化压缩技术。通过量化技术,该模型可在消费级显卡上高效运行,核心应用场景是让用户根据文本描述在本地快速生成个性化的AI音乐,极大降低了AI音乐创作的门槛。

weixin_36431145的博客 312

如何将Llama 2 7B-hf模型从16GB压缩到4GB:终极量化技术详解

想要在个人电脑上运行Llama 2 7B-hf大语言模型却苦于16GB的巨大存储需求?🤔 本文将为你揭秘**Llama 2 7B-hf模型压缩技术**,教你如何通过先进的量化方法将模型大小从16GB大幅缩减到仅4GB!这种**模型量化技术**不仅能节省大量存储空间,还能显著提升推理速度,让普通用户也能轻松部署和使用这个强大的AI模型。 ## 📊 为什么需要模型压缩? 大型语言模型如Llam

gitblog_00337的博客 636

PaddleClas模型压缩实战:量化与剪枝技术详解

在深度学习模型部署过程中,我们常常面临模型体积过大、计算量过高的问题。PaddleClas作为飞桨的图像分类套件,提供了完整的模型压缩解决方案。本文将深入讲解如何使用PaddleSlim对PaddleClas模型进行量化和剪枝,帮助开发者打造更轻量、更高效的分类模型。 ## 模型压缩基础概念 ### 模型量化 模型量化是指将模型参数和激活值从32位浮点数(FP32)转换为8位整数(INT8)...

gitblog_01042的博客 392

EasyAnimateV5-7b-zh-InP模型量化压缩技术详解

本文介绍了如何在星图GPU平台上自动化部署EasyAnimateV5 - 7b - zh - InP/7B 参数量图生视频模型,实现高效图生视频生成。通过内置量化支持(如INT8与qfloat8),用户可在A10等主流显卡上快速部署该模型,典型应用于电商产品展示视频、社交媒体动态内容等场景,兼顾生成质量与推理效率。

weixin_34640289的博客 300

YOLOv8优化实战:模型量化压缩技术详解

本文介绍了基于星图GPU平台自动化部署“鹰眼目标检测 - YOLOv8”镜像的实践方法,重点解析了模型量化压缩技术在工业级CPU环境中的应用。通过INT8量化显著降低模型体积与推理延迟,适用于安防、智能制造等场景下的高效目标检测与AI应用开发,实现轻量级、高响应的部署效果。

weixin_34520664的博客 246

Retinaface+CurricularFace模型量化压缩技术详解

本文详解了Retinaface+CurricularFace人脸识别模型量化压缩技术,旨在优化模型以部署于资源受限的边缘设备。借助星图GPU平台,用户可自动化部署该优化后的镜像,轻松实现高效、低延迟的本地人脸识别应用,例如智能门禁或考勤系统。

weixin_33608403的博客 429

PaddleClas模型压缩技术详解:剪枝与量化算法解析

在深度学习模型的实际部署中,我们常常面临计算资源受限、存储空间不足等问题。PaddleClas作为强大的图像分类工具库,提供了模型剪枝(Pruning)和量化(Quantization)两大核心技术,可有效压缩模型大小、提升推理速度。本文将深入解析PaddleClas中采用的FPGM剪枝算法和PACT量化算法,帮助开发者理解原理并应用于实际场景。 ## 一、模型压缩的必要性 深度学习模型通常存...

gitblog_01039的博客 576

PP-DocLayoutV3模型量化压缩技术详解

本文介绍了如何在星图GPU平台上自动化部署PP-DocLayoutV3新一代统一布局分析引擎镜像,实现高效的文档布局分析。通过该平台,用户可以快速部署该镜像,应用于智能文档处理场景,如自动化提取和解析复杂文档的布局结构,提升文档数字化处理效率。

weixin_42163404的博客 285

Magma模型压缩实战:量化与剪枝技术详解

本文介绍了如何在星图GPU平台自动化部署Magma多模态AI智能体基础模型镜像,并重点解析了其模型压缩技术。通过量化与剪枝等优化方法,显著降低模型资源需求,使其能高效应用于图片生成、视频内容制作等实际场景,提升多模态AI应用的部署效率与可及性。

weixin_36474966的博客 414
上一篇: NLP预处理Python内置函数_03_统计建词表与完整实战
下一篇: MoE路由机制详解_CSDN文章
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值