本文将会重点介绍训练后量化技术的两种方式:动态和静态方法,将模型权重和激活从浮点数转换为整数,以减少模型大小和加速推理。并以 KL 散度作为例子讲解校准方法和量化粒度控制来平衡模型精度和性能。 训练后量化的方式 训练后量化的方式主要分为动态和静态两种。 其核心是计算量化比例因子,使用静态量化后的模型进行预测,在此过程中量化模型的缩放因子会根据输入数据的分布进行调整。相比量化训练,静态离线量化不需要重新训练,可以快速得到量化模型。 目的就是改变量化域,实则就是改变真实的分布,并使得修改后得真实分布在量化后与量化前相对熵越小越好。 训练后量化的技巧 对权重使用每通道(per-channel)粒度,对激活使用每张量(per-tensor)粒度 权重张量在不同通道中的值分布差异很大,如果使用单一的缩放因子进行量化,可能会导致较大的精度损失
本文发现,这不是最佳的量化策略。本文提出了 AdaRound,一种用于训练后量化的更好的权重舍入机制,它可以适应数据和任务损失。 AdaRound 不仅比舍入取整有显著的提升,而且还为几种网络和任务上的训练后量化建立了新的最新技术。 在全面的研究中,表明 AdaRound 为几个网络和任务(包括 ResNet18,ResNet50,MobilenetV2,InceptionV3 和 DeeplabV3)提供了最新的训练后量化新技术。 此外,在这100个随机样本中,最好的样本可将网络的准确性提高10%以上。并且,还看到意外地将所有值向上或向下取整会产生灾难性的影响。这意味着在进行训练后量化时,通过仔细舍入权重,可以获得很多收益。 随机舍入与四舍五入对比 方法 在本节中,提出AdaRound,这是一种用于训练后量化的新舍入程序,在理论上是有充分根据的,并且在实践中显示出显着的性能改进。本文从理论上分析由于量化引起的损失。
PTQ 和 QAT是什么后训练量化(PTQ):模型训先练完再加工,训练好 FP32 模型后,直接对权重或激活值做量化,不用重新训练。 量化感知训练(QAT):模型训练时预埋适配,训练过程中模拟量化误差,让模型学会适应低精度计算,最后导出量化模型。三、后训练量化(PTQ)1. 核心概念与原理 后训练量化,PTQ,全称Post-Training Quantization,是指模型训练完成后,直接对权重和激活值进行量化的技术。 :复杂模型量化后精度可能下降 5%-10%适配性差:量化误差无法被模型适应,复杂模型易出现性能暴跌仅支持静态量化:对激活值的量化基于校准数据,泛化性有限4. 执行流程 这是一个量化感知训练的完整流程,通过训练让模型主动适应量化误差,通过模型在训练中体验量化误差,学习补偿,精度通常比训练后量化(PTQ)精度损失更小,迭代优化支持参数调整重新训练。
鉴于在资源受限的边缘设备上部署SSMs的计算成本较高,训练后量化(Post-Training Quantization, PTQ)作为一种技术,具有推动SSMs高效部署的潜力。 训练后量化(Post-Training Quantization, PTQ)是解决这一问题的有效方法,它可以在仅使用少量未标注的校准数据集的情况下,将模型的权重和激活值量化为整数,从而减轻内存和功耗负担 训练后量化 量化是一种有效的模型压缩技术,它将权重和激活值从浮点数转换为低比特整数,从而减少内存存储和计算消耗。 量化方法大致可分为两类:量化感知训练 (Quantization-Aware Training, QAT)[1, 4, 5] 和训练后量化 (Post-Training Quantization, PTQ 6 结论 在本研究中,我们首次提出了 QMamba,这是首个专为基于状态空间模型(SSM)的视觉模型设计的后训练量化(PTQ)框架之一。
最初,我们通过“混合运算”为训练后量化提供支持,该方法可量化模型参数(例如权重),但以浮点方式执行部分计算。今天,我们很高兴宣布推出一款新工具:训练后整型量化。 优化模型以缩减尺寸、延时和功耗,使准确率损失不明显 为何应使用训练后整型量化 我们之前发布的“混合”训练后量化方法可在许多情况下减少模型大小和延迟时间,但却必须进行浮点计算,这可能不适用于所有硬件加速器 CPU 大小和延迟时间,即应使用“混合”训练后量化工具。 与现有的训练后量化功能类似,默认情况下,未进行量化操作的算子将自动以浮点方式执行。 同时,我们也鼓励您尝试使用训练后量化法,因为它也许能满足模型的所有需求! 文档和教程 您可以在 TensorFlow 网站上找到关于训练后整型量化、新量化规范以及训练后整型量化教程的详细信息。
AdaQuant:改进训练后神经网络量化:分层校准和整数编程 本文是以色列理工学院与英特尔联合提出的基于PTQ的神经网络量化技术,并且提出了不同复杂度下的量化策略方案与基于整数编程的混合精度搜索。 例如,在ResNet50上,实现了所有层权重和激活4-bit量化,且精度下降不到1%。 方法 在大多数训练后量化设置中,会提供一个模型和一个小的未标记校准集。 尽管还有其他训练后量化技术可以与我们的方法潜在地结合起来,例如偏差校正,均衡和离群的信道拆分,但是,并没有必要。 值得注意的是,BNT只需在校准集中进行几次(最多10次)正向通过,即可获得显着的增益。在这项研究中,仅在使用BN层训练的模型上应用了BNT。 Full pipeline and ablation study 尽管一些研究人员提出了用于训练后的混合精度量化的不同方法,但没有一个提供其代码。
K线图,大家应该不陌生,至少在影视剧里,在平常的财经新闻报道中应该都见过。如果是超过股的朋友那就更不会陌生了,K线图几乎就是在炒股过程中必不可少的工具,我们用它来看价格的变化形式。
【导读】本文聊了两篇做INT8量化训练的文章,量化训练说的与quantization-aware Training有区别,量化训练指的是在模型训练的前向传播和后向传播都有INT8量化。 两篇文章都是基于对梯度构建分析方程求解得到解决量化训练会引起的训练崩溃和精度损失严重的情况。 而量化训练则是在前向传播和后向传播都加入量化,而且做完矩阵运算再把运算的结果反量化回去浮点数。 Unified INT8也是类似minimize量化后梯度与原来梯度的量化误差Error的思想,Unified INT8是通过收敛性分析方程,发现了可以通过降低学习率和减少梯度量化误差。 ; $\eta{t}$ 是量化-反量化后的梯度, $\eta{t}$ 是学习率,Term(3)说明要降低学习率。
【GiantPandaCV导读】本文聊了两篇做INT8量化训练的文章,量化训练说的与quantization-aware Training有区别,量化训练指的是在模型训练的前向传播和后向传播都有INT8 两篇文章都是基于对梯度构建分析方程求解得到解决量化训练会引起的训练崩溃和精度损失严重的情况。 Unified INT8也是类似minimize量化后梯度与原来梯度的量化误差Error的思想,与Distribution Adaptive INT8不同的是通过收敛性分析方程,发现可以通过降低学习率和减少梯度量化误差 Unified INT8也是类似minimize量化后梯度与原来梯度的量化误差Error的思想,Unified INT8是通过收敛性分析方程,发现了可以通过降低学习率和减少梯度量化误差。 -反量化后的梯度, 是学习率,Term(3)说明要降低学习率。
本文链接:https://blog.csdn.net/huachao1001/article/details/101285133 1 量化为PB格式模型 从官方提供的tensorflow版本与编译工具版本中选择 Tensorflow源码 下载1.13版本Tensorflow源码:https://github.com/tensorflow/tensorflow/tree/v1.13.2 使用bazel编译tensorflow量化工具 bazel build tensorflow/tools/graph_transforms:transform_graph 1.3 执行转换量化命令 将导出的pb模型执行模型量化转换,以tensorflow_inception_graph.pb type=float, shape="1,299,299,3") remove_nodes(op=Identity, op=CheckNumerics) fold_old_batch_norms ' 2 量化为 TFLite格式模型 除了使用transform_graph工具对pb模型进行量化转换外,还可以使用TFLite对模型进行量化处理,但是需要注意的是,使用TFLite转换得到的量化模型是tflite结构
此外,还提供了一些实践技巧,包括从校准良好的 PTQ 模型开始、使用余弦退火学习率计划等,以及 QAT 与后训练量化(PTQ)的比较。 感知量化训练流程 传统的训练后量化将模型从 FP32 量化到 INT8 精度时会产生较大的数值精度损失。 正向传播 在正向传播中,FakeQuant 节点将输入数据量化为低精度(如 INT8),进行计算后再反量化为浮点数。这样,模型在训练期间就能体验到量化引入的误差,从而进行相应的调整。 微调时间为原始训练计划的 10% 感知量化训练不需要像原始训练那样耗时,因为模型已经相对较好地训练过,只需要调整到较低的精度。一般来说,微调时间为原始训练计划的 10% 是一个不错的经验法则。 要使用 TensorRT 推理 QAT 模型,通常需要以下步骤: 训练并量化模型: 首先使用训练框架(如 PyTorch、PaddlePaddle 和 MindSpore)进行量化感知训练并保存量化后的模型
: image.png 论文算法解读 量化的定义 image.png 优化目标 量化推理的流程图 ? https://arxiv.org/pdf/2006.16669.pdf 最后看最右边的方框,表示得到卷积层输出量化激活结果之后,如果下一层不是量化计算层,则直接除以权值和输入激活的量化因子,得到反量化的输出 如果下一层也是量化层,则除了除以权值和输入激活的量化因子还需要再乘以下一层的输入量化因子得到量化后的下一层的输入(Requantize)。 优化单层量化因子 image.png ? https://arxiv.org/pdf/2006.16669.pdf 实验还对比了 EasyQuant和 训练量化QAT(Quantize Aware Training),可以按到在ResNet50 总结 这篇论文提出了一个在低于8bit下精度还能保持比较好的后量化算法,思想相对TensorRT的方法来说更加容易理解,而且实现上也更加的容易,实际端侧推理加速效果也不错。
中文官方地址我放附录了,我们理解为这个框架可以把我们用tensorflow训练出来的模型转换到移动端进行部署即可,在这个转换过程中就可以自动调用算法执行模型剪枝,模型量化了。 所以这里我选择使用savedModel来保存模型,这个模型可以直接转换为tflite,在转换工程中调用相关代码进行量化。训练完成后会在checkpoint文件夹下生成这4个文件。 ? 轮的时间 原始模型 242KB 97.39% 110.72 量化后的模型 67KB 97.34% 35.97 可以看到对LeNet量化后模型的大小变为原始模型的近1/4,并且精度几乎不降,且运行速度也有 也说明了训练后量化的有效性。今天暂时就讲到这里了,我把源码放到github上了,地址见附录。 附录 Tensorflow-Lite官方文档:https://tensorflow.google.cn/lite Tensorflow后量化官方实例:https://github.com/tensorflow
该方法的有效性在多个基准模型和数据集上得到验证,其性能优于SOTA的后训练量化算法。 后训练量化是一种有效的模型压缩技术,它可以直接量化神经网络模型,而无需进行微调。大多数现有的后训练量化方法是为卷积神经网络(CNN)或递归神经网络(RNN)设计的。 因此,作者希望为视觉Transformer结构探索后训练量化,以减少显存和计算成本。 在本文中,作者研究了具有混合精度的视觉Transformer模型的后训练量化方法,以获得更高的压缩比和加速比。 Results and Analysis Image classification 从上表可以看出,基于分类任务,在多个模型和多个数据集上,本文的后训练量化方法都优于其他后训练量化方法。 实验结果表明,与传统的训练后量化方法相比,该方法在网络精度和存储开销方面都有很大的改进。
所以,这里推荐一系列讲解TFLite后量化和量化感知训练原理的文章,看一下这几篇文章阅读本文就没有任何问题了。 量化感知训练和后训练量化的主要区别在于它会对激活以及权重做模拟量化操作,即FP32->INT8->FP32。 这样做的好处是可以模拟量化的实际运行过程,将量化过程中产生的误差也作为一个特征提供给网络学习,一般来说量化感知训练会获得比后训练量化更好的精度。 0x2. 在上一节提到,量化感知训练和后训练量化的主要区别在于它会对激活以及权重参数做模拟量化操作,即FP32->INT8->FP32。 freeze 这个函数会在统计完 scale,zero_point 后发挥作用,这个函数和后训练量化和模型转换有关。
对训练好的网络做量化,在实践中尝试过TensorRT的后训练量化算法,在一些任务上效果还不错。 但是如果能在训练过程中去模拟量化的过程,让网络学习去修正量化带来的误差,那么得到的量化参数应该是更准确的,而且在实际量化推断中模型的性能损失应该能更小。 而训练量化我理解就是在forward阶段去模拟量化这个过程,是把权值和激活值量化到再反量化回有误差的,所以训练过程还是浮点。 模拟量化卷积层示例图 具体实现的时候就是按照论文中的这个模拟量化卷积层示例图去写训练网络结构的。 4. 实验结果 用VGG在Cifar10上做了下实验,效果还可以,因为是为了验证量化训练的有效性,所以训Cifar10的时候没怎么调过参,数据增强也没做,训出来的模型精确度最高只有0.877,比最好的结果0.93
之前写了关于海思NNIE的一些量化部署工作,笔者不才,文章没有写得很具体,有些内容并没有完全写在里面。好在目前看到了一些使用nniefacelib脱坑的朋友,觉得这个工程还是有些用的。 目前在活体检测领域用其渲染的depth map作为伪标签进行训练,已经成为了一种标配性的存在。所以当人脸姿态估计算法性能接近于它,证明训练的姿态已经非常不错了。 这其实和训练数据集里面闭眼图片的数量过少有关系,加强眼部的训练并不能抵抗这种情况,因为不是一个维度的事情,最佳的方式依然是添加闭眼数据。 示例图片 四、量化 过去一周,笔者对训练代码进行了整理,完成了多种版本的转换工作,包括 pytorch caffe ncnn nnie 听说有小伙伴将这套模型跑到了ios上,说不定之后会放出来。 量化精度 Github地址如下: https://github.com/Oneflow-Inc/oneflow
项目已经开源:https://github.com/taolei87/sru 先看论文摘要,有个大概的了解: 标题非常直接,也是很多人都想实现的——《像训练CNN一样快速训练RNN》: ? 我们所提出的循环单元,运行速度与卷积层一样快,比cuDNN优化的LSTM快5-10倍。我们展示了这种循环单元在广泛应用中的有效性,包括分类、问答、语言建模、翻译和语音识别。 在典型的RNN实现中,输出状态 的计算需要等到 计算完成后才能开始。这阻碍了独立计算,并大大减慢了序列处理的速度。 图1展示了cuDNN优化后的LSTM和使用conv2d的字级卷积的处理时间。 可以看出,两者区别非常明显,即使是优化后的LSTM,运行速度也可能慢10倍多。 ? 图1:cuDNN优化后的LSTM和使用conv2d的字级卷积的处理时间:即使是优化后的LSTM,运行速度也可能慢10倍多 于是,作者提出了“简单循环单元”(Simple Recurrent Unit,SRU
而量化就是将浮点数(高精度)表示的权重和偏置用低精度整数(常用的有INT8)来近似表示,在量化到低精度之后就可以应用移动平台上的优化技术如NEON对计算过程进行加速,并且原始模型量化后的模型容量也会减少 非对称量化 image.png 4. 中部小结 将上面两种算法直接应用到各个网络上进行量化后(训练后量化PTQ)测试模型的精度结果如下: ? 红色部分即将上面两种量化算法应用到各个网络上做精度测试结果 5. 训练模拟量化 我们要在网络训练的过程中模型量化这个过程,然后网络分前向和反向两个阶段,前向阶段的量化就是第二节和第三节的内容。 bias设置为None,即训练的时候不量化bias。 QAT方式明显好于Post Train Quantzation 注意前面有一些精度几乎为0的数据是因为MobileNet训练出来之后某些层的权重非常接近0,使用训练后量化方法之后权重也为0,这就导致推理后结果完全错误
利用这些技巧,让你的GAN旅程更平坦 原标题 | 10 Lessons I Learned Training GANs for one Year 作者 | Marco Pasini 翻译 | had_in 我不奢望你仅用10分钟就解决这个问题,并在每一个项目中达到很完美的收敛结果(或用博弈论的话语表达,即纳什平衡),但我想要给你一些技巧和技术,你可以利用这些技巧让你的GAN旅程更平坦,耗时更少,最重要的是 在进一步探究网络容量变化对训练稳定性的影响后,我没有发现任何明显的相关性。两者之间肯定存在某种联系,但它并不像你刚开始想象的那么重要。 话虽如此,我开始会使用这种技术,但过了一段时间后就放弃了,而是更喜欢其他一些在我看来更有效的技术。 7. 10. 谱归一化 在一些论文中,如介绍SAGAN(或Self - Attention GAN)的论文中,表明谱归一化是应用于卷积核的一种特殊的归一化,它可以极大地提高训练的稳定性。