同一颗芯片,为什么换个模型就跑不动
「支持」这两个字,含义很宽
谈设备的时候,供应商常给一句话:我们支持主流视觉模型。
这句话可以是真的,同时也可以毫无用处。因为「支持」至少有三个层次:能加载、能算对、能按时算完。前两个层次在演示里就能验证,第三个层次要等装到店里、跑满路数、跑满一天,才会露出来。
中间那层被跳过的地方,就是可编译性。
芯片只认得一小撮算子
边缘芯片上的加速单元,通常只固化了一批常见算子:卷积、矩阵乘、加减、激活、归一化。它像一套固定规格的模具,模型得先被压成这个形状。
麻烦在于模型是另一条线进化出来的。近几年的网络里到处是 attention、LayerNorm、GELU 这些东西,它们未必有对应的硬件单元。于是中间必须有一层翻译:把模型图改写成芯片认识的算子组合。
这层翻译有两个可能的结局。第一种,改写不出来,某个算子没有对应实现,编译器把它退回 CPU 跑——那一层的速度掉一个数量级,整条流水线跟着卡住。第二种,改写出来了,但改写的方式很贵:多做了几次非线性求值、多读了几遍内存。
第二种更隐蔽。模型算得对,日志没有报错,演示也流畅,只是高峰期跑不动。
有一篇论文把「贵多少」算了出来
2026 年 10 月 arXiv 上有一篇工作(编号 2610.28958),做的是把 Transformer 精确编译成通用深度网络:每个 block 拆成固定仿射变换、路由、以及平方 / sigmoid / 逆平方根这类逐元素非线性。
它给出了两个结论,都跟成本有关。
一个是好消息:能精确编译。 在 DeiT-Tiny、MambaIRv2-Light、Pythia-70M 上,编译出来的网络和参考实现结果一致,标准的训练后量化也能直接套上去。
一个是坏消息:某些改写方式很贵。 把注意力拆成稠密打分之后,如果去掉「激活 × 激活」这类逐元素乘法,每个头在序列长度 N 上至少要额外做 N² 次标量非线性求值。而论文调查的 NPU 其实都支持这类逐元素乘法——保留它,这笔开销就免掉了。
这条正好说明可编译性的实质:它不是模型单方面的属性,是模型和芯片合起来才成立的属性。 同一个模型,A 芯片上翻译得很便宜,B 芯片上翻译得很贵,差别不在模型,在两边算子集合的重合度。
对一家门店意味着什么
门店不选算子,门店选设备。但这层技术细节会以三种方式传导到门店:
换型号就重测。 同一套识别软件,装到新采购的机型上,表现可能不一样。不是软件变差了,是翻译路径变了。
新模型不等于更快。 算法团队换了个结构更新的模型,理论精度更高、参数量更小,装到老设备上反而更慢——因为新结构里的算子,老芯片没有专门的单元。
峰值时段暴露问题。 单张图跑一下,看不出翻译的代价;四路同时进来、跑一个小时,代价就变成排队。
采购时可以问的四句话
- 这个模型在这台设备上,有哪些算子回退到了 CPU? 回退的那几层是哪些,占了总耗时的多少。
- 编译后的算子数量和访存次数,跟上一代比是什么变化? 这一问比问「快多少倍」更能看出对方有没有真的做过移植。
- 精度支持是什么范围? 支持不支持 8 位、4 位,整型的还是浮点的,逐层能不能配不同位宽。
- 换模型需要多久? 是改配置就行,还是要重新转换、重新验证、重新回归测试。
门店自己验证的三个动作
- 不看演示,看回退。 让对方在实际设备上开一次运行日志,看有没有算子被打回 CPU。这一条比任何跑分都直接。
- 跑自家最难的图。 遮挡、叠放、反光包装、散装称重,这几类的张量形状和计算量和标准品一样,但后处理路径常常不同,容易踩到没走过的分支。
- 留一台低配机做对照。 门店出问题往往出在最低配那档。同一批图、同一版软件,两台机器一起跑,差异就是硬件边界的差异。
一句话收尾
「支持这个模型」是一句起点,不是结论。真正要确认的是:它被翻译成了什么、翻译之后贵了多少、以及在你要买的那台机器上,这份代价还能不能接受。