【模型的量化 神经网络量化】对称量化与非对称量化 无符号数量化 有符号数量化

减少模型大小:通过将模型的权重和激活值从浮点数(如32位的FP32)转换为低精度的格式(如8位的INT8),可以显著减少模型的存储大小。这种压缩可以使得模型更易于在各种设备上部署,包括资源受限的环境。

降低内存带宽和存储需求:量化后的模型由于尺寸减小,对内存的依赖也随之降低,这减少了内存的访问带宽需求,提高了缓存命中率,特别是在处理内存密集型操作时效果显著。

提高计算速度:使用低精度的数据类型可以提高计算速度,因为现代处理器对低精度数据的计算支持更好,能够实现更快的处理速度。这对于实时应用和需要快速响应的场景尤其重要。

降低功耗:在移动设备上,使用8位数据而不是32位浮点数可以显著降低功耗,这对于延长电池寿命和提高设备的能效比非常关键。

提高系统吞吐量和降低延时:量化可以使芯片的计算峰值增加,因为一条指令可以同时处理更多的数据。这提高了系统的吞吐量并降低了处理延时,尤其是在使用SIMD指令集时效果显著。

适应硬件发展:随着专用深度学习加速器和支持INT8运算的硬件(如DSP、GPU)的发展,量化模型能够更好地利用这些硬件的能力,实现更高效的运算。

推动深度学习模型的商业化和普及:量化技术使得深度学习模型能够更容易地集成到商业产品中,尤其是在边缘计算和移动设备上,这推动了深度学习技术的商业化和普及。

解决部署难题:量化模型更容易在不同的硬件平台上部署,因为它们对计算资源的要求较低,这解决了将深度学习模型部署到资源受限设备上的难题。
在这里插入图片描述
从图中我们可以看到32bit浮点数计算,能量对比上远远高于8bit能量的计算消耗的。因此目前大模型通常8bit量化更有利于边缘设备部署。

量化方法

1.非对称量化

1.1 无符号量化(uint8)

将原始数据xf 最大值max(xf),最小值min(xf)映射到 0-255的区间上。
无符号量化
公式:
在这里插入图片描述
在这里插入图片描述
随机写入一组float32的tensor:

x=torch.tensor([[ 0.9872, -1.6833], [-0.9345, 0.6531]])

这里输出的s我们自己手动计算得到s,z:
在这里插入图片描述

1.2 有符号量化(int8)

将原始数据xf 最大值max(xf),最小值min(xf)映射到 -127,127的区间上。工程上常用有符号是-127-127
在这里插入图片描述

公式:
在这里插入图片描述
在这里插入图片描述
写入一组相同float32的tensor:

x=torch.tensor([[ 0.9872, -1.6833], [-0.9345, 0.6531]])

这里输出的s我们自己手动计算得到s,z,区别在于此时的qmax 从255变成127:
在这里插入图片描述

1.3 代码

import torch


#清空cuda内存
torch.cuda.empty_cache()

print("---------非对称量化----------")

x=torch.tensor([[ 0.9872, -1.6833],
         [-0.9345,  0.6531]])
print(x)
# 公式1(量化):xq = round(x / scale + zero_point)
# 使用给定的scale和 zero_point 来把一个float tensor转化为 quantized tensor
#随机设定的scale和 zero_point
# 有符号数
xq = torch.quantize_per_tensor(x, scale=0.0104725, zero_point=33, dtype=torch.qint8)

