加载一个700亿参数的模型,光是把它读进内存,就要耗费大量的时间和空间。这个问题怎么解决?量化(Quantization)就是为此引入的思路。 这篇文章是我自己尝试把量化理解透彻,再尽量用简单的话讲清楚——包括它底层做了什么,以及它凭什么能在压缩精度的同时保住模型准确率。 最常见的误解是:量化等于删掉模型里的参数。其实不是。具体来说,量化是把高精度的参数(比如32位浮点数)转换成低精度的表示(比如8位或4位整数)。这能减少的是存储和计算的开销,而不是参数量本身。 在往下讲之前,你需要先知道浮点数内部到底长什么样。每个浮点数本质上就是二进制下的科学计数法: value = (-1)^sign × 1.mantissa × 2^exponent 其中包含三个部分: - Sign(符号位)——表示正负; - Exponent(指数位)——决定这个数能有多大,控制取值范围; - Mantissa(尾数位/有效数字)——决定在这个范围内能区分多细的差异,控制精度。 尾数位越多,能分辨的数值间隔就越小;指数位越多,能表达的数量级就越大,不容易溢出或下溢。 FP8格式里常见的“E4M3”和“E5M2”命名,意思就是指数位和尾数位之间如何分配bit。 为什么E4M3和E5M2的分配方式有讲究?因为模型前向传播中的权重和激活值,在量级上通常比较稳定,所以E4M3多给一位尾数,能进一步提升精度;而训练过程中的梯度可能跨越极大的量级范围,E5M2选择牺牲一点精度换取更大范围,以避免梯度变成无穷大或者零。 说到底,量化的核心机制是:用一个缩放因子(scale,有时还加一个零点zero-point),把连续的浮点数值范围,映射到一小撮整数上。当数值分布大致围绕零点对称时(权重通常如此),就采用对称映射——浮点范围以零为中心,两侧等距地映射过去,不再需要额外偏移。

打开网易新闻 查看精彩图片