fp32的整数表征

introduction 前几天遇到个问题,用fp32来模拟int整数的时候溢出,直观来向fp32的整数范围不是很大吗指数位最大有127位,怎么会发生溢出呢?实际上fp32的帧数表征在大于INT24之后分辨率并不是1,也就是说无法连续的表示整数,这个模拟会是有损的 analysis fp32 IEEE754表示法 $$ \begin{align} float_number = 1.m \times 2^{E} \end{align} $$ 这里m是23位 E是7位二进制加上一个偏置,实际范围是-128,127 实际上exponent部分是指数表示的,$2^n$ 和$2^{n+1}$ 之间相差很大 这里分辨率其实是mantassia小数位决定的 如果你想表示int24 那么其实就是$1.00000 \times 2^24$ 如果想表示int24+1 应该写成$(1+2^{-24}) \tims 2^24$ 这里因为小数位的最高精度只有$2^{-23}$ 他能表示的下一个整数是$(1+2^{-23})\times int24 = int24+2$ 这个时候需要增加小数位的位数来提升整数表示的精度(分辨率) 更为一般性的推导 我们想知道 在往上的整数间隔

November 20, 2022

Modeling Quant in hardware

Introduction 一般在定点硬件上矩阵乘法都是用定点数来乘的,可以设计成一个定点模型 例如 $$ \begin{align} q_o = q_i * q_w * 2»shift \end{align} $$ 这里假设硬件只支持Power of 2的scale 这个式子是怎么和浮点乘法联系起来的呢,本篇试图逆向去推出一个浮点和定点乘法的关系,用浮点去模拟这个定点乘法 用浮点QDQ模拟定点乘法 原始的浮点乘法: $$ \begin{align} r_i * r_w ==> [s_i * q_i] * [s_w * q_w] \end{align} $$ 输出的量化参数在PTQ是我们提前校准好的,这里直接做一次qdq $$ \begin{align} q_o = [s_i * q_i] * [s_w * q_w] / s_o \end{align} $$ $$ \begin{align} \hat{r_o} = q_o * s_o = [s_i * q_i] * [s_w * q_w] / s_o * s_o \end{align} $$ 这里看出来对输入和输出别添加qdq节点,等价于定点乘法,误差都来自三次quant带来的clip和round误差 其中式4可以看成 $$ \begin{align} q_o = q_i * q_w * [s_i * s_w / s_o] \end{align} $$ 这里假设$s_i * s_w * 2»{shift} = s_o$ , 即这种qdq浮点模型与公式1的定点模型等价 ...

November 20, 2022

My First Post

Introduction This is bold text, and this is emphasized text. Visit the Hugo website!

November 20, 2022

Quant Error: from a numerical pespective

quant expression 神经网络的量化的本质是将floating representation的数值表征换一种数值表征,以达到降低内存或者加速推理的作用。 线性量化是现在最常用的量化方式,他利用线性变换将浮点数映射到一定bit的整数范围,并且可以反变换到离散的浮点数表征。线性量化的参数计算: $$ \begin{align} scale = \frac{range(float)}{range(int)} \end{align} $$ scale是1 bit整数对应的浮点步长 量化表达式: $$ \begin{align} x_{rec} = clip(round(\frac {x}{scale}),dtype) * scale \end{align} $$ $$ \begin{align} x_{int} = clip(round(\frac {x}{scale}),dtype) \end{align} $$ 其中就数值运算而言,线性量化的误差来自两个方面,一个是取整的rounding操作,另一个是截断的clip操作。 rounding error 这里令 $ k = \frac{x}{scale} $, $ z = round(k) $ 这里有, $$ \begin{align} k - \frac{1}{2} < z < k+\frac{1}{2} \end{align} $$ $$ \begin{align} k * scale - \frac{1}{2} * scale < z * scale < k * scale+\frac{1}{2} * scale \end{align} $$ $$ \begin{align} | k * scale - z * scale | = | x - x_{rec} | = | \epsilon_{r } | < \frac{1}{2} * scale \end{align} $$ 这里可以得出rounding引起的 量化前后的浮点误差和量化步长成正比,即scale减少scale可以减rounding带来的误差,当然这是在不考虑clipping操作的前提下,也就是我们假设校准数据足够准确,覆盖整个数据range。 其中 ...

November 20, 2022