量化基础:什么是模型量化?FP32、INT8、BINARY的区别与选择
好,咱们正式开始聊量化。很多刚接触FINN的朋友,一上来就被各种精度搞懵了——FP32、INT8、BINARY,到底选哪个?
我刚开始做FPGA部署那会儿,也踩过这个坑。总觉得精度越高越好,结果模型是跑起来了,但资源消耗大得离谱,延迟根本压不下去。后来才明白,量化不是简单的精度打折,而是一场关于效率的精准博弈。
一、模型量化到底在做什么?
说白了,量化就是把模型里那些「养尊处优」的浮点数,换成「吃苦耐劳」的定点数或整数。
你想想看,一个FP32的权重占4个字节,换成INT8就只占1个字节。在FPGA上,这直接意味着——同样的芯片面积,你能塞下4倍多的参数。或者反过来,同样的模型,你只需要1/4的存储和带宽。
核心思想:用更少的比特数,去近似表达原来的数值范围。代价是精度会损失一点点,但换来的是硬件效率的指数级提升。
我在项目中遇到过最典型的场景:一个检测模型,FP32版本在GPU上跑30FPS,换成INT8量化后,在Xilinx的Zynq上跑到了120FPS。虽然mAP掉了0.8%,但实时性完全上了一个台阶。
二、FP32、INT8、BINARY,到底差在哪?
咱们直接上对比,这样最清楚。
| 特性 | FP32 | INT8 | BINARY |
|---|---|---|---|
| 位宽 | 32位 | 8位 | 1位 |
| 数值范围 | 约 ±3.4×10³⁸ | -128 ~ 127 | 0 或 1(或 -1 和 +1) |
| 精度损失 | 无(基准) | 较小,通常可接受 | 较大,需要特殊训练 |
| 硬件资源 | 极高(DSP消耗大) | 中等(适合LUT实现) | 极低(XNOR运算) |
| 典型场景 | 原型验证、高精度需求 | 大多数边缘部署 | 超低功耗、极致吞吐 |
三、FP32:基准线,但不是终点
FP32是咱们的「黄金标准」。训练时几乎都用它,因为动态范围大,梯度更新稳定。
但部署到FPGA上?我个人习惯是——除非万不得已,否则别直接用FP32。为什么?
- 一个乘法器(DSP48E2)做一次FP32乘加,延迟比INT8高3-5倍
- BRAM带宽有限,FP32权重占用的存储是INT8的4倍
- FPGA上浮点运算单元本来就少,硬怼FP32等于自废武功
我的经验:FP32只适合做两件事——一是作为量化后的精度对比基准,二是在某些对精度极其敏感的层(比如第一层输入)保留少量FP32计算。其他情况,能量化就量化。
四、INT8:最实用的「甜点区」
INT8是目前工业界最主流的量化方案。为什么?因为它在精度和效率之间找到了一个绝佳的平衡点。
你想想看,INT8的数值范围是-128到127,对于大多数神经网络权重来说,这个范围其实够用了。权重分布通常集中在0附近,只要做好校准(Calibration),把浮点数的分布映射到INT8的范围内,精度损失往往在1%以内。
我记得有一次做语义分割模型,FP32的mIoU是72.3%,INT8量化后是71.8%。只掉了0.5%,但推理速度从15FPS飙到了60FPS。这种交换,我觉得很值。
在FINN中,INT8量化通常走的是均匀量化路线:
# 伪代码示意
scale = (max_val - min_val) / 255
zero_point = round(-min_val / scale)
quantized_val = round(float_val / scale) + zero_point
注意:INT8量化不是万能的。如果你的模型权重分布特别不均匀(比如某些层数值差异超过100倍),那直接做均匀量化效果会很差。这时候可以考虑非均匀量化或者逐通道量化。
五、BINARY:极致压榨,但门槛高
BINARY量化,就是把权重和激活值都变成1比特——要么是+1,要么是-1。这听起来很疯狂,对吧?
我第一次看到BINARY网络时,第一反应是「这能收敛?」后来试了一下,发现还真行。虽然精度确实掉得厉害(通常比FP32低5-10%),但硬件效率简直逆天。
为什么?因为BINARY网络的核心运算变成了XNOR + 位计数。在FPGA上,这可以用LUT直接实现,连DSP都不需要。一个时钟周期能处理几十个比特的并行计算。
我曾在某个超低功耗项目里用过BINARY网络。一个简单的分类模型,在Artix-7上跑到了2000+ FPS,功耗才不到1W。但代价是——模型需要从头用特殊方法训练(比如用STE近似梯度),而且对网络结构有严格要求。
一句话总结:BINARY适合那些对精度要求不高(比如80%准确率就够用),但对功耗和吞吐有极致追求的场景。比如传感器端的实时分类、唤醒词检测等。
六、怎么选?我的决策框架
很多同学问我:「老师,我该用哪种量化?」
我的回答是——先问自己三个问题:
- 精度底线是多少? 如果精度损失不能超过1%,那老老实实走INT8。如果允许5%以上的损失,可以考虑BINARY。
- 硬件资源有多紧张? 如果DSP和BRAM管够,INT8是首选。如果资源极度受限(比如只有几千个LUT),那BINARY可能是唯一选择。
- 开发周期有多长? INT8有成熟的工具链(比如FINN的量化流程),几天就能搞定。BINARY需要特殊训练技巧,调试周期可能以周计。
我个人习惯是:先用INT8试水。如果精度达标,那就用INT8。如果精度不够,再考虑混合精度(部分层用FP32,部分层用INT8)。如果资源实在不够,再上BINARY。
避坑指南:我曾经在一个项目里,为了追求极致压缩,直接上了BINARY。结果模型训练了两个月,精度始终差5%。后来换成INT8 + 剪枝,两周就搞定了,精度只掉了1.2%。所以——别为了炫技而选BINARY,除非你真的需要那个极限性能。
七、小结
量化不是玄学,它是一套有章可循的工程方法。FP32是基准,INT8是主力,BINARY是特种兵。选哪个,取决于你的精度需求、硬件资源和开发周期。
下一章,咱们会深入FINN的量化流程,看看具体怎么把FP32模型一步步变成INT8的硬件部署方案。到时候我会拿一个实际项目案例来拆解,保证你听完就能上手。
嗯,今天就先聊到这儿。有问题随时在群里问我。