训练后量化(PTQ) 工作流理解

这篇具有很好参考价值的文章主要介绍了训练后量化(PTQ) 工作流理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前神经网络在许多前沿领域的应用取得了较大进展,但经常会带来很高的计算成本,对内存带宽和算力要求高。另外降低神经网络的功率和时延在现代网络集成到边缘设备时也极其关键,在这些场景中模型推理具有严格的功率和计算要求。神经网络量化是解决上述问题有效方法之一,但是模型量化技术的应用会给模型带来额外噪音,从而导致精度下降,因此工程师对模型量化过程的理解有益于提高部署模型的精度。本文主要介绍训练后量化 (Post-training quantization,PTQ) 的关键基础技术,首先介绍了 PTQ 的定义、量化的数学定义即量化公式、量化模拟、range setting,最后介绍了 PTQ 的整体技术流程。

0. PTQ

训练后量化 (PTQ) 算法将训练过的 FP32 网络直接转换为定点计算的网络,过程中无需对原始模型进行任何训练。只对几个超参数调整就可完成量化过程,量化模型以一种更有效的计算方式进行模型推理。量化后模型中的参数使用低 bit 表示,在数据搬移时降低了带宽要求,在计算过程中一般硬件对于低 bit 整形数据具有更高的标称算力,因此模型量化的优化方案在多数情况下可获得较大的推理速度提升,此方法已被广泛应用于大量的端侧和云侧部署场景。

1. Uniform affine quantization

‍量化一般是指将 32bit 存储的数据映射为 低 bit 整形数据,量化后可以借助于硬件对低 bit 数据的计算优势对神经网络平算子进行加速计算。在现有的量化方法中,工程化时一般使用均匀量化,这样更有益于底层硬件对低 bit 数据进行计算优化。均匀量化有两种情况,分别为非对称量化和对称量化,其中对称量化是非对称量化的一个特例,本文不再讲述。

仿射量化也称为非对称量化,其由三个参数定义,分别为 s(scale factor)、z( zero-point)、b(bit-width) 。使用 s 和 z 将浮点值映射到整数,整数的范围则取决于位宽 b 。scale factor 一般由浮点值表示,其表明了量化过程的步长 。zero-point 是一个整数,其保证真正的零点可以无误差映射到整形数据,该参数对于 zero padding 和 relu 激活函数的计算具有重要意义。

一旦三个量化参数确定了,我们就可以使用量化操作了,将一个浮点类型的 vector X 映射到无符号整形 。

402 Payment Required

表示 round-to-nearest 算子,clamp 函数表示如下:

402 Payment Required

使用反量化表示真实值的估计值如下:

组合上述两个步骤可以获得通用量化函数定义 :

通过反量化步骤,我们可以定义量化范围 ,其中 、 。任何超出量化范围的数值将被被截断,产生   clipping error 。我们可以通过增大量化的范围减小 clipping error ,但是会增加 scale factor ,从而导致 round error 增加, round error 为 。因此量化参数的选择过程就是 round error 和 clipping error 平衡的过程。

通过上述量化方案我们就可以将模型中的 weight 和 activation 从浮点值映射到低 bit 整形数据,但二者也有所不同, weight 一般是提前量化好的, activation 依赖于模型的输入数据,是在模型进行推理时生成的,因此 activation 的量化需要少量的校准数据集。‍

2. Quantization simulation

为了测试一个模型量化后运行的效果,一般都是在相同的通用硬件上进行量化行为仿真,该过程称为量化模拟。使用浮点算子操作来近似量化算子操作,量化模拟主要用来减少仿真和实际硬件运行的误差。

下图 a 中表示了卷积层的定点量化计算过程。计算过程中 biases、weight、input activations 全部为定点格式。但是仿真过程中全部使用浮点类型数据,这样就可以使用量化器来指导量化过程。下图 b 中展示了卷积层在通用框架中的仿真模型,在 weight 和 conv 之间插入量化器(Quantizer)来模拟 weight 的量化,在 activation function 后插入量化器来模拟 activation 量化。bias 一般使用高精度保存。量化器一般由 scale factor, zero-point, bit-width 三个元素确定,量化器的 input 和 output 都是 float32 格式,但是最终的 output 的大小位于量化网格上。

训练后量化(PTQ) 工作流理解

图1 conv 层的前向推理过程. a 图表示实际量化推理. b 图表示通用 fp32 硬件实现的量化模拟

3. Quantization range setting

