Int 4量化用于目标检测 【GiantPandaCV】文章2019 CVPR,讲的是Int 4量化用于目标检测,主要是工程化的一些trick。 2、用小的训练数据集去调整(activation)激活函数的阈值(要clip的阈值),用百分比的方法丢弃离群值和截断量化的激活函数值和梯度。3、对所有的参数,采用channel-wise的量化。 bit,且没有浮点数的操作 一些细节:1、mapping scheme采用均匀分布的量化策略,且是非对称量化,就是有zero-point。 都进行量化。 Int4量化与全精度对比 ? 消融实验 ? FreezeBN与不同bit的对比 ? 截断激活函数阈值的百分比 ? 与其他量化方法的对比图
本文将基于我在多个实际项目中的量化实践经验,深入剖析INT8和INT4量化技术的原理、实现方法和性能表现。 INT4量化的极限压缩探索3.1 INT4量化的挑战与机遇INT4量化将模型压缩推向了极限,但也带来了更大的精度挑战:class INT4Quantizer: """INT4量化器 - 实现4位量化 INT4量化中的关键技术,通过将权重分成小组并为每组计算独立的量化参数,可以显著提高量化精度。 实战案例:大模型量化部署7.1 LLaMA-7B量化实战def quantize_llama_7b_production(): """LLaMA-7B生产环境量化实战""" # 模型加载 量化优化关键词标签#模型量化 #INT8量化 #INT4量化 #推理优化 #AI部署
俗话说,“有钱能使鬼推磨”,这话虽然说有点夸张,不过已经是把金钱的力量描绘得非常清楚了。绝大部分人都是趋利的,所以在我看来,“利”是驱动人们协作、交互、杀伐的最基本动机,也是驱动世界运动的核心动力。只不过广义的“利”这个东西不仅仅是金钱这么简单——有的人可能被自己所信服的大义所打动,有的人可能为了自己追求的某种癖好而耗尽毕生心血,很显然刚刚说的这两样东西都不是简单用货币能衡量清楚的。为了讨论方便一些,我们现在还是指说能够用货币衡量的,商业环境下的,常态的买卖行为好了。
在Lucene中引入Int4量化 在我们之前的博客中,我们详细介绍了Lucene中标量量化的实现。我们还探讨了两种特定的量化优化。 现在,我们来探讨这个问题:在Lucene中,int4 量化是如何工作的,以及它是如何对齐的? 存储和评分量化向量 Lucene将所有向量存储在一个平面文件中,使得可以根据某个序号检索每个向量。 你可以在我们的之前的标量量化博客中阅读这方面的简要概述。 现在,int4为我们提供了比之前更多的压缩选项。它将量化空间减少到只有16个可能的值(0到15)。 图3显示了相同的向量,但是使用那个静态设置的置信区间进行标量量化。 图2:CohereV3维度值的样本。 图3:CohereV3维度值量化为int7值。那些在末尾的尖峰是什么? 网格搜索找到的分位数是量化得分误差与先前计算的真实10个最近邻的决定系数最大化的。 图3:Lucene搜索置信区间空间,并测试int4量化的各种桶。
超迷你口袋秤(对应 INT4 量化模型) 量程:-8 ~ 7,有符号 INT4,共 16 个整数刻度;特点:小巧轻便,但刻度极少,误差比 INT8 大【存储、显存减少 87.5%,需校准优化才能控误差】 3.1.1 INT4 缩放核心作用:把电子秤的大范围(0~200kg),等比例映射到 INT4 秤的小范围(-8~7)。 计算公式:scale = 原始数据范围/量化后整数范围 = (200-0)/(7-(-8))=200/15≈ 13.33结果解释:INT4 口袋秤的 1 个刻度,对应电子秤的 13.33kg。 比特数直接决定了整数能够表示的范围大小和离散精度,这就像不同精度的尺子:4.1 INT4(4位整数) 则像一把简易直尺:比特分配:4位二进制数,其中1位表示符号,仅3位表示数值取值范围:仅-8 到 7, 个可选值,相邻值间隔约为全范围的0.4%INT4量化:仅16个离散值,类似16色图像,表示在[-8, 7]区间内只有16个可选值,相邻值间隔高达全范围的6.25%视觉化理解:INT8 如果用256色绘制一幅画
量化:按公式计算每个权重的 INT4 值,结果为 [8, 8, 7, 15, 0];3. INT4[1]: 8 -> -9.8 + 8/15 * 20.3 = 1.0267 INT4[2]: 7 -> -9.8 + 7/15 * 20.3 = -0.3267 INT4[3 :[8, 8, 7]可见主要权重集中在7、8两个值附近- 1.5.3 权重分析:统计使用情况 INT4取值范围: 0-15 (16个值)实际使用值: [0, 7, 8, 15] → 仅4个值被使用权重分布统计 结果:量化后 INT4 值为 [8, 8, 7, 15, 0],反量化后平均误差 0.1147。 (原始值: -0.5) 当前权重(含补偿): -0.5000 量化计算: (-0.5000 - -9.8) / 20.3 * 15 = 6.87 量化结果: INT4 = 7 反量化
我们使用RefConv替换YoloV7中的卷积,既能提高精度,又能降低运算量,使得模型更加轻量化! , 3, stride, 1, bias=False), norm_layer(oup), nlin_layer(inplace=True) ) YoloV7官方结果
参数量与算力匹配度显存容量直接决定可加载模型的参数量上限,是选型的首要前提,8G显存设备需严格控制参数量:6B及以下参数量模型可通过INT4量化稳定加载;7B参数量模型需依赖INT4量化且显存占用接近上限 选型过程2.1 初筛候选底座结合8G显存与中文生成需求,初筛3个底座:ChatGLM-6B(INT4量化)、Qwen-7B(INT4量化)、TinyLlama-7B。 20k+、非商用免费、适配主流工具)保留Qwen-7B(INT4)达标(text-generation、中文优化)达标(INT4量化、8G显存可加载)达标(星标15k+、非商用免费)保留TinyLlama -7B不达标(无中文优化,原生生成效果差)达标(INT4量化、8G显存可加载)达标(社区活跃、非商用免费)排除3. 案例结论8G显存+中文电商文案生成场景下:ChatGLM-6B(INT4量化版)为最优底座,兼顾显存适配性、生成效率与任务效果;Qwen-7B(INT4量化版)可作为备选,仅当需要长文本生成(超过2048
,INT4、INT8量化的llama https://github.com/tpoisonooo/llama.onnx.git 以ONNX的方式运行llama 量化和精度 对于消费级显卡,直接FP32肯定放不下 ,一般最基本的是FP16(llama的7B,FP16需要14G的显存,大多数的消费级显卡已经说拜拜了),而INT8和INT4量化则就很有用了,举几个例子: 对于3080显卡,10G显存,那么13B的INT4 就很有性价比,精度比7B-FP16要高很多 对于3090显卡,24G显存,那么30B的INT4可以在单个3090显卡部署,精度更高 可以看下图,列举了目前多种开源预训练模型在各种数据集上的分数和量化精度的关系 大概的结论: FP16速度最快,因为INT4和INT8的量化没有优化好(理论上INT8和INT4比FP16要快不少),而INT4的triton优化明显比huggingface中INT8的实现要好,建议使用 量化起来也不容易,QAT代价太大,PTQ校准的时候也需要很大的内存和显存,会用INT8和INT4量化 网上对于这类模型的加速kernel不是很多,可以参考的较少,很多需要自己手写 服务方式的区别 对于小模型来说
XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型(Large Language Model),参数规模为 70 亿,主要特点如下: 模型结构:XVERSE-7B 使用主流 Decoder-only ', cache_dir='/root/autodl-tmp', revision='master') Transformers 推理以及 INT8、INT4 量化推理 我们在 /root/autodl-tmp 默认是支持 INT8 和 INT4 类型的量化,这样在推理的适合可以大幅降低模型加载所需的显存。 4指的是 INT4 量化,同理8则表示 INT8 量化。 INT4 量化推理的运行效果如下:
消融实验 图4显示了700M BitNet a4.8的训练损耗曲线,比较了使用完整的INT4/FP4量化,以及本文的混合量化和稀疏化。 完整的INT4量化会导致发散,而混合架构在训练困惑度方面明显优于完整的FP4架构。 使用RedPajama数据集中25B token,来进行模型的第一阶段训练,采用absmean和MinMax量化器分别进行完整的INT4和FP4量化。 对于完整的INT4量化,由于其输入具有更大的异常值,这里设置β = 2*mean(|X|)。 此外,对down projection的输入应用FP4量化会导致性能显著下降,而将INT4激活与STE一起使用会导致发散。
量化适配原则:INT4量化虽降低算力需求,但部分老显卡(如RTX 30系列)对INT4优化不足,加速效果有限,优先选RTX 40系列及以上。4. 量化模型 量化的核心是匹配显卡精度支持能力:RTX 40系列及以上支持INT4硬件加速,A100支持FP8精度,老显卡仅支持INT8软件量化(加速效果有限)。 INT4优化,算力需求再减半,速度再提升50%,效果损耗8%-12%,适合对话、文本生成等低精度场景,需搭配NF4量化格式降低损耗。 INT4量化 print("测试INT4量化...") 实战选型与优化核心:个人用户:优先选RTX 4090,用INT8/INT4量化优化算力,兼顾效果与速度;高端需求:等待RTX 5090,32GB大显存+高算力,单卡搞定70B INT4模型,简化部署;企业用户
,如RTX 3060/4070);INT4量化:基础占用=7×10⁹ ×0.5字节=3.5GB;总占用=3.5GB×1.3≈4.55GB(需单卡8GB显存,如RTX 3070)。 13B模型:仅支持INT4量化(总占用≈13×10⁹×0.5×1.3≈8.58GB),效果略有损耗,适合简单对话场景;- 适用人群:初学者、预算有限的个人用户,用于7B模型入门体验。 - 7B模型:FP16精度(总占用≈18.2GB)流畅运行,生成速度10-15字/秒,效果接近原生;INT8/INT4量化可预留更多显存,支持多用户并发;- 13B模型:FP16精度(总占用≈13×10⁹ - 7B/13B模型:FP16精度无压力,7B速度可达15-20字/秒,13B速度12-15字/秒,支持高并发推理;- 70B模型:INT8量化(总占用≈91GB)需3张分片,INT4量化(总占用≈45.5GB 、70B INT4,简化部署复杂度;部署技巧:优先用INT8/INT4量化控制显存,通过device_map="auto"自动适配显存,避免手动分片的繁琐。
虽然向量本身存储为单比特值,但查询仅量化到 int4。这显著提高了搜索质量,同时不会增加存储成本。按位操作实现快速搜索。查询向量被量化并转换为允许高效按位操作的方式。 一旦有了邻居,多样性和反向链接评分可以使用先前的 int4 量化值完成。合并完成后,临时文件会被删除,只保留比特量化向量。 因此,文档值被比特量化,查询向量被量化为 int4。更有趣的是这些量化向量如何转换以实现快速查询。以我们上面的示例向量为例,我们可以将其量化为围绕质心的 int4。 量化Q(vc1') = [8, 15, 10, 7, 4, 0, 9, 9]每个维度的二进制值bits(Q(vc1')) = [0b1000, 0b1111, 0b1010, 0b0117, 0b0100 量化方式索引时间强制合并时间所需内存BBQ338.97342.61208MB4 bit398.71480.78578MB7 bit437.63744.121094MBraw408.75798.114162MB
DeepSeek-7B-chat 4bits量化 QLora 微调 概述 本节我们简要介绍如何基于 transformers、peft 等框架,对 DeepSeek-7B-chat 模型进行 Lora 通过这种方式训练,可以用6G显存轻松训练一个7B的模型。我的笔记本也能训练大模型辣!太酷啦! /deepseek-ai/deepseek-llm-7b-chat/', use_fast=False, trust_remote_code=True) tokenizer.padding_side = bnb_4bit_quant_type="nf4", # 4位精度量化的类型。这里设置为"nf4",表示使用nf4量化类型。 bnb_4bit_use_double_quant=True # 是否使用双精度量化。如果设置为True,则使用双精度量化。
个人开发者1.1 低成本场景:用技巧换算力量化优化:采用INT4量化(NF4格式),搭配BitsAndBytes库,将13B模型显存占用从40GB降至10GB以内;模型裁剪:裁剪注意力头从16个至12个 适配方案:量化+蒸馏+轻量化架构深度量化:采用INT4量化+模型蒸馏,将7B模型蒸馏为3B轻量化版本,算力需求降低60%,功耗控制在15W以内;架构适配:选用MobileLLM等边缘优化模型,替换原生Transformer 2.2 量化优化工具2.2.1 BitsAndBytes:“开箱即用”的轻量量化利器核心能力: 提供 INT8 和 INT4 量化,特别适合在消费级 GPU(如 RTX 30/40 系列)上快速运行大模型 2.2.2 GPTQ:“高精度+加速”兼顾的量化方案核心能力: 对模型进行逐层权重量化 + 误差补偿训练,实现 INT4 精度接近 FP16 效果,同时通过定制 CUDA kernel 加速推理。 2.2.3 TensorRT:NVIDIA 企业级“终极加速器”核心能力,NVIDIA 官方推理优化框架,支持: FP8 / INT8 / INT4 量化算子融合(kernel fusion)动态批处理
结合前向和反向传播的量化技术,本文提出一种算法,即对 Transformer 中的所有线性运算使用 INT4 MMs。 并且研究提出的原型量化 + INT4 MM 算子比 FP16 MM 基线快了 2.2 倍,将训练速度提高了 35.1%。 学得的步长量化 加速训练必须使用整数运算来计算前向传播。因此,研究者利用了学得的步长量化器(LSQ)。作为一种静态量化方法,LSQ 的量化规模不依赖于输入,因此比动态量化方法成本更低。 相较之下,动态量化方法需要在每次迭代时动态地计算量化规模。 给定一个 FP 矩阵 X,LSQ 通过如下公式 (2) 将 X 量化为整数。 他们改变了隐藏层大小、中间全连接层大小和批大小,并在下图 5 中绘制了 INT4 训练的加速比。
为了克服上述缺点,SageAttention2 提出将 Q, K 量化至 INT4,并将 P, V 量化至 FP8 来加速 Attention。然而,这样做的挑战是很大的。 研究团队发现直接将注意力运算中的 Q, K 量化为 INT4 后将会导致在几乎所有模型和任务上都会得到极差的结果,例如,在 CogVideoX 文生视频模型中,会得到完全模糊的视频;Llama2-7B 经过仔细分析后,研究团队发现主要是两个原因导致了量化注意力的不准确: (1)INT4 的数值范围相比 INT8 非常小,导致其量化误差在 Q,K 矩阵中出现一些异常值时会变得十分明显,恰好大多模型都在 这使得相比直接量化 Q, K 至 INT4 的准确度有质的改变,如下表展示了对比了该方法和直接量化 Q, K 至 INT4 在 Cogvideo 和 Llama3.1 上的端到端表现。 下图展示了 SageAttention2 的算法流程: SageAttention2 共实现了两种 Kernel,区别在于对 Q, K 进行 INT4 量化还是 INT8 量化: 此外,SageAttention2
基于量化感知训练的 Gemma 3 在 AI 模型中,研究者可以使用更少的位数例如 8 位(int8)甚至 4 位(int4)进行数据存储。 采用 int4 量化意味着每个数值仅用 4 bit 表示 —— 相比 BF16 格式,数据大小缩减至 1/4。 但是,这种量化方式通常会导致模型性能下降。 那谷歌是如何保持模型质量的? 与传统在模型训练完成后才进行量化的方式不同,QAT 将量化过程直接融入训练阶段 —— 通过在训练中模拟低精度运算,使模型在后续被量化为更小、更快的版本时,仍能保持准确率损失最小化。 6.6 GB(int4) Gemma 3 4B:从 8 GB(BF16)精简至 2.6 GB(int4) Gemma 3 1B:从 2 GB(BF16)降至仅 0.5 GB(int4) 此图仅表示加载模型权重所需的 来自 Two Minute Papers 频道的玩笑 官方 int4 和 Q4_0 非量化 QAT 模型已在 Hugging Face 和 Kaggle 上线。
2.2.2 设置在线 kv cache int4/int8 量化 自 v0.4.0 起,LMDeploy 支持在线 kv cache int4/int8 量化,量化方式为 per-head per-token 目前,LMDeploy 规定 qant_policy=4 表示 kv int4 量化,quant_policy=8 表示 kv int8 量化。 但quant-policy 设置为4时,意味着使用int4精度进行量化。因此,LMDeploy将会使用int4精度提前开辟4GB的kv cache。 int4是4位的整数格式,占用0.5字节(4位)的存储空间。因此,从bfloat16到int4的转换理论上可以将模型权重的大小减少到原来的1/4,即7B个int4参数仅占用3.5GB的显存。 输入以下指令,让我们同时启用量化后的模型、设定kv cache占用和kv cache int4量化。