神经网络定点量化

本文探讨了如何通过量化技术,如INT8量化,减少移动端计算、内存和功耗。介绍了PyTorch的动态与静态量化区别,以及Quantization-Aware Training背后原理。重点讲解了量化参数S和Z在模型权重和激活上的使用,以及Post-Training Quantization在不同场景下的实践和效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的:

1. 加速计算(特别是移动端上)

2. 减少内存/显存占用(特别是移动端上)

3. 减少功耗(读取内存和计算都会耗电)

把某个tensor或者某个channel的这组float32, 用int8来表示,就是量化。

这组float32的上下界,可以取他们的min和max,也可以moving average,也可以去中间99%的那部分。。。越界的就用量化为0或者255。

公式:

(r实数-0) / (q整数-Z整数)= S = (r实数max-r实数min) / (q整数max-q整数min) = (r实数max-r实数min) / 255

S为缩放稀疏,Z为"Zero-Point",其实Z就是真实浮点值0映射到整数时对应的值,无论是在图像中还是NLP中都会有用0做padding值来补全的,映射到整数后,也应该有这样一个值的存在,这个值就是Z。在这里S和Z可以称为量化参数,对于每个权重矩阵和每个激活数组都有一对这样的值。

Linear层和卷积的量化:

神经网络量化入门--基本原理 - 知乎 (zhihu.com)

累加用的是INT32:

Arithmetic in the quantized model is done using vectorized INT8 instructions. Accumulation is typically done with INT16 or INT32 to avoid overflow. This higher precision value is scaled back to INT8 if the next layer is quantized or converted to FP32 for output.

1. PyTorch的Dynamic Quantization

用户指定量化哪些层;这些层的权重全被量化成int8,activation在输入时量化成int8,计算完成后再反量化成float32; 每个batch的每层都要量化一次(所以叫做Dynamic量化);

2. PyTorch的Static Quantization

权重和activation全部被量化成int8;层与层之间不再转成float32;因此速度超快;

 模型权重中,每层的数据分布,在inference阶段是固定的,所以可以一次性统计分布并量化(先得到S和Z,再量化)

activation,每个batch都是不一样的,所以要先做calibration,即采样上千个batch,经过float32神经网络,得到每个激活tensor(或激活channel)的数据分布,最后计算好S和Z,最最后再量化;

以上两者都属于Post Training Quantization

3. Quantization Aware Training

Quantization aware training 量化背后的技术——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference - 微笑sun - 博客园 (cnblogs.com)

### 神经网络量化的概念 神经网络量化是指将神经网络中的浮点权重值转换为定点整数表示的过程[^3]。这一过程通过减少数值精度来降低存储需求和计算复杂度,从而提高模型的运行效率并节省硬件资源。 --- ### 常见的量化方法 #### 低比特宽度梯度法 一种典型的量化方法是采用低比特宽度梯度技术,这种方法能够显著减小模型大小而不明显影响性能[^1]。它主要针对权重参数进行优化处理,使得原本需要高精度表达的数据可以用更少的位宽表示。 #### 训练与推理阶段的不同策略 在实际应用中,通常会在训练过程中保持较高的FP32精度以确保收敛效果良好;而在推理环节则切换至较低精度如INT8模式下操作,这种组合方式已被多个主流框架采纳支持,例如TensorRT, TensorFlow以及PyTorch等均提供了相应工具链用于简化部署流程[^2]. --- ### 主流实现框架及其特点 以下是几个广泛使用的深度学习库对于神经网络量化的具体实施方案: - **TensorFlow Lite**: 提供了一套完整的API集合允许开发者轻松完成从原始float版本到integer-only variant之间的转变,并且兼容多种平台设备上的高效执行环境. - **ONNX Runtime Quantization Tools**: 来自微软开源项目之一,专注于跨不同DL frameworks间互操作性的增强工作的同时也包含了丰富的预定义方案可供选择调优使用场景下的表现指标[^4]. - **PyTorch Quantization Toolkit**: 集成了动态、静态两种类型的自动校准机制帮助用户快速评估候选配置选项进而挑选最佳实践路径实施大规模生产环境中所需的调整动作[^5]. 下面展示如何利用 PyTorch 完成简单的线性层量化例子: ```python import torch from torch.quantization import quantize_dynamic # 创建一个标准全连接层实例 linear_model = torch.nn.Linear(64, 64) # 应用动态量化函数变换目标模块结构属性 quantized_linear = quantize_dynamic(linear_model, {torch.nn.Linear}, dtype=torch.qint8) print("Original Model:", linear_model) print("Quantized Model:", quantized_linear) ``` 上述脚本片段展示了怎样借助内置功能迅速构建起基础版别的轻量化解决方案原型设计思路. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值