把 PyTorch 模型经 ONNX、TensorFlow SavedModel 转成 TFLite 时,常会对比 float32 与 INT8 两版模型的算子构成。int8 版本里容易出现一种很刺眼的现象:原本几个BatchMatMul全部消失,取而代之的是几十个细碎的FullyConnected。这不是转换脚本的 bug,而是 TFLite 量化器的既定行为。
问题现象
转换链路:
ONNX → TF SavedModel → TFLite (float32) / TFLite (INT8)float32 版本的算子统计:
Einsum → BatchMatMul 3 × BatchMatMul 1 × FullyConnected 合计 4 个矩阵运算INT8 量化后的算子统计:
0 × BatchMatMul 65 × FullyConnected 合计 65 个小矩阵乘每个FullyConnected做的都是很小的乘法:[1, 1, 32] × [12, 32] → [1, 12]。也就是说,批/组维度的每一个元素被拆成了一个独立算子。float32 模型里Einsum被正确折