量化技术基础:定点数与浮点数、对称量化与非对称量化、QAT与PTQ
好,咱们今天聊聊量化。说实话,很多做FPGA加速的朋友一听到「量化」就觉得头大,觉得这是算法工程师的事。但我个人的经验是——你越早理解量化,你的硬件设计就越主动。
量化说白了,就是把模型里那些32位浮点数,用更少的bit来表示。为什么?因为FPGA上跑浮点太奢侈了,LUT和DSP资源烧得飞快。我见过一个项目,直接用FP32推理,结果资源不够,最后只能降频跑,功耗直接飙到15W。后来换成INT8量化,同样的活儿,功耗降到3W不到。
嗯,咱们一步步来。
定点数与浮点数
先搞清楚这两个东西长什么样。
浮点数,比如FP32,它由符号位、指数位、尾数位组成。动态范围大,精度高。但硬件实现复杂,乘法器面积大、功耗高。
定点数,比如INT8,就是固定整数位和小数位。没有指数部分。硬件实现简单,乘法器小,功耗低。
我举个例子你就明白了:
// 浮点数 3.14159 在FP32里长这样
// 符号位: 0
// 指数位: 10000000 (偏移127后)
// 尾数位: 10010010000111111011011
// 定点数 3.14 用Q8.8格式
// 整数部分: 00000011 (3)
// 小数部分: 00100011 (0.1367...)
// 合起来: 00000011.00100011
你看,定点数直观多了。FPGA上做定点乘法,一个DSP48E1就能搞定。浮点乘法?得用好几个DSP级联,延迟还大。
核心结论:推理阶段用定点数,训练阶段用浮点数。这是行业共识。
对称量化与非对称量化
量化的时候,怎么把浮点数映射到定点数?这里有两种主流方案。
对称量化:零点就是0。正负范围对称。公式很简单:
q = round(r / s)
s = max(|r_max|, |r_min|) / (2^(n-1) - 1)
其中s是缩放因子。对称量化的好处是硬件实现简单,不需要处理零点偏移。但坏处是——如果数据分布不对称,比如ReLU之后全是正数,那负数那半边就浪费了。
非对称量化:零点可以偏移。公式长这样:
q = round(r / s) + z
s = (r_max - r_min) / (2^n - 1)
z = round(-r_min / s)
z就是零点偏移。非对称量化能更好地匹配数据分布。我在项目中遇到过,一个模型用对称量化后精度掉了2%,换成非对称量化只掉了0.3%。
| 对比项 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点处理 | 固定为0 | 可偏移 |
| 硬件复杂度 | 低 | 中 |
| 数据适配性 | 适合正负对称分布 | 适合任意分布 |
| 典型场景 | 权重量化 | 激活值量化 |
我的建议:权重用对称量化,激活值用非对称量化。这是经过大量实践验证的黄金组合。
量化感知训练(QAT)与后训练量化(PTQ)
这两个是量化落地的两条路。我两条路都走过,说说感受。
后训练量化(PTQ):模型训练完,直接拿一批校准数据跑一下,统计出每层的min/max,然后做量化。简单粗暴,不需要重新训练。
优点:快,几小时搞定。缺点:精度损失可能比较大,尤其是小模型。
我曾经在一个VLA模型上试PTQ,INT8量化后精度掉了5%。对于视觉任务来说,这基本不可接受。
量化感知训练(QAT):在训练过程中模拟量化误差。前向传播时插入伪量化节点,反向传播时用直通估计器(STE)来近似梯度。
代码大概长这样:
# 伪代码,QAT的核心逻辑
def forward(x, scale, zero_point):
# 量化
q = torch.round(x / scale) + zero_point
q = torch.clamp(q, 0, 255) # INT8范围
# 反量化
x_hat = (q - zero_point) * scale
return x_hat
# 反向传播时,STE直接让梯度通过
def backward(grad_output):
return grad_output # 不做任何修改
QAT的精度通常比PTQ好很多。我那个VLA模型,用QAT后精度只掉了0.8%,完全可用。
但代价是训练时间长,而且需要修改训练代码。
注意:QAT训练时,batch size不能太小。我试过batch size=4,结果量化后的模型在边缘case上表现很差。后来改成batch size=32,问题就解决了。
知识体系总览
下面这张图,是我自己梳理的量化技术知识体系。你把它存下来,以后做量化方案选型时直接对照着看。
你看,从数据表示到量化方案,再到具体的量化方法,最后落到FPGA实现,这是一条完整的技术链路。每个环节都有取舍,没有银弹。
总结一下:
- 定点数比浮点数更适合FPGA推理
- 对称量化硬件简单,非对称量化精度更高
- PTQ适合快速验证,QAT适合追求精度
- 权重用对称,激活用非对称——这是最稳妥的起点
好了,量化基础就聊到这儿。你把这些概念吃透了,后面讲具体的FPGA量化实现时,你会觉得顺很多。