【AI系统】训练后量化与部署

简介: 本文详细介绍了训练后量化技术,涵盖动态和静态量化方法,旨在将模型权重和激活从浮点数转换为整数,以优化模型大小和推理速度。通过KL散度等校准方法和量化粒度控制,文章探讨了如何平衡模型精度与性能,同时提供了端侧量化推理部署的具体实现步骤和技术技巧。

本文将会重点介绍训练后量化技术的两种方式:动态和静态方法,将模型权重和激活从浮点数转换为整数,以减少模型大小和加速推理。并以 KL 散度作为例子讲解校准方法和量化粒度控制来平衡模型精度和性能。

训练后量化的方式

训练后量化的方式主要分为动态和静态两种。

动态离线量化

动态离线量化(Post Training Quantization Dynamic, PTQ Dynamic)仅将模型中特定算子的权重从 FP32 类型映射成 INT8/16 类型,主要可以减小模型大小,对特定加载权重费时的模型可以起到一定加速效果。但是对于不同输入值,其缩放因子是动态计算。动态量化的权重是离线转换阶段量化,而激活是在运行阶段才进行量化。因此动态量化是几种量化方法中性能最差的。

不同的精度下的动态量化对模型的影响:

  • 权重量化成 INT16 类型,模型精度不受影响,模型大小为原始的 1/2;
  • 权重量化成 INT8 类型,模型精度会受到影响,模型大小为原始的 1/4。

image

动态离线量化将模型中特定算子的权重从 FP32 类型量化成 INT8 等类型,该方式的量化有两种预测方式:

  1. 反量化推理方式,即是首先将 INT8/FP16 类型的权重反量化成 FP32 类型,然后再使用 FP32 浮运算运算进行推理;

  2. 量化推理方式,即是推理中动态计算量化算子输入的量化信息,基于量化的输入和权重进行 INT8 整形运算。

静态离线量化

静态离线量化(Post Training Quantization Static, PTQ Static)同时也称为校正量化或者数据集量化,使用少量无标签校准数据。其核心是计算量化比例因子,使用静态量化后的模型进行预测,在此过程中量化模型的缩放因子会根据输入数据的分布进行调整。相比量化训练,静态离线量化不需要重新训练,可以快速得到量化模型。

$$ uint8 = round(float/scale) - offset \\ $$

静态离线量化的目标是求取量化比例因子,主要通过对称量化、非对称量化方式来求,而找最大值或者阈值的方法又有 MinMax、KL 散度、ADMM、EQ,MSE 等方法。

静态离线量化的步骤如下:

  1. 加载预训练的 FP32 模型,配置用于校准的数据加载器;
  2. 读取小批量样本数据,执行模型的前向推理,保存更新待量化算子的量化 scale 等信息;
  3. 将 FP32 模型转成 INT8 模型,进行保存。

image

一些常用的计算量化 scale 的方法:

量化方法 方法详解
$abs_{max}$ 选取所有激活值的绝对值的最大值作为截断值α。此方法的计算最为简单,但是容易受到某些绝对值较大的极端值的影响,适用于几乎不存在极端值的情况。
$KL \quad$ 使用参数在量化前后的 KL 散度作为量化损失的衡量指标。此方法是 TensorRT 所使用的方法。在大多数情况下,使用 KL 方法校准的表现要优于 $abs_{max}\quad$ 方法。
$avg \quad$ 选取所有样本的激活值的绝对值最大值的平均数作为截断值α。此方法计算较为简单,可以在一定程度上消除不同数据样本的激活值的差异,抵消一些极端值影响,总体上优于 $abs_{max}\quad$ 方法。

量化粒度

量化参数可以针对层的整个权重张量计算,也可以针对每个通道分别计算。在逐张量量化中,同一剪切范围将应用于层中的所有通道。在模型量化过程中分为权重量化和激活量化:

  • 权重量化:即需要对网络中的权重执行量化操作。可以选择逐张量(per-tensor)或者逐通道(per-channel)的量化粒度,也就是说每个通道选取一个量化 scale。对于卷积神经网络,per- channel 通常对应通道轴。在任何一种情况下,量化因子的精度都是 FP32。per-channel 的量化粒度比 per-tensor 的更细粒度,模型效果更好,但带来的是推理过程中的计算复杂度增加。需要注意的是部分部署硬件有可能不支持 per-channel 量化推理。

  • 激活量化:即对网络中不含权重的激活类算子进行量化。一般采用逐张量(per-tensor)的粒度,也可以选择逐 token(per-token)的量化粒度。

