2、编译器之争:从TVM到MLIR,AI芯片的“翻译官”如何决定生死?——我亲历的一次算子适配噩梦

先讲个真实的故事。

几年前,我接手了一个项目。客户买了某家创业公司的AI芯片,号称算力是英伟达T4的两倍。结果呢?跑一个简单的BERT模型,性能连T4的一半都不到。问题出在哪?不是芯片不行,是编译器没跟上。说白了,芯片是硬件,编译器是翻译官。翻译官水平差,再好的硬件也白搭。

那段时间,我带着团队手动优化算子。一个LayerNorm,折腾了整整两周。改完一个算子,另一个又出问题。就像打地鼠,永远打不完。嗯,这就是我今天要聊的主题——编译器之争,到底在争什么?

2.1 为什么编译器是AI芯片的“命门”?

你想想看,AI芯片要跑模型,模型里的算子(比如卷积、矩阵乘)需要被翻译成芯片能执行的指令。这个翻译过程,就是编译器干的活。

但问题来了——

  • 硬件差异大:每家芯片的架构都不一样。有的用SIMD,有的用脉动阵列,有的用数据流。编译器得针对每种架构做优化。
  • 算子种类多:从Conv2D到FlashAttention,从LayerNorm到GroupQueryAttention。新算子层出不穷,编译器得跟上节奏。
  • 性能要求高:同样的算子,不同编译方式,性能可能差10倍。编译器优化不到位,芯片算力再高也白搭。

核心观点:AI芯片的竞争,本质是软件生态的竞争。而软件生态的核心,就是编译器。

2.2 TVM:开源社区的“破局者”

2017年,陈天奇团队推出了TVM。说实话,当时我挺兴奋的。为什么?因为TVM解决了两个核心问题:

  1. 多后端支持:TVM可以生成CPU、GPU、FPGA、ASIC等多种后端的代码。你写一次算子,TVM帮你适配所有硬件。
  2. 自动调优:TVM用机器学习的方法,自动搜索最优的编译参数。比如tile size、unroll factor这些,不用你手动调。

我在项目中用过TVM。说实话,效果不错。但有个问题——

踩坑提醒:TVM的自动调优,对新手来说是个黑盒。我曾经花了一周时间调优一个算子,结果发现是调优策略没选对。后来改用XGBoost调优器,性能直接翻倍。

TVM的架构大致是这样的:

TVM 编译器架构 前端:模型导入 TensorFlow / PyTorch / ONNX / MXNet 中间表示(IR) Relay IR:算子图优化、融合、常量折叠 TE(Tensor Expression):算子级优化、调度 自动调优(AutoTVM) 搜索最优调度参数:tile size / unroll / vectorize 后端:代码生成 LLVM / CUDA / OpenCL / Vitis AI / 自定义后端

2.3 MLIR:Google的“统一语言”

TVM很好,但有个硬伤——它自己定义了一套IR(中间表示)。这意味着,TVM和LLVM、XLA这些编译器之间,还得做一层翻译。翻译多了,效率就低了。

2019年,Google推出了MLIR。说白了,MLIR不是一个新的编译器,而是一个编译器基础设施。它提供了一套可扩展的IR框架,让不同编译器之间可以共享中间表示。

我个人觉得,MLIR最大的价值在于:

  • 多级IR:从高层(比如Tensor操作)到底层(比如寄存器分配),MLIR用多级IR来逐步降低抽象层次。每一级IR都可以做专门的优化。
  • 可扩展性:你可以自定义Dialect(方言),定义自己的操作和类型。比如,你可以定义一个“脉动阵列”的Dialect,专门优化矩阵乘。
  • 复用LLVM:MLIR底层直接对接LLVM,不用自己再写一遍代码生成。

我的建议:如果你在做AI芯片的编译器,优先考虑MLIR。因为它的生态更开放,社区更活跃。TVM适合快速原型验证,但长期来看,MLIR是趋势。

2.4 算子适配的“噩梦”

回到开头那个故事。为什么一个LayerNorm要折腾两周?

因为芯片的硬件架构特殊。它没有原生的除法指令,只能用查表法近似。而TVM的自动调优,根本不知道这个硬件特性。它生成的代码,性能惨不忍睹。

我当时的做法是:

  1. 手动写调度:在TVM的TE层,手动指定tile size、unroll factor等参数。
  2. 自定义算子:用TVM的Tensor Expression API,手写LayerNorm的计算逻辑。
  3. 调优策略:改用XGBoost调优器,把硬件特性(比如查表法的延迟)作为特征输入。

最后性能上来了,但代价是——每个算子都得手动调。这哪是开发,简直是体力活。

避坑指南:我曾经以为TVM的自动调优能解决所有问题。后来发现,对于特殊硬件,自动调优就是个摆设。建议你在选型时,先评估一下硬件和编译器的匹配度。

2.5 编译器之争的本质

TVM和MLIR,到底谁更强?

说实话,这不是一个非此即彼的问题。TVM在算子级优化上做得很好,MLIR在编译器基础设施上更有优势。未来的趋势,很可能是两者融合——用MLIR做IR框架,用TVM做算子优化。

但有一点是确定的:编译器决定了AI芯片的生死。芯片算力再高,编译器翻译不好,性能就是零。我见过太多芯片公司,硬件做得不错,但编译器一塌糊涂,最后产品无人问津。

所以,如果你在做AI芯片,请把编译器当成第一优先级。别等到流片回来,才发现“翻译官”不合格。

对比维度 TVM MLIR
定位 端到端编译器 编译器基础设施
IR设计 固定IR(Relay + TE) 可扩展多级IR
自动调优 内置AutoTVM 需自行实现
硬件适配 通过后端插件 通过自定义Dialect
社区生态 开源,社区活跃 开源,LLVM生态
适用场景 快速原型、算子优化 编译器开发、硬件适配

嗯,说了这么多,其实就一句话:编译器是AI芯片的“翻译官”,翻译官的水平,决定了芯片的命运。TVM和MLIR,都是这个领域的佼佼者。但最终,谁能更好地适配硬件、优化算子,谁就能赢得这场战争。

至于我那个项目?后来我们换了MLIR,自己写了一个Dialect,专门适配那家芯片的硬件特性。效果还不错,至少不用再手动调每个算子了。

但说实话,这条路还很长。AI芯片的编译器,远没有到成熟的时候。你想想看,连英伟达的CUDA都还在不断迭代,其他芯片厂商的路,只会更难。


专注资料整理