PolyBlocks: A Compiler Infrastructure for AI Chips and Programming Frameworks

本文介绍了 PolyBlocks,这是一个基于 MLIR 的模块化编译器基础设施,通过组合轻量级仿射分析与启发式成本模型自动执行多级分块、融合及算子映射等优化,实现了从高层框架到特定 AI 芯片的高效代码生成,并在 NVIDIA GPU 上的实验表明其性能可媲美甚至超越 Torch Inductor 和 XLA。

Uday Bondhugula, Akshay Baviskar, Navdeep Katel, Vimal Patel, Anoop JS, Arnab Dutta

发布于 Tue, 10 Ma
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文介绍了一个名为 PolyBlocks 的新系统。为了让你轻松理解,我们可以把AI 芯片(如 NVIDIA 显卡)想象成一座超级繁忙的现代化厨房,把AI 模型(如 PyTorch 写的代码)想象成复杂的食谱

1. 核心问题:为什么需要 PolyBlocks?

现状:大厨与传菜员的困境
目前,当我们用 PyTorch 或 JAX 写 AI 程序时,就像是一个只会写“食谱”的大厨(高级框架)。

  • 传统做法(Eager 模式): 大厨每写一步(比如“切菜”),就喊一声,传菜员(编译器)立刻去厨房找现成的工具(厂商库,如 CuDNN)把菜切好,端上来,再喊下一句。这导致厨房进进出出非常频繁,效率低,而且很多步骤是重复的。
  • 现有编译器(如 Torch Inductor, XLA): 它们试图把整张食谱看一遍,然后优化。但它们有个大毛病:它们太依赖“现成的工具包”了。如果食谱里有个特殊的菜,工具包里没有,它们就束手无策,或者只能生硬地拼凑。而且,如果厨房换了新设备(新芯片),这些编译器往往需要大改,因为它们和特定的“工具包”绑定太死。

PolyBlocks 的解决方案:全自动的“超级管家”
PolyBlocks 就像是一个拥有上帝视角的全自动超级管家

  • 它不依赖任何现成的“工具包”(厂商库)。
  • 它拿到食谱后,会从头到尾重新设计整个烹饪流程。
  • 它能自动决定:哪些步骤可以合并?哪些食材可以提前切好放在手边(显存优化)?怎么利用厨房里的特殊机器(矩阵计算单元)?
  • 最重要的是,如果厨房换成了新的设备(比如新的 AI 芯片),只要告诉管家新设备的特性,它就能利用同一套逻辑,重新生成一套完美的烹饪流程,而不需要重新发明轮子。

2. PolyBlocks 是怎么工作的?(核心魔法)

PolyBlocks 的核心在于它把复杂的优化过程拆解成了几个像乐高积木一样的步骤(Pass Pipelines):

A. 切片与融合(Slicing-based Fusion):把“分步做”变成“一气呵成”

  • 比喻: 假设食谱说“先切洋葱,再切土豆,然后把它们炒在一起”。
    • 普通做法: 切好洋葱放盘子里,切好土豆放另一个盘子,最后倒进锅里炒。中间多洗了两次盘子,还多走了几步路。
    • PolyBlocks 的做法: 它发现“切洋葱”和“切土豆”其实可以同时进行,或者切完直接下锅。它把这两个步骤融合成一个动作,甚至把中间那个“盘子”(临时内存)都省掉了。
    • 创新点: 它的“融合”非常聪明,甚至允许为了省时间,稍微多切一点点洋葱(冗余计算),只要整体速度更快就行。

B. 分块与搬运(Tiling & Packing):把“大仓库”变成“手边小抽屉”

  • 比喻: 厨房的冰箱(显存)很大,但拿东西慢;灶台旁边的抽屉(片上内存/寄存器)很小,但伸手就能拿到。
  • PolyBlocks 的做法: 它不会一次性把整袋面粉(大数据)从冰箱搬到灶台。它会计算好,每次只搬刚好够炒一盘菜的量(分块/Tiling)到抽屉里。
  • 动态打包: 对于卷积(一种特殊的图像处理),它甚至能像变魔术一样,在搬运的过程中就把食材“切好、摆好”(On-the-fly packing),让机器一拿起来就能直接加工,不需要额外的整理时间。

C. 自动适配“超级机器”(Mapping to Matrix Units)

  • 比喻: 现代厨房里有专门的“自动切肉机”(GPU 的 Tensor Core),一次能切 16x16 的肉块。
  • PolyBlocks 的做法: 它会自动把食谱里的普通切菜指令,转换成“自动切肉机”能听懂的语言。它不需要人工去写复杂的机器代码,而是自动把数据排列成机器最喜欢的形状。

D. 注意力机制的融合(Attention Layer Fusion)

  • 比喻: 在 Transformer 模型(如大语言模型)中,有一个叫“注意力”的步骤,需要计算大量的数据关系,通常非常慢。
  • PolyBlocks 的做法: 它把原本需要分好几步、来回搬运数据的复杂过程,压缩成一个超级流畅的流水线。它甚至能在计算过程中直接修正数据,不需要把中间结果写回硬盘再读出来。这让大模型跑得飞快。

3. 效果如何?(实战表现)

论文在 NVIDIA 的 A100 和 A10 显卡上做了测试:

  • 对比对象: 目前业界最强的两个编译器(Torch Inductor 和 XLA),它们通常依赖厂商提供的“现成工具库”(如 CuDNN)。
  • 结果:
    • 速度: 在大多数情况下,PolyBlocks 生成的代码比 Inductor 和 XLA 更快,或者至少一样快
    • 独立性: 最惊人的是,PolyBlocks 完全不需要依赖那些昂贵的厂商库。它自己生成的代码,在单个任务(如矩阵乘法)上,竟然能和那些由顶级工程师手写的、经过几十年优化的库(如 CuBLAS)打得有来有回,甚至有时更快!
    • 通用性: 它不仅能跑 PyTorch,也能跑 JAX。而且,如果未来出了新的 AI 芯片,PolyBlocks 只需要花很少的精力就能适配,不需要像其他编译器那样推倒重来。

4. 总结:为什么这很重要?

想象一下,以前我们要去一个新的城市(新芯片)旅行,必须找当地导游(厂商库)带路,如果导游不在,我们就寸步难行。

PolyBlocks 就像是一个自带 GPS 和全能翻译的旅行机器人。

  • 不管你去哪个城市(新芯片),它都能自己规划路线。
  • 不管你说什么语言(PyTorch, JAX),它都能听懂并执行。
  • 它不需要依赖当地的导游,自己就能把路走得比导游还快。

这篇论文证明了:完全由编译器自动生成的代码,不仅可以和人工优化的库相媲美,而且在面对未来不断变化的 AI 硬件时,具有更强的生命力和适应性。 这是通往未来 AI 硬件自动适配的关键一步。