音频模型 Batch 一致性排查:从有效输入区间到逐层 diff
音频模型在 batch size 改变后输出不一致,是很常见但容易误判的问题。不要一开始就怀疑最后的解码结果。更稳的排查顺序是:先证明输入等价,再证明 mask 和有效长度等价,最后逐层定位数值差异从哪里开始放大。
这篇文章整理一套通用排查协议,适用于 ASR、VAD、speaker model 和其他时序音频模型。
先定义什么叫一致
一致性可以分三层:
- 数值一致:有效区域 hidden states 差异在阈值内;
- 决策一致:分类标签、token 或分数排序不变;
- 指标一致:WER、F1、recall 等整体指标不随 batch policy 漂移。
很多线上系统真正需要的是决策一致,而不是逐位相同。先定义目标,才能避免把所有浮点差异都当成故障。
有效输入区间优先
排查时只比较有效输入区间,不要把 padding 区混进去。建议固定:
- 输入样本顺序;
- sampling rate 和 feature extraction;
- padding value;
- valid length;
- attention mask 或 padding mask;
- inference mode、dropout、random seed;
- dtype 和 device。
如果这些条件没固定,batch=1 和 batch>1 的差异没有解释价值。
逐层 diff
最小复现可以这样做:
- 同一条样本单独推理一次;
- 把同一条样本放进混合 batch 再推理一次;
- 对齐有效长度;
- 保存每层输入输出的 max diff、mean diff、cosine similarity;
- 找到差异第一次明显放大的层。
定位到层之后,再检查该层的 mask broadcast、normalization、cache、subsampling、kernel path 和 dtype 转换。
常见问题
几类问题最常见:
- padding 区参与了 attention 或 pooling;
- valid length 在 subsampling 后没有同步更新;
- mask 维度广播错误;
- batch normalization 或统计层在推理模式下状态不一致;
- mixed precision 在不同 batch shape 下走了不同 kernel;
- streaming cache 没有按样本隔离。
这些问题会在最终输出里表现得很混乱,但逐层 diff 通常能把范围缩小。
回归测试
修复后应保留 batch consistency regression:
- batch=1;
- batch=2;
- 长短混合;
- 全短样本;
- 全长样本;
- 不同 dtype;
- 不同设备或后端。
每组都只比较有效区域,并同时记录数值差异和决策差异。这样后续升级推理框架、kernel、量化策略或 batch policy 时,问题能被提前发现。
小结
Batch 一致性排查的关键是顺序。先证明输入和 mask 等价,再逐层找差异,不要直接从最终文本或最终分类结果反推原因。对时序模型来说,有效长度、padding、subsampling 和 dtype 往往比最后一层更早决定问题走向。