#无符号数
xq1 =torch.quantize_per_tensor(x,scale=0.0104725,zero_point=161,dtype=torch.quint8)
print("xq",xq) #输出一个经过反量化的张量
print("xq1",xq1) #输出一个经过反量化的张量
print("xqint8",xq.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量
print("xquint8",xq1.int_repr())

# 公式2(反量化):xdq = (xq - zero_point) * scale
# 使用给定的scale和 zero_point 来把一个 quantized tensor 转化为 float tensor
xdq = xq.dequantize()
print(xdq)

在这里插入图片描述

1.4总结

程序中torch量化类型quint,qint,分别存在反量化之后的数值,和量化的整型数值。这个是qint对象的特点。通过int_repr()看到中间量化的结果。
此外,量化存在精度损失。有符号和无符号的非对称量化改变的是数值量化的范围,反量化的结果存在误差损失。

2 对称量化

对称量化和非对称量化的区别在于,是否把输入的float区间看成一个对称的。这常常用于权重量化,或者常常用于一些分布对称的数值区间进行量化。

2.1 无符号量化(uint8)

区别主要在于对称量化为对称区间,零点在127.
在这里插入图片描述
在这里插入图片描述
比例因子s 的计算可以是上述的也可以直接,s=max(xf)/127.误差一般都是相同的。

2.2 有符号量化(uint8)

区别主要在于对称量化为对称区间,零点在0,一般对称量化的类型都是有符号类型。常用于权重的量化。
在这里插入图片描述

在这里插入图片描述

2.3总结

非对称量化VS对称量化

非对称量化相比于对称量化而言,无需遵循0不变的映射规则,显然具有更好的动态映射范围,并且当面临一些特殊情况,如对于经过relu的激活值(全为非负值),使用对称量化时,需要仔细考虑使用符号量化,还是无符号量化。

但另一方面非对称量化相对于对称量化需要付出更大的计算代价
在这里插入图片描述

可以看到,后两项都是常量,可以提前离线计算好,但额外多出的第二项相比于对称量化而言,非对称量化有着较大的额外计算开销。

综合以上分析,硬件支持的前提下,量化时对激活值X使用非对称量化,对权重值W使用对称量化,或许是一种更适宜的量化方案

2.4 程序代码

print("---------对称量化----------")


x=torch.tensor([[ 0.9872, -1.6833],
         [-0.9345,  0.6531]])
print(x)
# 有符号数

s= 1.6833/127
z0=0

xq = torch.quantize_per_tensor(x, scale=s, zero_point=0, dtype=torch.qint8)
xq1 = torch.quantize_per_tensor(x, scale=s, zero_point=127, dtype=torch.quint8)
print("xq",xq) #输出一个经过反量化的张量

print("xqint8",xq.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量

print("xq1",xq1) #输出一个经过反量化的张量

print("xq1uint8",xq1.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量
# 公式2(反量化):xdq = (xq - zero_point) * scale
# 使用给定的scale和 zero_point 来把一个 quantized tensor 转化为 float tensor
xdq = xq.dequantize()
print(xdq)

在这里插入图片描述
以上为对有无符号的量化类型讨论,以具体的张量类型进行程序举例。

<think>好的,我现在需要帮助用户理解神经网络权重量化的概念、方法实现。首先,我得先回忆一下权重量化的基本概念。权重量化主要是通过降低权重的精度来减少模型的大小计算量,这对于移动端或嵌入式设备来说非常重要,因为它们通常计算资源有限。 接下来,用户提到了几个引用,我需要结合这些引用来组织答案。比如引用[1]提到FFN将权重量化到2bit,消除MAC操作,这对性能有帮助。引用[4]则讨论了Statistics量化方法,通过均值方差来压缩权重。而引用[3]指出移动端算力的限制,说明量化的必要性。 我应该先解释权重量化的概念,然后分点介绍不同的方法。比如线性量化、对数量化、统计量化等。每种方法需要简要说明原理,并结合引用中的例子。例如,线性量化可以分为对称非对称,引用[4]中的统计方法可以归到统计量化里。 在实现部分,用户可能想知道具体怎么操作,比如PyTorch中的量化工具,引用[5]提到了PyTorch的文档,这里需要提到框架支持,并给出一个简单的代码示例。同时,引用[2]提到BP神经网络的训练函数,可能量化后的微调有关,需要说明量化后的微调步骤。 还需要注意用户的问题可能涉及到方法的选择,比如不同比特位的适用性,比如低比特如2bit可能用三值量化,而统计量化不适合低比特,这点引用[4]已经提到。要指出不同方法的优缺点,帮助用户根据需求选择。 最后,生成的相关问题需要覆盖概念、方法对比、实现工具挑战,这样用户可以有进一步探索的方向。检查是否所有引用都合理应用,比如引用[1]的例子用于减少计算量,引用[3]说明移动端的需求,引用[4]解释统计方法,引用[5]提供实现资源。 总结下来,结构应该是:概念、方法分类及说明、实现步骤工具、相关问题。确保每个部分都有对应的引用支持,并且用中文清晰表达,使用正确的LaTeX格式,如$W_q$这样的变量用行内公式,独立公式用$$包围。</think>### 神经网络权重量化详解 #### 一、权重量化的核心概念 权重量化(Weight Quantization)是通过降低神经网络权重参数的数值精度(如从32位浮点压缩至8位整数或更低),以减小模型存储空间计算复杂度的方法。其核心目标是在保持模型性能的前提下,实现以下优势: 1. **减少存储开销**:例如,将32位浮点权重转为8位整型可减少75%存储需求[^3] 2. **加速计算**:低精度运算可有效利用硬件特性(如SIMD指令集),减少MAC操作[^1] 3. **降低功耗**:移动端设备通过量化可降低50%以上的能耗[^3] #### 二、主要量化方法 ##### 1. 线性量化(均匀量化) 将浮点权重$W_f$映射到整数范围$[0,2^b-1]$,量化公式为: $$ W_q = \text{round}\left( \frac{W_f - \beta}{\alpha} \times (2^b-1) \right) $$ 其中$\alpha=(W_{max}-W_{min})/(2^b-1)$为缩放因子,$\beta=W_{min}$为偏移量。分为: - **对称量化**:$W_{max}=|W|_{max}, W_{min}=-|W|_{max}$ [^4] - **非对称量化**:保留原始数值范围边界 ##### 2. 对数量化 更适合处理权重分布呈指数特征的情况: $$ W_q = \text{sign}(W_f) \times 2^{\text{round}(\log_2|W_f|)} $$ 可配合移位运算实现硬件加速 ##### 3. 统计驱动量化(引用[4]方法) 通过统计特性压缩权重分布: 1. 计算均值$\mu$标准差$\sigma$ 2. 标准化处理:$\hat{W} = (W_f - \mu)/\sigma$ 3. 按新分布进行线性量化 ##### 4. 极低比特量化 - **二值化**:$W_q = \text{sign}(W_f)$ - **三值化**:$W_q \in \{-1,0,+1\}$,可完全消除乘法运算 #### 三、实现流程(以PyTorch为例) ```python import torch import torch.quantization # 原始模型 model = MyNeuralNetwork().float() # 量化配置 quant_config = torch.quantization.get_default_qconfig('fbgemm') # 量化准备 model.qconfig = quant_config torch.quantization.prepare(model, inplace=True) # 校准(统计量分布) with torch.no_grad(): for data in calibration_dataset: model(data) # 转换量化模型 quant_model = torch.quantization.convert(model) ``` #### 四、关键挑战与解决方案 1. **精度损失补偿**: - 量化感知训练(QAT):在训练中模拟量化过程 - 微调策略:使用弹性梯度下降法(如引用[2]提到的trainrp) 2. **硬件适配**: - GPU量化:使用FP16/INT8混合精度 - CPU优化:NEON指令集加速INT4运算[^3] 3. **动态范围控制**: - 基于通道的量化(per-channel) - 自适应裁剪阈值调整 #### 五、方法对比 | 方法 | 比特位 | 计算复杂度 | 适用场景 | |-------------|--------|------------|-------------------| | 线性量化 | 4-8bit | 中 | 通用模型压缩 | | 对数量化 | 3-4bit | 低 | 语音/图像处理 | | 三值量化 | 2bit | 极低 | 边缘设备推理 | | 统计量化 | 8+bit | 高 | 高精度保留场景[^4]|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山仰止景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值