185、NPU的编译器开发:模糊测试与安全审计
185、NPU的编译器开发:模糊测试与安全审计上周五晚上十一点,我盯着屏幕上一条诡异的NPU编译错误发呆。模型编译通过,仿真跑起来也没问题,但一上板子,推理结果每隔几十次就蹦出一个NaN。更邪门的是,这个NaN只在特定输入尺寸下出现,换个batch size就消失了。直觉告诉我,这不是模型的问题,是编译器生成的指令序列踩到了NPU硬件的一个隐藏边界。这种问题在NPU编译器开发中太常见了。神经网络编译器不像普通编译器那样有几十年的测试积累,NPU的指令集往往只有几百条,但每条指令的约束条件——数据对齐、张量维度限制、内存bank冲突、流水线依赖——组合起来是个天文数字。靠人工写测试用例,永远覆盖不完这些边界。这就是为什么我们需要模糊测试。模糊测试在NPU编译器中的特殊之处传统软件模糊测试,核心是生成随机输入,看程序会不会崩溃。NPU编译器不一样。我们生成的不是普通输入,而是合法的神经网络模型结构,然后看编译器能不能正确翻译成NPU指令,生成的指令序列能不能在硬件上正确执行。这里有个关键点:NPU编译器的输入空间是“所有可能的神经网络结构”。这个空间有多大?随便举个例子,一个卷积层就有kernel size、stride、padding、dilation、输入输出通道数、分组数等十几个参数。每个参数取不同值,组合起来就是天文数字。更别说还有各种算子组合、数据流拓扑结构。我见过最离谱的一个bug,是编译器在处理“卷积+BN+ReLU”融合时,当输入特征图宽度为质数时,生成的DMA传输地址没有对齐到32字节边界,导致硬件直接报错。这个bug在内部测试跑了三个月都没发现,直到一个用户用了

相关新闻