Range setting 是指在量化过程中针对原来 tensor 各元素的数值范围进行截断的过程,找到所有元素的最大值和最小值,记为 、 ,量化的关键是 round error 和 clip error 的平衡过程,当范围设置较大时,clip error 小 round error 大,当范围设置小时,结果相反。但是 tensor 中的各元素有时会出现一些异常离群点,如果为了包含这些离群点将截断范围划分较大,将造成 round error 增加,因此下面描述的 Min-max 、Mse 方法提供了不同的权衡策略。这些方法通常使用优化局部 loss 函数找到最优。因为在 PTQ 中,使用快速计算的方法,而不是做端到端的训练。weight 通常在不需要校准数据的情况下进行量化,由于激活函数值依赖于输入数据,因此激活函数的量化参数通常需要少量校准数据。

  • Min-max: 为了覆盖张量的整个动态范围,我们可以定义量化参数如下:

其中 V 表示要量化的张量。这不会导致 clip error 。这种方法对异常值很敏感,因为幅值较大异常值可能会导致过大的 round error 。

  • Mean squared error(MSE): 缓解大异常值问题的一种方法是使用基于 MSE的 range setting 。通过寻找损失函数的最小值,来确定 、 。

指的是 的量化版本, 是 Frobenius norm ,一般这个优化问题使用 grid search 等方法完成。

4. PTQ的总体技术路线:

上文主要讲述了量化公式、量化模拟、range setting 等基础量化关键技术,但是只使用这些技术仍然不能获得较好性能的模型,仍然会存在一些其他的问题,例如,神经网络层中权重各元素幅值相差较大,直接量化将会产生较大的 round error,缺少校准数据集等问题。通过多种技术对量化模型进行矫正,在视觉模型和 NLP 模型上都可以取得性能优益的量化模型。因此下面给出了 PTQ的总体技术路线如下图所示:

  • Cross-layer equalization:

    应用跨层均衡(CLE),主要是解决权重矩阵中的各元素幅值差别较大的问题,其主要思路是提取缩放因子矩阵,将缩放因子矩阵传递到下一层上去计算,该预处理应用于全精度模型,使其对模型量化更加友好。CLE 特别对 depth-wise 层和 per-tensor 量化很重要,但通常对其他层和量化策略选择也有所改善。

  • Add quantizers:

    在网络中添加量化器,通常称为量化模拟,量化器主要为了测试神经网络在量化设备上的运行情况,对量化误差进行评价。量化器的选择可能取决于特定的目标硬件,对于常见的 AI 加速器,建议对权重使用对称量化器和对激活函数使用非对称量化器。

  • Weight range setting:

    在对 weight 进行 range setting 时,一般建议使用基于 MSE 的标准。在 per-channel 量化的情况下,使用 Min-Max 方法可能获得更好的效果。

  • AdaRound:

    如果有一个较小的校准数据集可用,可以使用 AdaRound 优化方法选择 weight 的 round 策略。这一步对于超低 bit(例如 4bit )量化至关重要。

  • Bias correction:

    如果没有校准数据集并且网络使了 Batch Norm,可以使用分析方法进行偏差校正

  • Activation range setting:

    激活的 range setting 是 PTQ 的最后一步,针对所有依赖于 data 的 tensor 进行 range setting。对于大多数层使用MSE标准进行 range setting,需要少量的校准数据集来计算最小的 MSE loss 。另外对于 BN 层可以使用无需数据的方法进行设置。

训练后量化(PTQ) 工作流理解


图2 标准 PTQ 工作流 蓝框表示必要步骤,绿框表示选择步骤

实验效果

对多个模型进行 PTQ 量化的结果如下表所示,可以看出 8 bit 量化的 weight 和 activation (W8A8) 的情况下,模型正确率下降较小,相比于 float32 模型模型正确率下降控制在 0.7% 以内。当使用 8 bit 量化时,per-channel 的量化方式并没有较为明显的收益。但是在超低 bit 如 W4A8 的情况下 MobileNetV2、EfficientNet lite 的 per-tensor 量化分别下降了 2.5% 和 4.2%,主要是因为这两个模型中存在较多的 depth-wise 卷积层,但是 per-tensor 的量化方式对于底层的计算优化可以带来较大收益,因此在面对这样的状况时,PTQ 量化技术不能满足用户需求。

训练后量化(PTQ) 工作流理解

图3 基于 PTQ 量化方法各模型的正确率

结论

PTQ 量化技术是首先需要考虑使用的优化工具,因为该技术可在不需要标签数据和重新训练的情况下,快速高效的实现。然而,该技术也有其局限性,有时不能获得较高的模型正确率,尤其当使用超低 bit 的激活函数量化时,很有可能不能够获取较好效果。因此在量化模型精度不足,并且有带标签数据和足够时间去重新训练量化模型时,可以使用量化感知训练(QAT)的方法进行模型量化的探索,来提高模型正确率。

