整数量化:深度探讨
在过去几年来,变压器量化领域发生了很多变化,从几乎无法以 INT8 量化一个 70 亿参数的模型而没有破坏准确性,到现在常规地将一个 700 亿参数的模型压缩到 4 位并在单个 GPU 上运行。但现有的指南往往比较零散:要么只关注某一种特定的技术,要么只介绍如何使用某个库。我已经在固定点硬件的整数量化方面工作了一段时间,我的目标是通过这一系列文章来弥补这一空白:仔细构建核心思想,追踪这个领域是如何发展的,每种技术都是针对前面问题的动机。第一篇文章覆盖了基础知识:什么是量化,为什么它很困难,以及其背后的数学。什么是量化,以及你为什么应该关心它? ¶ 量化是使用更少的位数表示高精度值的过程。在实践中,这意味着以较低精度存储权重和(可选)激活值(例如,使用 int8 而不是 fp16),这会引入一些小的近似误差。量化最直接且容易实现的好处是内存减少。作为一个经验法则,具有 N 亿个参数的模型在 16 位精度下存储时大约需要 2 × N GB 的内存。将其量化为 8 位或 4 位分别可将内存占用减少 2 倍和 4 倍。还有一个硬件优势。2014 年,斯坦福大学的马克·霍洛维茨(Mark Horowitz)发表了一篇论文《计算的能量问题》,研究了浮点操作与整数操作:在 45nm CMOS 节点上各种操作的能量成本。来源:计算的能量问题。因此,整数算术消耗的能量更少,具体来说,int8 加法消耗的能量是 fp32 加法的 30 倍更少,int8 乘法消耗的能量是 fp32 乘法的 18 倍更少。低精度硬件比浮点硬件速度更快,并且消耗更少的硅面积。这些好处如何转化为实际收益?这取决于瓶颈:计算密集型工作负载(例如 CNN、LLM 预填充):量化可以提高吞吐量,因为低精度运算更快且能耗更少。内存带宽受限的工作负载(例如 LLM 解码):量化减少了移动的数据量,从而通过降低内存带宽压力来改善性能。到目前为止,动机应该很清楚:量化减少了内存,降低了能耗,并且可以提升性能。接下来,我们将看看执行固定点算术运算的硬件单元。乘加单元 ¶ 神经网络中占主导地位的操作是矩阵乘法。现代硬件加速器使用称为乘加(MAC)单元的专用单元来优化此操作:神经网络加速器硬件中的矩阵-向量计算。来源:《神经网络量化白皮书》该图表示了神经网络加速器中典型的矩阵-向量乘法单元。这是矩阵乘法和卷积的基本构建块。两个基本组件是处理单元 C_{n,m} 和累加器 A_n。计算过程如下:首先用偏置值 b_n 初始化累加器。在下一个周期,将权重 W_{n,m} 和输入值 x_m 加载。它们的乘积在每个处理单元中计算:C_{n,m} = W_{n,m} · x_m。然后将结果累加:A_n = b_n + ∑_{m} C_{n,m}。那么量化是如何完成的? ¶ 从实值向量 x 开始,我们将其映射到整数网格 {x_{int}^{min}, …, x_{int}^{max}}:x_{int} = clamp(⌊x/s⌋ + z, x_{int}^{min}, x_{int}^{max})。在这里:s 是比例,z 是零点(偏移),⌊⋅⌋ 表示四舍五入到最接近的整数。clamp 操作确保结果位于有效整数范围内。因此,思路是缩放和移动浮点值,然后将其限制在整数网格内。量化仿真(伪量化)¶ 我们通常在通用硬件上使用高层框架(如 PyTorch)来模拟量化,而不是直接在目标硬件上运行量化模型。这通常称为伪量化。核心思路很简单:我们模拟量化的效果,同时仍使用浮点数执行操作。这使我们能研究准确性并进行像量化感知训练(QAT)这样的实验,而不需要专用硬件。为了做到这一点,我们:将输入量化到整数网格,解量化回浮点数,在标准硬件(如 GPU)上以浮点方式执行所有计算。解量化步骤将整数映射回实值:egin{equation} ilde{x} = s imes (x_{int} - z) ext{。}egin{equation}结合量化和解量化,我们得到:egin{equation} ilde{x} = q(x; s, z) = s imes [clamp(⌊x/s⌋ + z, x_{int}^{min}, x_{int}^{max})]
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