一句话定义

可编译性(Compilability) 指一个模型能否被等价地表达成目标芯片认得的算子组合。

注意「等价」和「多贵」这两件事。模型能被翻译过去、算出来的结果和原模型一致,是及格线;翻译之后多出来的那部分计算和访存,才是决定它能不能上线的部分。所以可编译性不是「能 / 不能」的开关,而是一条连续的线:能编译,但慢三倍,在端侧等于不能。

它解决什么问题

端侧部署有一个结构性矛盾:模型结构和芯片指令集不是一起设计的。

主流 NPU 只固化了一小撮算子——卷积、矩阵乘、加减、激活、归一化。而新模型里常见的 attention、LayerNorm、GELU,未必有对应的硬件单元。于是只有两条路:改模型去适配硬件,或者让编译器把模型翻译成硬件认识的样子。

翻译这一层最容易出的事,是把「跑通了」当成「跑得好」。演示阶段往往只验证了输出对不对,没人看编译后的图变成了什么样:多出多少个算子、有没有悄悄退回 CPU 执行、访存次数翻了几倍。

关键做法

arXiv 上有一篇 2026 年 10 月的工作(编号 2610.28958)把这件事拆开算了一遍。它证明的是:Transformer 的每个 block(attention + LayerNorm + GELU 的 MLP)都能精确编译成通用深度网络——由固定仿射变换、路由、以及平方 / sigmoid / 逆平方根这类逐元素非线性加上 GELU 或 sigmoid 近似组成。

代价也被算清楚了:

  • 稠密打分的额外开销。 把注意力写成稠密打分矩阵乘法之后,如果去掉「激活 × 激活」这类逐元素乘法,每个头在序列长度 N 上至少要额外做 N² 次标量非线性求值。而被调查的 NPU 其实都支持这类逐元素乘法——保留它,这笔开销就免掉了。这是一个典型的「硬件有哪个算子,决定编译器走哪条路」的例子。
  • 稀疏部分的估计要无偏。 对 top-k 之外的尾部,用精确或条件均值的质量估计是无偏的最小均方误差估计;直接把尾部丢掉则是有偏的。
  • 选 key 的方式影响复杂度。 用聚类来选 key,可以把 N² 降到 Nk。

论文在 DeiT-Tiny、MambaIRv2-Light、Pythia-70M 上做了验证:编译后的网络与参考实现一致,标准的训练后量化也能直接套用。

用不上的时候

  • 只验证了「跑通」就宣布支持。 编译通过只是第一步。要一起看的是:编译后算子数量、有没有算子回退到 CPU、访存次数、以及最慢那一层的耗时。
  • 以为通用化不花钱。 把专用算子拆成通用算子,换来的通常是更多次访存。端侧很多场景是带宽受限的,多一次读写就多一份延迟。
  • 拿小模型的结果推大模型。 论文验证的是 DeiT-Tiny 这类规模。换成检测、分割、多模态的大模型,图结构和张量形状都变了,结论要重测。
  • 以为量化能套用就等于精度不掉。 标准 PTQ 确实可以套上去,但编译后的图结构变了,量化误差的传播路径也跟着变。能套用和掉不掉点,是两件事。
  • 把它当成纯软件问题。 可编译性的边界由硬件决定:这颗芯片有哪些算子、支持哪些精度、内存和计算是不是共享。软件层只能在给定边界内腾挪。

参考

arXiv:2610.28958,Transformers as Generic Deep Neural Networks: Exact Compilation, the Cost of Removing Activation-Activation Products, and Multi-Agent Attention Clustering(2026-10-20)。论文给出 Transformer block 到通用深度网络的精确编译构造(固定仿射、路由、平方 / sigmoid / 逆平方根非线性 + GELU 或 sigmoid 近似);指出去掉激活-激活乘积后,稠密打分每头至少多 N² 次标量非线性求值,保留该逐元素乘法(被调查的 NPU 均支持)即可免掉;top-k 尾部用精确 / 条件均值质量估计为无偏最小均方误差、直接丢弃有偏;聚类选 key 把 N² 降到 Nk。DeiT-Tiny、MambaIRv2-Light、Pythia-70M 上编译结果与参考一致,标准训练后量化可套用。

延伸阅读

相关词条


火眼识别提供端侧视觉引擎与设备管理平台,相关方案见 火眼识别官网。