欢迎点击“阅读原文”,关注Adlik Github仓库。

参考文献

  • [1] Markus Nagel, Marios Fournarakis, Rana Ali Amjad, Yelysei Bondarenko, Mart van Baalen, Tijmen Blankevoort.A White Paper on Neural Network Quantization文章来源地址https://www.toymoban.com/news/detail-475555.html

到了这里,关于训练后量化(PTQ) 工作流理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云计算工作流调度

    阅读笔记 首先,我们提出了一个更实用的混合云服务流程成本驱动调度模型,该模型在不降低VM部署弹性的情况下更精确地定义资源约束,并考虑了基于间隔的综合收费,包括计费周期和持续使用折扣。 其次,提出了一种改进的基于FWA(烟花算法)的方法来解决这一问题。在

    2024年02月02日
    浏览(71)
  • Activiti 工作流简介

    1、什么是工作流         工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 1.2、工作流系统   

    2024年02月04日
    浏览(51)
  • Docker工作流

    开发应用 编写Dockerfile 构建Docker镜像 运行Docker容器 测试应用 发布镜像到Hub 迭代更新镜像 首先你需要创建一个应用,这个应用可以是后端应用或者前端应用,任何语言都可以。 比如:我使用IDEA 创建一个Java后端应用,基于Maven构建,工程结构如下: 基于自己的工程来编写

    2024年04月29日
    浏览(36)
  • Git 工作流设计

    前言 常用的工作流有四种 集中式工作流 功能分支流 git flow 工作流 forking 工作流 集中式工作流 集中式工作流,多个功能(feat),bug修复(fix) 在一个分支上开发,极容易出现代码从冲突 功能分支流 新的功能或者bug fork出一个新的分支,在该分支上开发 功能在分支开发完后再合

    2024年02月05日
    浏览(66)
  • GitFlow工作流

    基于 Git 这一版本控制系统,通过定义不同的分支,探索合适的工作流程来完成开发、测试、修改等方面的需求。 例如:在开发阶段,创建 feature 分支,完成需求后,将此分支合并到 develop 分支上;在发布阶段,创建 release 分支,完成阶段开发任务后,将分支合并到 develop 和

    2024年02月22日
    浏览(41)
  • Git工作流

    main:生产环境,也就是你们在网上可以下载到的版本,是经过了很多轮测试得到的稳定版本。 release: 开发内部发版,也就是测试环境。 dev:所有的feature都要从dev上checkout。 feature:每个需求新创建的分支。 下面介绍一下一个新需求过来的git操作流程: 1.从dev分支上checkou

    2024年02月10日
    浏览(44)
  • 工作流引擎Flowable

    官方手册 一、依赖 二、demo 三、日志文件 在resources中添加日志文件log4j.properties Flowable流程图 Eclipse Designer, 一款Eclipse插件, 用于图形化建模, 测试与部署BPMN2.0流程 FlowableUI Flowable BPMN visualizer, 一款idea插件 从官网下载flowable-6.7.2.zip解压后, 可以看到如下两个文件 将这两个文件

    2024年02月09日
    浏览(56)
  • Git工作流(随笔)

    目录 前言 一、工作流概述 1、概念 2、分类 二、集中式工作流 1、概述 2、介绍 3、操作过程 三、功能分支工作流 1、概述 2、介绍 3、操作过程 1)创建远程分支 2)删除远程分支 四、GitFlow工作流 1、概述 2、介绍   3、操作过程 五、Forking工作流 1、概述 2、介绍 3、操作过程

    2024年02月09日
    浏览(54)
  • Activity工作流引擎

    目录 一、了解工作流 1、什么是工作流 2、工作流引擎 3、常见工作流引擎 4、Activiti7概述 4.1、Activiti介绍 4.2、建模语言BPMN 4.3、Activiti使用流程 二、Activiti7 1、Activiti使用 1.1、数据库支持 1.2、Activiti环境 1.3、Activiti常用Service服务接口 1.4、流程设计工具 2、Activiti流程操作 2.1、

    2024年02月13日
    浏览(48)
  • 工作流flowable实现撤回

    Flowable是一个开源的工作流引擎,可以实现工作流程的自动化管理,包括任务分配、流转、审批等。如果需要实现撤回功能,可以考虑以下方案: 在流程定义中添加一个撤回节点,允许任务的发起人在任务未被处理前撤回任务。当发起人选择撤回任务时,任务将被撤回至撤回

    2024年02月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包