量化技术基础:定点数与浮点数、对称量化与非对称量化、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,问题就解决了。

知识体系总览

下面这张图,是我自己梳理的量化技术知识体系。你把它存下来,以后做量化方案选型时直接对照着看。

量化技术知识体系 数据表示 • 浮点数:FP32/FP16/BF16 • 定点数:INT8/INT4/INT2 • 动态范围 vs 精度权衡 量化方案 • 对称量化:零点固定为0 • 非对称量化:零点可偏移 • 权重 vs 激活值不同策略 量化方法 • 后训练量化(PTQ):快速、无需训练、精度损失较大 • 量化感知训练(QAT):精度高、需要训练、耗时较长 • 混合精度量化:不同层不同bit宽度 FPGA实现要点 DSP资源规划 | 流水线设计 | 查找表优化 | 低功耗时钟门控

你看,从数据表示到量化方案,再到具体的量化方法,最后落到FPGA实现,这是一条完整的技术链路。每个环节都有取舍,没有银弹。

总结一下

  • 定点数比浮点数更适合FPGA推理
  • 对称量化硬件简单,非对称量化精度更高
  • PTQ适合快速验证,QAT适合追求精度
  • 权重用对称,激活用非对称——这是最稳妥的起点

好了,量化基础就聊到这儿。你把这些概念吃透了,后面讲具体的FPGA量化实现时,你会觉得顺很多。

专注资料整理