image

KL 散度校准法

下面以静态离线量化中的 KL 散度作为例子,看看静态离线量化的具体步骤。

KL 散度原理

KL 散度校准法也叫相对熵,其中 p 表示真实分布,q 表示非真实分布或 p 的近似分布:

$$ 𝐷_{KL} (P_f || Q_q)=\sum\limits^{N}_{i=1}P(i)*log_2\frac{P_f(i)}{Q_q(i)}\\ $$

相对熵,用来衡量真实分布与非真实分布的差异大小。目的就是改变量化域,实则就是改变真实的分布,并使得修改后得真实分布在量化后与量化前相对熵越小越好。

流程和实现

  1. 选取验证数据集中一部分具有代表的数据作为校准数据集(Calibration);
  2. 对于校准数据进行 FP32 的推理,对于每一层:
    1. 收集 activation 的分布直方图;
    2. 使用不同的阈值来生成一定数量的量化好的分布;
    3. 计算量化好的分布与 FP32 分布的 KL divergence;
    4. 选取使 KL 最小的阈值作为 saturation 的阈值。

主要注意的点:

  • 需要准备小批量数据(500~1000 张图片)校准用的数据集;
  • 使用校准数据集在 FP32 精度的网络下推理,并收集激活值的直方图;
  • 不断调整阈值,并计算相对熵,得到最优解

通俗地理解,算法收集激活 Act 直方图,并生成一组具有不同阈值的 8 位表示法,选择具有最少 KL 散度的表示;此时的 KL 散度在参考分布(FP32 激活)和量化分布之间(即 8 位量化激活)之间。

KL 散度校准法的伪代码实现:

Input: FP32 histogram H with 2048 bins: bin[0], … , bin[2047]

For i in range(128, 2048):
     reference distribution P = [bin[0], …, bin[i-1]]
     outliers count = sum(bin[i], bin[i+1], …, bin[2047])
     reference distribution P[i-1] += outliers count 
     P /= sum(P)
     candidate distribution Q = quantize [bin[0], …, bin[i-1]] into 128 levels
     expand candidate distribution Q to I bins
     Q /= sum(Q)
     divergence[i] = KL divergence(reference distribution P, candidate distribution Q)
End For

Find index m for which divergence[m] is minimal

threshold = (m+0.5) * (width of a bin)

端侧量化推理部署

推理结构

端侧量化推理的结构方式主要由 3 种,分别是下图 (a) FP32 输入 FP32 输出、(b) FP32 输入 INT8 输出、(c) INT8 输入 INT32 输出

image

INT8 卷积如下图所示,里面混合里三种不同的模式,因为不同的卷积通过不同的方式进行拼接。使用 INT8 进行 inference 时,由于数据是实时的,因此数据需要在线量化,量化的流程如图所示。数据量化涉及 Quantize,Dequantize 和 Requantize 等 3 种操作:

image

量化过程

量化

将 FP32 数据量化为 INT8。离线转换工具转换的过程之前,根据量化原理的计算出数据量化需要的 scale 和 offset:

$$ scale = (x_{max}-x_{min})/(Q_{max}-Q{min}) \\ $$

$$ offset = Q_{min}-round(\frac{x_{min}}{scale})\\ $$

$$ uint8 = round(\frac{float}{scale})-offset\\ $$

$$ float=scale \times (uint+offset)\\ $$

反量化

INT8 相乘、加之后的结果用 INT32 格式存储,如果下一个算子需要 FP32 格式数据作为输入,则通过 Dequantize 反量化操作将 INT32 数据反量化为 FP32。Dequantize 反量化推导过程如下:

