如何验证INT8量化算法的正确性?

解读

INT8量化是把32-bit浮点权重/激活压缩到8-bit定点,验证目标不是“压缩本身”,而是“压缩后功能等价”。芯片端验证要回答三件事:

  1. 算法层:量化公式(scale/zero-point/rounding/clamp)在RTL里是否逐bit复现?
  2. 数据路径:INT8 MAC阵列的溢出、饱和、rounding位是否与黄金模型一致?
  3. 系统层:经过INT8推理,Top-1/Top-5精度损失是否满足PPA规格(一般≤1%)?

面试场景里,面试官想听的是“你怎么把算法验证拆成可量化的IC验证任务,并用UVM+形式验证+硬件加速把它close”。

知识点

  1. 量化参数生成:scale = (r_max-r_min)/(q_max-q_min),zero-point = round(-r_min/scale)+q_min,RTL必须支持per-tensor/per-channel两种粒度。
  2. 四种rounding模式:RTZ、RTE、RTP、RTN;芯片通常选RTE(偶数舍入),需要验证LSB、Guard、Round、Sticky四舍五入位。
  3. 溢出与饱和:INT8乘累加最坏位宽39bit(8×8+32bit偏置+2048累加),RTL里要显式截断到INT8,验证点包括symmetric/asymmetric饱和。
  4. 黄金模型:PyTorch/TensorFlow量化插件+ONNX Runtime,输出INT8特征图作为UVM参考。
  5. UVM验证结构:
    • qvip_tile_in:产生随机浮点激励,支持分布控制(Gaussian、Uniform、Outlier)。
    • qvip_quantizer:C-DPI封装黄金量化算法,实时生成scale/zp/INT8输出。
    • scoreboard:浮点余弦相似度≥0.99,INT8逐像素误差≤1。
  6. 形式验证:用Synopsys VC Formal对“rounding+saturation”做等价性检查,穷举2^16组合,证明RTL与C模型无差异。
  7. 硬件加速:将INT8推理网表跑在Zynq-U250 FPGA原型,跑ImageNet 50k图,统计精度曲线,与simulation误差<0.05%。
  8. Sign-off标准:
    • 功能覆盖率:scale∈[1e-6,1e2]、zp∈[-128,127]、溢出率>30%场景全部命中。
    • 代码覆盖率:branch、expression、toggle 100%。
    • 性能指标:INT8推理延迟≤FP32的1/3,功耗下降≥75%。

答案

我把它拆成四步:建模→随机→形式→系统。
第一步,建模。用PyTorch QAT训练ResNet50,导出onnx,再用ONNX Runtime跑后量化,得到黄金INT8特征图和scale/zp。把量化公式写成C-DPI,嵌入UVM。
第二步,随机。搭UVM Testbench,输入层用qvip_tile_in产生高斯+异常值(±6σ),DUT是INT8 Quantize RTL。Scoreboard里做两级check:
a) 浮点余弦相似度≥0.99;
b) INT8逐像素误差≤1。
用covergroup采样scale、zp、rounding模式、溢出率,确保边界全部命中。
第三步,形式验证。对“乘法+移位+rounding+saturation”子模块写SVA断言,用VC Formal在16h内穷举2^16向量,证明RTL与C-DPI等价,无X-propagation。
第四步,系统级。把INT8网表跑在FPGA原型,ImageNet 50k图Top-1损失0.68%,满足≤1%规格;同时跑1000小时老化,无饱和错误。最终交付vplan、覆盖率报告、形式验证报告、精度曲线,评审一次性通过。

拓展思考

  1. 混合精度INT4/INT8:若芯片支持bit-width可配,验证空间指数级增大,可用分层随机+Markov-chain蒙特卡洛采样,把覆盖率收敛时间从4周压到1周。
  2. 动态量化:每帧scale/zp在线计算,需要验证SRAM读写一致性,用UVM RAL+自动compare,防止读写冲突导致scale漂移。
  3. 安全芯片:量化参数需加密存储,验证时要模拟非法scale(如0、NaN),确保RTL进入safe-state并上报中断,满足国密EAL5+要求。