专栏导论:为什么我们需要MLIR与算子中间表示
去年冬天,我在调试一个AI推理引擎的量化算子时,遇到了一个让我连续加班三天的诡异问题。模型在GPU上跑得好好的,换到自研NPU上,某个卷积算子的输出精度直接崩了——不是差几个比特,而是整个feature map像被泼了硫酸。我翻遍了算子实现、检查了量化参数、甚至怀疑是DMA搬运时地址对齐出了问题。最后发现,问题出在编译器后端把某个中间表示中的“relu”和“clip”合并优化时,把量化scale搞丢了。
那一刻我意识到,我们缺的不是算子实现能力,而是算子中间表示的抽象层次和表达能力。这件事直接促使我开始系统研究MLIR。
从“手写IR”到“IR通胀”
很多做AI芯片的朋友都经历过这个阶段:先手写一套自己的IR,定义几个Op,比如Conv2D、Relu、Add,然后写pass做图优化。一开始很爽,因为IR完全可控,想怎么改就怎么改。但很快你会发现,IR开始“通胀”了——为了支持量化,你得加QConv、QRelu;为了支持稀疏化,你得加SparseConv;为了支持不同精度,你得加FP16Conv、INT8Conv……IR的Op数量呈指数级增长。
更痛苦的是,每个Op背后都跟着一套lowering规则、一套shape推导、一套内存分配策略。当你的IR膨胀到几百个Op时,维护成本已经超过了开发收益。这时候你开始怀念LLVM——至少人家有统一的中间表示,有成熟的pass管理框架。
但LLVM IR是为通用计算设计的,它处理的是load/store、arithmetic、control flow这些底层操作。对于AI算子
订阅专栏 解锁全文

307

被折叠的 条评论
为什么被折叠?