$$ \begin{align*} y &= x \cdot w \\ &= x_{\text{scale}} \cdot (x_{\text{int}} + x_{\text{offset}}) \cdot w_{\text{scale}} \cdot (w_{\text{int}} + w_{\text{offset}})\\ &= (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot (x_{\text{int}} + x_{\text{offset}}) \cdot (w_{\text{int}} + w_{\text{offset}})\\ &= (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot (x_{\text{int}} \cdot w_{\text{int}} + x_{\text{int}} \cdot x_{\text{offset}} + w_{\text{int}} \cdot x_{\text{offset}} + w_{\text{offset}} \cdot x_{\text{offset}})\\ &= (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot (INT32_{result} + x_{\text{int}} \cdot x_{\text{offset}} + w_{\text{int}} \cdot x_{\text{offset}} + w_{\text{offset}} \cdot x_{\text{offset}})\\ &\approx (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot INT32_{result} \end{align*}\\ $$

重量化

INT8 乘加之后的结果用 INT32 格式存储,如果下一层需要 INT8 格式数据作为输入,则通过 Requantize 重量化操作将 INT32 数据重量化为 INT8。重量化推导过程如下:

$$ \begin{align*} y &= x \cdot w \\ &= x_{\text{scale}} \cdot (x_{\text{int}} + x_{\text{offset}}) \cdot w_{\text{scale}} \cdot (w_{\text{int}} + w_{\text{offset}}) \\ &= (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot (x_{\text{int}} + x_{\text{offset}}) \cdot (w_{\text{int}} + w_{\text{offset}}) \\ &= (x_{\text{scale}} \cdot w_{\text{scale}}) \cdot INT32_{\text{result}} \end{align*}\\ $$

其中 y 为下一个节点的输入,即 $y=x_{next}\quad\quad$:

$$ y=y_{scale}*(y_{int}+y_{offset})\\ $$

这里是对 $y$ 进行量化,$x_{next int}=y_{int}\quad$,有:

$$ x_{next int}=\frac{x_{scale} \cdot w_{scale}}{x_{next scale}}\cdot INT32_{result}-x_{next offset}\\ $$

因此重量化需要本算子输入 input 和 weight 的 scale,以及下一个算子的 input 输入数据的 scale 和 offset。

训练后量化的技巧

  1. 对权重使用每通道(per-channel)粒度,对激活使用每张量(per-tensor)粒度

    权重张量在不同通道中的值分布差异很大,如果使用单一的缩放因子进行量化,可能会导致较大的精度损失。通过对权重使用每通道粒度,可以在量化过程中更好地保留每个通道内的值分布。此外,推理框架会将每通道的缩放因子整合到 kernel 中,因此在推理过程中不会增加计算开销。由于神经网络通常会使用权重衰减,通道内的权重分布一般较为集中,因此使用最大校准器来捕捉所有动态范围对权重进行量化是有益的。

    另一方面,激活在不同通道之间通常较为一致,但会包含来自不同输入数据的异常值。对每层激活张量使用单一的缩放因子,有助于减小异常值的影响,特别是使用基于直方图的方法。此外,由于这些缩放因子不能整合到 kernel 中,仅对每个张量使用一个缩放因子可以减少计算开销。

  2. 通过替换块分别量化残差连接

    残差连接是许多神经网络模型(如 ResNet)中的重要组成部分,因为它们有助于减轻训练期间可能出现的梯度消失问题。然而,在量化过程中,残差连接可能会带来挑战。这是因为像英伟达的 TensorRT 这样的推理框架需要对所有操作使用单一的数据类型,以便将它们融合到一个内核中。如果残差连接使用的数据类型与模型中的其他层不同,则可能会阻止这些层的融合,从而导致性能下降。

    解决这个问题的最好方法是将残差连接与模型中的其他层分开量化。这可以通过替换每个残差连接为一个包含量化后的恒等映射的量化块来实现,将其添加到量化块的输入中。通过这样做,残差连接可以被量化为与其他层相同的数据类型,从而允许它们融合在一起并提高性能。

  3. 识别敏感层并跳过它们的量化

    虽然许多层可以在不牺牲太多精度的情况下有效地量化,但某些层在量化过程中可能会带来挑战。这些层包括模型中的瓶颈层,以及需要较高精度以保持准确性的操作层。

    一个常见的例子是检测模型的最后一层,该层执行边界框坐标回归。这一层通常需要高精度以准确预测目标边界框的坐标,量化它可能会导致显著的精度损失。因此,通常建议跳过这一层的量化。

    为了确定特定模型中哪些层可能对量化敏感并需要跳过,通常需要进行敏感性分析。这包括对模型进行量化,并在验证集上评估其精度,以确定哪些层受量化的影响最大。敏感性分析的一种常见方法是分层分析技术,这涉及逐层量化模型并在每一步评估其精度,从而帮助识别对量化最敏感的层并需要跳过的层。

如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~

目录
相关文章
|
2天前
|
人工智能 自然语言处理 并行计算
ASAL:Sakana AI 联合 OpenAI 推出自动探索人工生命的系统,通过计算机模拟生命进化的过程
ASAL 是由 Sakana AI 联合 OpenAI 等机构推出的自动化搜索人工生命系统,基于基础模型实现多种搜索机制,扩展了人工生命研究的边界。
34 1
ASAL:Sakana AI 联合 OpenAI 推出自动探索人工生命的系统,通过计算机模拟生命进化的过程
|
4天前
|
人工智能 数据库连接 API
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
在部署《主动式智能导购 AI 助手构建》解决方案的过程中,整体体验还是相对顺畅的,但确实遇到了一些问题,文档提供的引导也有所不足,以下是详细的体验评估
|
5天前
|
机器学习/深度学习 人工智能 搜索推荐
AI在电子商务中的个性化推荐系统:驱动用户体验升级
AI在电子商务中的个性化推荐系统:驱动用户体验升级
52 17
|
5天前
|
人工智能 安全 机器人
OpenAI重拾规则系统,用AI版机器人定律守护大模型安全
在人工智能领域,大语言模型(LLM)展现出强大的语言理解和生成能力,但也带来了安全性和可靠性挑战。OpenAI研究人员提出“规则基于奖励(RBR)”方法,通过明确规则引导LLM行为,确保其符合人类价值观和道德准则。实验显示,RBR方法在安全性与有用性之间取得了良好平衡,F1分数达97.1。然而,规则制定和维护复杂,且难以完全捕捉语言的多样性。论文:https://arxiv.org/pdf/2411.01111。
39 13
|
8天前
|
机器学习/深度学习 传感器 人工智能
AI视频监控系统在养老院中的技术实现
AI视频监控系统在养老院的应用,结合了计算机视觉、深度学习和传感器融合技术,实现了对老人体征、摔倒和异常行为的实时监控与分析。系统通过高清摄像头和算法模型,能够准确识别老人的动作和健康状况,并及时向护理人员发出警报,提高护理质量和安全性。
57 14
|
5天前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
75 10
|
5天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
转载:【AI系统】AI的领域、场景与行业应用
本文概述了AI的历史、现状及发展趋势,探讨了AI在计算机视觉、自然语言处理、语音识别等领域的应用,以及在金融、医疗、教育、互联网等行业中的实践案例。随着技术进步,AI模型正从单一走向多样化,从小规模到大规模分布式训练,企业级AI系统设计面临更多挑战,同时也带来了新的研究与工程实践机遇。文中强调了AI基础设施的重要性,并鼓励读者深入了解AI系统的设计原则与研究方法,共同推动AI技术的发展。
转载:【AI系统】AI的领域、场景与行业应用
|
11天前
|
机器学习/深度学习 人工智能 算法
探索AI在医疗诊断中的应用与挑战
【10月更文挑战第21天】 本文深入探讨了人工智能(AI)技术在医疗诊断领域的应用现状与面临的挑战,旨在为读者提供一个全面的视角,了解AI如何改变传统医疗模式,以及这一变革过程中所伴随的技术、伦理和法律问题。通过分析AI技术的优势和局限性,本文旨在促进对AI在医疗领域应用的更深层次理解和讨论。