
1. 先说结论AI编译器值得花一整年去啃刚接触AI编译器的人很容易被一堆名词吓退LLVM、MLIR、TVM、XLA、Triton、Pass、IR、Schedule……每个词单独看还能懂个大概串在一起就完全不知道从哪下手。我最早看TVM源码的时候连续两周处于“好像看懂了但关上文档就失忆”的状态。先给个负责任的定位AI编译器是当前AI Infra领域里极少数门槛高、需求硬、人才缺口大的方向。大模型训练和推理的成本压力摆在那里各家都在拼命压榨GPU利用率而AI编译器就是那个“让硬件跑得更满”的关键角色。它不像应用层算法那样迭代飞快底层的东西一旦掌握三五年内都很难过时。这篇文章的目标很明确给一条可以直接照着走的学习路线配一份从易到难的项目清单。不是那种“建议你多看看论文”的废话路线而是每一步都有明确产出、明确验收标准的硬核路径。适合三类人有深度学习基础想转Infra方向的算法工程师、想做底层开发的C/系统工程师、以及想提前卡位的研究生。我自己是算法出身半路啃的编译器踩过的坑不算少。这篇内容等于把我走过的弯路标出来把直路指给你看。2. AI编译器到底是干什么的先搞清楚它解决什么问题2.1 一层层拆开“AI编译器”这个概念很多教程上来就扔概念搞得人云里雾里。我用一个最朴素的方式来解释AI编译器在做什么。深度学习的计算图本质上是一串算子组成的DAG比如卷积、矩阵乘、归一化、激活函数。传统做法是让每个算子单独调用一个现成的库cuDNN、cuBLAS性能好不好完全看库本身的优化水平。但这里有几个致命问题算子与算子之间的融合做不了。两个算子本来可以在GPU寄存器里完成中间结果的传递硬要写回显存再读出来带宽白白浪费。算子的实现被库锁死。cuDNN里没有的算子变体要么自己写CUDA要么忍着性能损失。硬件的变化太快。今天用A100明天换H100后天可能又出现新架构的推理芯片每一代都得重新适配。AI编译器做的事情简单说就是把“你写的模型”翻译成“硬件上跑得最快的机器码”。它拿到计算图之后会做算子融合、内存规划、循环优化、向量化然后根据目标硬件生成最优的调度策略。这个过程自动化的程度越高人力成本就越低硬件利用率就越高。2.2 它和传统编译器的关系不是替代是继承和扩展很多人以为AI编译器是一门全新的学科跟传统编译器没关系。其实恰恰相反AI编译器是整个编译器技术栈在AI场景下的延伸。LLVM提供的是中间表示IR和经典优化Pass框架AI编译器只是在上面加了更高层的抽象来处理“计算图优化”和“张量计算优化”这两件传统编译器不怎么管的事。换句话说传统编译器关注的是变量、函数、控制流AI编译器关注的是算子、数据流、内存布局。但底层的很多优化技术是相通的循环变换、向量化、缓存优化、指令调度……这些在经典的编译器教材里都能找到根源。这就是为什么学习路线里一定要包含LLVM基础——这不是学院派的要求而是实实在在的工业界需要。你去看TVM的源码里面有大量对LLVM接口的调用你去看XLA它的核心后端就直接跑在LLVM之上MLIR更是从LLVM社区长出来的下一代编译器基础设施。2.3 为什么这两年AI编译器突然这么火原因其实很直白算力贵模型大算子多。大模型动辄上千亿参数训练一次的成本是数百万级推理时每个token都要跑一遍完整的前向计算。0.1%的性能提升乘上巨大的计算量都是实打实的钱。另一方面芯片厂商的软件栈跟不上硬件迭代的速度。新卡出来AI框架适配要时间算子库优化要时间编译器反而成了那个可以快速填坑的工具。任何一个新硬件想接入AI生态第一件事就是写好编译器不然再强的算力也白搭。所以现在的局面是大厂在自研训练推理编译器芯片公司在搞编译器工具链中间还有一堆创业公司在做AI编译器的商业化产品。这个方向的人才供给远远跟不上需求。3. 学习路线怎么定按阶段推进每阶段都有验收标准3.1 阶段一基础补强建议4-6周先说基础要求。不是针对零基础的同学——说实话完全没有深度学习和程序语言理论基础直接碰AI编译器会很痛苦。建议的最低配置如下熟悉Python和CC至少要能看懂模板、智能指针、标准库的水平了解深度学习基本概念卷积、Transformer结构、训练推理的基本流程了解GPU基本工作原理线程块、共享内存、全局内存至少知道这些名词意味着什么如果上面三条都还差得远先花时间补齐。这里给一个自我检验的标准能不能直接读PyTorch的自定义算子代码能不能解释清楚Tensor在GPU显存里是怎么组织存放的如果都要想很久说明基础还不够扎实。基础理论方面我推荐两本书配合起来看。第一本是《编译原理》龙书重点看中间代码生成、优化、代码生成这几章词法分析和语法分析可以快速略过——那是传统前端的内容AI编译器中确实有用但前期不需要深挖。第二本是《Performance Analysis of the TPC-C Benchmark》这类讲系统性能分析的或者直接找GPU编程入门的资料推荐《CUDA Programming: A Developers Guide》这种实操类型的书。这个阶段不要急着碰AI编译器的代码先建立一个“程序语言到机器码”和“算子到GPU指令”的桥梁认知。3.2 阶段二LLVM入门——理解编译器基础设施建议6-8周LLVM是绕不开的第一座山它是整个编译器生态的基座。AI编译器不是不用LLVM而是在LLVM之上做自己的事情所以必须先弄懂LLVM的核心机制。需要掌握的知识点拆开来说IR中间表示LLVM IR是LLVM的核心抽象你要能读懂它的基本语法知道一个函数在IR层面长什么样知道基本块、指令、操作数之间的关系。建议自己手写几个小函数然后用clang生成.ll文件逐个指令去查LLVM Language Reference。Pass框架LLVM的优化是以Pass为单位组织的。你需要理解PassManager的工作方式会写一个最简单的FunctionPass和ModulePass然后集成进llvm-opt中跑起来。这一块做到“能动手”就算过关不需要把LLVM所有Pass都读完。后端的基本流程知道SelectionDAG和GlobalISel这两个后端的区别理解为什么LLVM最终需要生成目标相关的指令。这里不要求能写一个完整后端但对图、寄存器分配、指令选择这些概念要有直观理解。推荐的参考资料LLVM官方Kaleidoscope教程是经典中的经典强烈建议完整跟一遍。虽然它用的是最简单的玩具语言但走完这个流程你对“从源码到IR再到机器码”的流程会有切身感受。Visual Studio Code的clangd插件生成的compile_commands.json配合LLVM的opt工具看各种优化Pass前后的IR变化是理解Pass作用的最直观方法。阶段验收标准能用LLVM的API写一个绕过标准编译流程的自定义Pass并对一段简单的C代码执行该Pass并对比优化效果。3.3 阶段三TVM——第一个完整AI编译器框架建议6-8周学LLVM是打地基真正理解AI编译器怎么运作TVM是一个非常理想的学习载体。它的代码量适中、模块划分清楚、社区活跃、资料丰富作为第一个完整跟下来的AI编译器非常适合。TVM要抓的核心内容有这么几块Relay IRTVM的高层图IR负责计算图的表示和算子融合等高层优化。你要能读懂Relay的Pass代码理解它如何对图进行改写。Tensor Expression和Schedule这是TVM的灵魂所在。TE负责描述算子计算逻辑Schedule负责描述怎么把这个计算映射到硬件上。你要能亲手给矩阵乘写一个tiledvectorized的schedule并且跑通性能对比。AutoTVM和Ansor这是自动调优模块。理解它如何绕过人工设计schedule通过搜索的方式找到最佳配置。这里可能不需要深入读懂全部代码但要知道它的黑盒优化思路并且实际跑通一个调优任务。CodeGen流程知道TVM如何通过LLVM生成CPU上的机器码以及如何通过CUDA后端生成GPU代码。读TVM源码的方法我个人强烈建议用“从例子入手”的方式找几个经典算子卷积、矩阵乘、softmax从Python层的调用一路追下去看它如何从topo-ir变成TE表达式再变成schedule最后变成cuda内核代码。这个过程会非常痛苦但跟完一两个算子之后你整个知识体系就通了。阶段验收标准能自己定义一个算子写一个具有明确性能目标的手工schedule用TVM编译并部署到GPU上达到可复现的加速效果。3.4 阶段四MLIR——下一代基础设施建议6-10周MLIR是当前AI编译器领域的最大热点。谷歌的XLA核心基座已经是MLIRNVIDIA的TensorRT也在全面向MLIR迁移LLVM社区对MLIR的投入只增不减。如果说TVM让你理解了AI编译器的运作方式MLIR则是让你能站在架构层面思考和设计编译器。区别在于会用一个框架和能设计一个框架是两种完全不同的能力层次。MLIR的核心概念必须吃透DialectMLIR里的方言机制。不同层次的抽象对应不同的Dialect比如Tensor、Linalg、Math、Affine这些。理解Dialect如何通过ODS描述定义如何注册、如何转换。Dialect Lowering从高层Dialect逐步lower到低层Dialect最后变成LLVM IR。你要理解Pass如何驱动Dialect转换转换的合法性如何检查。Operation和Type系统MLIR把一切抽象为OperationType系统比LLVM IR更丰富灵活。这块要写代码理解光看文档远远不够。建议的学习资源是官方的Toy Tutorial这个例子一步步教你定义自己的Dialect、写Pass、做Lowering。文档本身写得非常好认真跟下来进步非常大。网上还有一些关于“MLIR for AI Compiler”的公开演讲PPT理解大厂的设计思路很有帮助。阶段验收标准能用MLIR框架实现一个简单的语言编译器比如只包含矩阵运算的极简DSL完成从自定义Dialect到LLVM IR的完整Lowering流程。3.5 阶段五Triton与分布式扩展按需选学到这个阶段TVM和MLIR已经能让你建立较完整的编译器知识框架。如果方向是做推理优化重点可以放在Triton上。Triton的理念和TVM不一样它不追求自动优化调度而是让用户通过一种类Python的语言直接编写高效的GPU Kernel编译器负责将块级操作映射为底层硬件指令。它的门槛更低但性能非常好目前PyTorch 2.0里引入的torch.compile底层就大量使用了Triton Kernel技术。如果方向是做训练优化重点可以转向分布式编译器相关技能比如张量并行的自动切分、通信和计算的重叠、流水线调度的编译期优化。这块参考资料相对少一些最好在具备前三阶段基础后直接跟着大厂的工程博客学习比如一些关于大规模训练性能优化的公开分享。到这一步学习路线的“基础版”走完了。时间大概需要六个月到一年具体取决于你每周能投入的有效学习时间。这里说的有效学习时间指的是真的静下心写代码调bug而不是开着视频课当背景音。4. 项目清单全解析从易到难做记录4.1 第一级项目LLVM Pass 练习集项目目标熟练掌握LLVM Pass的编写、注册、集成和测试流程。项目内容自己实现5-8个小Pass。例如死代码消除把没有任何外部可见影响的指令或函数移除、常量传播把编译期能计算出来的表达式直接替换为计算结果、循环不变代码外提把循环体内不变的运算提升到循环之前、内联小函数、指令合并等。每个Pass都要能用LLVM的正确性验证工具证明不破坏程序语义。实现要点第一遍先用Legacy PassManager写跑通了再看New PassManager的写法有什么区别。两者目前并存但New PassManager是趋势。写一个自动加载Pass的测试脚本批量跑编译测试用例检验正确性。用opt工具的--passes参数直达具体Pass方便调试。我个人的经验是别一上来就写复杂的分析Pass先从最简单的Transform Pass开始把“修改IR并验证结果”的全流程走通后面什么分析推理都是在这个基础上垒砖。验收标准写的Pass能通过LLVM自带的测试框架产出真实的性能提升或者体积减小并且用正确性工具验证过。4.2 第二级项目手写一个极简AI推理引擎项目目标把TVM学到的概念在最小范围内动手验证。项目内容实现一个针对ONNX模型的极小推理引擎。功能要求如下支持ONNX的基本算子Conv、BatchNorm、ReLU、Gemm、Softmax模型解析直接用ONNX Runtime的C API或者Python库不需要自己写解析器算子后端支持的硬件可以先只接CPU用OpenMP做并行不碰GPU不做图优化和自动调优只求正确功能和基本性能实现要点用Python搭一个简单的测试脚本从PyTorch导出ONNX模型再加载到自己的推理引擎里对比输出一致性。算子实现可以用三种方式渐进先朴素实现跑通正确性再用TVM生成一个优化实现最后对比两者的性能差距。这个过程能让你对“手工实现”vs“编译器优化”的差异有切身感受。这个项目的核心目标是理解推理引擎的数据流模型格式如何逐层变成算子调用中间结果如何做内存管理。这个项目做完你对“推理引擎”的理解会比看书深入得多。你会发现很多之前不懂的细节问题——比如Conv各个维度在内存里的排列方式、BatchNorm在推理时如何折叠到卷积里——都是在实现过程中自然理清的。验收标准能在CPU上完整跑通ResNet18级别的模型推理输出精度与ONNX Runtime对比相对误差在合理范围内。4.3 第三级项目给TVM写一个自定义算子项目目标破解TVM的完整编译流程跨过“能把代码跑起来”和“能往框架里加新东西”这道分水岭。项目内容选择一个TVM里不存在的算子或者一个性能表现明显不如预期的算子做一个从实现到集成再到持续调优的完整过程。我的建议是从一个融合算子入手。比如把Elementwise Add和ReLU融合成单算子虽然是所有教程案例都会提的经典模式但真的很经典做一遍受益匪浅。跑通之后再去啃一个更复杂的融合场景中间二次运算加上激活函数。实现要点第一步在Relay层注册算子的定义和校验逻辑保证能通过graph construction。第二步用TE写schedule这一步是最难的因为需要理解不同硬件上的优化模式。可以先从简单的vectorize、parallel、unroll开始再试tile和split。第三步需要理解如何通过topi库和TVM的代码生成机制把算子编译成目标代码。性能优化要设置一个明确的目标值。例如我的经验是先测量基线ONNX Runtime的算子性能再对照TVM的schedule优化结果目标不能只是“和基线持平”至少要快10%以上否则说明schedule还没写到位。验收标准自定义算子在TVM中完成注册并成功编译运行性能优于框架默认实现并且提交一份包含调优过程的完整报告怎么从最初的schedule调整成最终版本的每一步性能变化如何。4.4 第四级项目用MLIR实现一个简易矩阵运算DSL项目目标真正把MLIR这套框架用起来而不是停留在看懂文档的层面。项目内容设计一个极简的矩阵运算DSL语法类似Python的子集只支持变量声明、矩阵乘、逐元素加减、转置这四种操作。然后完成从解析到代码生成的完整编译器流程。具体的技术栈语法解析可以用Python做前端或者直接用C手写递归下降解析器定义一个新的Dialect叫MatrixDialect包含矩阵乘、矩阵加、转置等Operation写Pass将自定义Dialect Lowering到Linalg或Affine Dialect再通过LLVM下的MLIR转换最终生成可执行代码实现要点DODS和TableGen是MLIR扩展的硬骨头建议先在Toy教程里把这两个工具用熟练再尝试独立设计Dialect。Lowering链路上最容易出问题的环节是属性转换和类型转换一定要多看MLIR的转换工具生成的源码理解它到底做了什么。代码生成之后可以用MLIR自带的Runner跑一遍再用mlir-opt看优化后的IR逐步排查性能问题。这个项目做完再去看XLA或TensorRT的源码会有一种“原来是这么回事”的通透感。极端推荐把这个项目纳入个人作品集面试的时候把这些系统设计讲清楚比堆十个项目经历都值钱。验收标准能写出一个包含矩阵乘和加法的DSL程序通过自己的编译器编译并在CPU上运行正确性经过验证且性能不低于手写C的实现。4.5 第五级项目端到端大模型推理性能优化项目目标把前面积累的能力用于真实的大模型推理场景。项目内容基于TensorRT-LLM或vLLM框架对一个大语言模型比如Llama-3-8B做一次端到端的推理性能优化。不满足于直接用现成的配置要把哪里慢、为什么慢找出来再针对性地改。重点优化的方向有三个Prefill阶段这是计算密集型的优化的核心在算子维度的调整比如FlashAttention的融合实现不同的GeMM切分方式对性能影响很大。Decode阶段这是访存密集型的优化的重点是KV Cache的布局、内存访问模式以及核函数启动的开销优化。动态形状处理LLM的序列长度变动频繁需要理解padding、桶化、调度等策略对吞吐的影响。实现要点用NVIDIA Nsight的profiling工具分析瓶颈点建议花时间学会看它的各种time line和各层开销。不要凭感觉猜性能瓶颈。每次改动只改一个变量用控制变量的方法排查性能变化。比如先只改量化方式对比一下再只改调度策略对比一下不要同时改多个。量化和稀疏化的实验可以放在后续阶段做先把计算图和内存这两块的优化吃透再碰精度相关的优化手段。这个项目的目的不是真的要你用编译器原理写一个新框架而是验证你对编译器优化思路在真实工程场景中的运用能力。验收标准在不损失模型精度的前提下将推理延迟降低15%以上或吞吐提升20%以上同时输出一份性能剖析报告讲清楚哪些优化手段带来的收益最大哪些投入产出比不高。5. 踩坑实录那些没人提前告诉我的细节5.1 不要花太多时间在“看”而不是“写”这是最普遍的坑也是我犯过的错。LLVM和MLIR的文档量巨大看文档很容易产生“我都懂了”的错觉但一动手就露馅。代码和文档是两种阅读理解模式前者对细节的要求高得多。建议给自己定一条硬规矩每看一小时文档至少花两小时写代码哪怕写的代码很简单也能帮你定位理解上的盲区。我自己的经验是跟着教程写完一个Pass之后再回头看文档之前看不懂的地方往往就突然通了。5.2 环境问题会浪费大量时间先从容器或镜像开始AI编译器的环境依赖非常魔鬼。LLVM的版本要和TVM匹配TVM的build配置要和CUDA版本匹配CUDA版本又要和GPU驱动匹配中间任何一个不匹配都可能导致莫名其妙的编译错误。个人建议初期用官方提供的Docker镜像先把环境跑通再说。等项目进入自研阶段再考虑从源码构建完整工具链。有同学跟我说“从源码从头构建学会更多”——这个观点没错但不适合入门阶段入门阶段的重心是逻辑理解和代码能力不是环境配置。5.3 读源码时别追求“全理解”TVM有几十万行代码MLIR更多指望全部读懂不现实。我的建议是任务驱动式阅读先有一个明确的任务加一个算子、修一个Bug、优化一个Pass然后从入口函数开始沿着调用链往下走走到哪算哪。这种方式下的阅读效率比从入口到尾读完高得多因为你知道每一段代码是为了解决什么问题才出现的而不是被动地吸收信息。5.4 性能优化的判断标准百分比是个位数没有意义在做算子优化和推理优化项目时要给自己定一个合理的性能目标。真事有人写了一个TVM的schedule调了半天最终跑出来的性能比同一环境下的手写CUDA核函数还慢20%然后问我怎么改进。我的第一反应是先验证是不是测量方法的问题——比如GPU没有被充分利用、大量时间耗在kernel启动开销和CPU-GPU数据传输上。把这些开销厘清再着手优化schedule。性能的基准一定要用工具去量比如Nsight Systems和Nsight Compute绝对不要凭感觉。5.5 重视“中间表示”的理解而不是背API学AI编译器最大的误区是背API。TVM的api数量非常多MLIR提供了更多的注册表、工具函数。但面试和实际工程中最看重的不是“你记得哪个API”而是“你知道数据在不同层级的表示之间怎么流动”。API可以查文档现学IR的理解是结构性的、难以快速弥补的。所以所有的学习项目我都会强制自己从IR层面了解发生了什么TVM中等价于原本的计算图在pass前后的形式是什么样的MLIR中的Dialect为什么非得这个顺序进行转换这个思维模式才是能把编译器知识迁移到新工作的通用能力。5.6 不要迷信单一框架要关注“编译器思维”有很多人问“该学TVM还是MLIR还是XLA”这个问题的答案其实是都要至少理解一层但不需要每个都成为专家。TVM展现了完整的AI编译流程MLIR展现了现代编译器基础设施的设计思想XLA展示了在大厂生产环境里如何落地。把每个框架的核心思想吃透比把一个框架的所有源码读完更有价值。跨框架的对比思考尤其重要为什么TVM要做自动调度搜索而MLIR更强调可组合的Dialect设计为什么Triton选择和TVM完全不同的用户交互方式这种“架构性思维”才是面试官最看重的。6. 关于日常积累的几点建议6.1 用周报的方式记录学习进度AI编译器的知识链条很长LD从计算图到指令集环环相扣很容易学了后面忘了前面。建议你每周写一份学习周报不需要发给任何人就是给自己的记录。内容包括本周学了什么、哪些概念理解了、哪些还一知半解、下周要解决什么问题。这个习惯的价值在三个月后开始显现你能清楚地看到自己在哪里卡住过也能更准确地定位当前的知识盲区。我个人的感觉是这种记录方式比“刷完xx教程”带来的安全感更真实。6.2 找到一个社区持续输入AI编译器的迭代速度非常快文档和书籍的内容往往滞后半年。想保持知识更新最好的方式是持续关注开源社区的动态。GitHub上TVM、MLIR、Triton、XLA的仓库、PR讨论和Issue都是很好的学习材料。不用每个都精读每三天花一点时间看看最近有什么新改动会潜移默化地培养你的工程直觉知道哪些问题是大家关注的、哪些方向在快速推进。6.3 建立自己的“性能优化知识库”在积累项目的过程中很多优化技巧和踩坑经验是零散出现的——比如某个指令组合在特定GPU架构上特别快、某个数据布局在处理非连续访问时效率特别差。建议随手记到一个本地文档里定期整理归纳。这个知识库后期就是你面试时最独特的谈资也是你工作后快速解决问题的第一手资料。我做这个方向的整体感受是AI编译器确实难但不是那种靠堆时间就能解决的问题它更考验你对计算本质的理解能力和系统思维能力。反过来一旦建立了这种能力你在AI Infra领域里看任何性能问题都会有更透彻的视角。希望这条路线和项目清单能让你少走一些弯路把这个领域从“想学但不知道从哪里开始”变成“已经开始动手做了”。