ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第 5 篇:为什么要量化(零门槛入门系列)

第 5 篇:为什么要量化(零门槛入门系列) 上一篇第 4 篇《并行4 个工人 ≠ 快 4 倍》 下一篇第 6 篇《矩阵乘法从三重循环到一条指令》一句话导读量化就是每个数用更少的位来表示牺牲一点精度换来同样的一块地方能装下更多的数——省的不是算力是搬运量。关键词量化、反量化、步长、误差、搬运上一篇说人越多不一定越快。可还有一个更直接的办法让每个人要搬的东西本身变少。这一篇讲怎么用更少的位表示同一个数以及这么做必然要付的代价。① 一句话概念量化 每个数用更少的位表示省的是搬运量。② 起点一张被抹掉零头的价目表食堂墙上贴着一张价目表原来写的是红烧肉 12,345.678 元。后来老板嫌写得麻烦改成红烧肉 12346 元。舍掉的那点小数谁也不会在意但好处很实在每个条目占的地方小了同样一张纸原来只够写 8 个菜现在能写 16 个。客人看价目表时心里清楚这个数是被抹过零头的也知道被抹掉的永远只是小数点后面那几位不影响点菜。这就是这件事的全部用更粗的刻度去记数每个数占的地方小一半代价是每个数都带着一点误差。关键在于刻度选多粗——选得太粗便宜菜和贵菜可能被记成同一个价选得太细省下的地方又不够多。而且这件事的意义只在一个前提下落了地这些东西要来回搬。如果它们本来就放在你手边记多精细都无所谓。③ 伪代码量化一次、反量化一次量化(x, 步长) - 四舍五入(x / 步长) # 变成一个小整数 反量化(q, 步长) - q * 步长 # 再变回一个近似值 步长 选一个合适的刻度 # 选大了误差大选小了装不下 整数 量化(原值, 步长) # 每个数改用小整数表示 近似值 反量化(整数, 步长) # 要用的时候变回来 16 位 - 8 位同一块内存能装下的数变成 2 倍量化的全过程就是一次吸格点如图 1 所示。图 1数轴上的量化用步长把小数吸到格点一条水平数轴上等距的刻度就是步长 1/8划出的 9 个格点0.000~1.000上方几个红点是原始小数每个红点都有一条向下的虚线箭头画出它被吸到最近的哪个格点图下方两个方框分别是量化q 四舍五入(x / 步长)和反量化x q × 步长底部一句最大误差 半个步长这里 0.0625。省下来的地方有多直观如图 2 所示。图 216 位 → 8 位同样字节数装下两倍数上下两行的总宽度相同图上用两个虚线框圈出这两行——上行是 8 个宽格16 位一个数8 个数字吃掉 8 格下行在同样的总宽度里排了 16 个窄格8 位一个数格子的总数翻倍代价是每格的刻度变粗底部红框注明每个数都只能落在格点上误差不超过半个步长。逐行要点步长 选一个合适的刻度步长scale是量化的灵魂。它就是一个格子的宽度。步长大格子少能表示的区间宽但每个数都粗糙步长小格子密数更接近原值但更费地方。四舍五入(x / 步长)量化的动作本身只有这一除法加一次取整。得到的是第几个格子也就是一个小整数。这个整数就是以后真正存下来的东西。q * 步长反量化——把格子号还原成数值。注意还原出来的值一般不会等于原值差的那一点就是误差。不同块的格子号对应的刻度不同不能直接比较或相加。16 位 - 8 位这是量化最直观的收益。每个数占的位bit少一半同一块内存里能装的数就多一倍反过来看要把全部权重搬一遍需要搬的次数也就少了一半。省的是搬运量不是算得多快。为什么这么在意搬运在边缘设备上模型里绝大部分时间是把权重从存放的地方挪到能参与计算的地方。数越大要挪的东西就越多。模型越大这条规律越致命——这就是边缘设备上必须量化的全部理由。④ 纸笔实验必做设定把 0 到 1 之间这 8 个数用步长1/8表示。请写出每个数的量化值、反量化值以及最大误差。原始值0.06、0.19、0.32、0.44、0.55、0.68、0.81、0.93手算以 0.32 为例0.32 ÷ (1/8) 0.32 ÷ 0.125 2.56四舍五入得量化值3反量化3 × 0.125 0.375误差0.375 − 0.32 0.055。预期结果原始值0.060.190.320.440.550.680.810.93量化值02344567反量化值00.250.3750.50.50.6250.750.875误差0.060.060.0550.060.050.0550.060.055最大误差 0.06而半个步长是 0.0625——误差确实没超过半个步长。注意两件事一是 8 个原始数最后只落在 7 个格子上格 4 被 0.44 与 0.55 共用格 1 空着二是格点 0~8 把 0 到 1 分成 8 档而我们能用的格子号是 0~7 这 8 个——号 8对应 1.000要多花一位才存得下。所以如果来一个 0.99它本该被吸到 8 号格点超出了可用的格子号范围只能强行截断到 7误差一下子变成 0.115。这就是量化的边界问题格子不够用时只能夹住不能溢出。可选 REPL 版任意语言直接跑值 [0.06, 0.19, 0.32, 0.44, 0.55, 0.68, 0.81, 0.93] 步长 1 / 8 对每个 x 于 值: 整数 四舍五入(x / 步长) 还原 整数 * 步长 打印(x, 整数, 还原, 误差, 四舍五入(x - 还原, 3))预期最后一列的绝对值的最大值是 0.06。⑤ 进阶锚点进阶锚点本篇概念在《30 天手搓推理引擎》Day 5里被真正实现——5-1 为什么必须 Q4/Q8边缘推理的带宽瓶颈/5-2 Q8 对称量化scale 从哪来/5-3 参考实现对拍怎么读懂 rel err 的数量级。入门版到这里就够了进阶版会多出步长怎么从真实数据里算出来不是拍一个、相对误差这个指标怎么读、以及板端带宽数据与实际档位取舍来自仓库 docs 报告口径。想动手 → 仓库https://gitee.com/pei-xiaoguang/kestrel-llm从 Day 1 开始。本篇那个选刻度的直觉在进阶 Day 5 会变成一段能算 scale 的代码。下篇预告数变小了可要算的量没变——一个数要陪着几百个数反复做乘法。第 6 篇讲矩阵乘法的三重循环以及那两条唯一的提速路。
返回列表