Compiler Technologies in Deep Learning Co-Design: A Survey
【综述解析·II】Compiler Technologies in Deep Learning Co-Design: A Survey
领域:计算机科学→软硬件协同→编译器
本文涉及的资源:
- https://buddycompiler.com/
- https://github.com/buddy-compiler/buddy-mlir
- https://github.com/buddy-compiler
摘要:
随着深度学习应用的快速发展,通用处理器已难以满足深度学习工作负载的需求,摩尔定律的消退加剧了这一趋势。因此,面向领域的设计迎来了计算机体系结构创新的黄金时代,同时也催生了对新型编译技术日益增长的需求,以促进跨层次优化。从历史上看,硬件与软件一直以来都是协同设计的。时至今日,这种协同设计理念仍然在深度学习领域的学术界与工业界发挥着重要作用,且其涵盖的范围不断扩展并深化多个维度和层次。在本研究中,我们详尽阐述了过去与近期在深度学习编译器与协同设计方面的相关工作,重点探讨两者结合的方法——我们认为,这正是新一代深度学习时代的主流趋势。在总结现有编译技术与协同设计方案后,我们提出了一种面向典型深度学习协同设计系统的领域专属编译框架——Buddy Compiler。
该论文发表在 Intelligent Computing,是软件所发表的创新型综述。
引言
随着摩尔定律衰退的趋势日益明显,通用处理器已无法满足深度学习工作负载在性能与功耗方面的需求。因此,业界与学术界纷纷投身于硬件–软件协同设计,而编译器技术则成为关键组成之一。从历史上看,深度学习软硬件相互促进:硬件进步推动算法升级,而算法特性也激发硬件创新。随着深度学习模型规模与复杂度的增加,从早期的六千万参数增长至如今的一千七百五十亿参数,应用领域也从图像与语音识别扩展至 AIoT、机器人、推荐系统以及多模态生成模型。与此同时,各类硬件加速架构不断涌现,包括 CPU 扩展、GPU 和张量核心,以及专用深度学习加速器。软硬件的快速发展要求系统具备协同设计能力,以实现多层次优化。此外,编译技术在深度学习软硬件系统中的应用日益广泛,涵盖编译器基础设施、深度学习编译器及其优化技术。这些编译技术为计算机体系结构与深度学习的黄金时代提供了新的协同设计机会。
在深度学习的硬件–软件协同设计中,硬件架构创新是根本,软件设计是关键,而软件到硬件的映射决定最终效果。深度学习系统负责映射与优化,其过程包括模型级优化、工作负载切分、任务映射与硬件接口。为实现更高性能,整个流程均需调优,这对于协同设计至关重要。在实践中,最直接的调优方式是软硬件团队之间的沟通以明确需求;与此同时,自动协同设计方法如自动调优、自动调度与设计空间探索也被深入研究。
面对当下深度学习框架与硬件平台的碎片化,编译技术在协同设计中发挥关键作用,有效避免组合爆炸并提供更多优化契机。编译技术包括前端支持、中间表示、编译优化、代码分析、多后端代码生成等。在软硬件映射过程中,网络结构搜索、模型压缩与工作负载映射等不同层次引入了编译技术,而这些层次多数依赖于深度学习编译器。就硬件层面而言,硬件编程语言与编译器基础设施正迅速发展,以通过更优抽象支持深度学习加速器设计。编译技术的本质在于抽象,而软硬件抽象正朝向统一的中间表示发展。我们认为,编译技术将为协同设计带来更多可能,从而更好满足深度学习系统的性能与功耗要求。
许多深度学习综述论文已对优化技术、硬件架构、协同设计方法与编译技术进行总结。就我们所知,本研究是首篇从“结合编译技术与协同设计”角度系统探讨深度学习系统的工作。本文的主要贡献如下:
- 梳理了深度学习软件、硬件、协同设计与系统的发展历程;
- 概述了深度学习协同设计系统中的关键技术;
- 分析了协同设计中软件与硬件层面的编译技术;
- 探讨了编译技术在协同设计中的现存问题与未来趋势;
- 提出了一种面向深度学习协同设计的编译器框架。
本文结构安排如下: 首先在背景一节介绍深度学习与协同设计的发展;接着在“用于协同设计的深度学习系统”一节阐述协同设计系统与编译技术之间的关联;随后在“用于协同设计的深度学习系统中的编译技术”一节,回顾深度学习编译器与硬件编译器基础设施;在“现存问题与未来方向”一节,分析编译技术与协同设计中的未决问题并提出未来愿景; “Buddy Compiler:面向协同设计的深度学习编译器框架”一节则展示该框架的总体设计与当前进展;最后在结论部分对全文进行总结。
背景
近年来,深度学习的快速发展对硬件性能提出了更高要求。然而,处理器中晶体管数量的增长速率已趋于有限,这表明摩尔定律正处于下行阶段,Dennard 标度法也已失效。结果是硬件性能增长无法满足深度学习工作负载的需求。为解决这一问题,学界与产业界纷纷投入多种加速架构的研究,开启了计算机体系结构的黄金时代。为了适应深度学习模型与硬件架构的创新演进,深度学习系统逐步引入编译技术,这标志着硬件–软件协同设计迈入了新纪元。本节将介绍深度学习软件、硬件、协同设计及系统发展的背景。
Dennard 标度法指出,当半导体晶体管尺寸按比例缩小时,其工作电压、电流和功率也按同样比例降低,从而维持功率密度不变,使芯片可在更高频率下运行且不会过热。
深度学习软件与硬件的发展
在神经网络与深度学习领域,软件与硬件的发展具有相辅相成的特性。从历史趋势来看,硬件性能的提升能推动深度学习理论的发展,而工作负载特征又能激发硬件体系结构的创新。本文将从历史进程中总结硬件和软件在神经网络与深度学习兴衰周期中的发展路径。
①神经网络最早出现在 20 世纪五六十年代,但当时无论硬件性能还是软件理论都不足以支撑其实用应用。由于乘法单元造价高昂,神经计算主要依赖加法运算,因此结构上只能使用二值神经元。理论方面,“感知器”不可线性分离,无法解决诸如 XOR 等实际分类问题。这一阶段硬件与理论的双重不足直接导致了首次人工智能寒冬。
②进入 1970 至 1980 年代初,通用处理器经历 CISC 向 RISC 演进,为软件与硬件之间提供了抽象层。编译技术进一步改善了硬件–软件接口,推动了体系结构和编程语言的创新。随着摩尔定律的推进,集成晶体管数目迅速增长,处理器性能获得显著提升。
③然而在 1980 至 1990 年代中期,尽管硬件能力持续改进,领域专属库与工具的缺失成为瓶颈。多年的硬件积累催生了理论创新,迎来第二波神经网络浪潮。卷积神经网络在手写字符识别中取得早期成功,并激发硬件加速器的研究。但由于数据收集困难和训练时间过长,加之领域专属工具缺乏,也引发了第二次神经网络寒冬。
④进入 21 世纪初,随着摩尔定律下行,神经网络框架开始出现。这一时期,指令级并行性(ILP)成熟,性能显著提升。在网络结构演化上,Torch 与 MATLAB 等工具获得应用,但仍需大量开发者手工介入,导致较高人力成本。
⑤至 2000 年代末,Dennard 标度效应减弱,神经网络逐步加深。Dennard 标度原指功耗随工艺演进保持不变,当其失效时,必须依靠更高效的并行方案。这一时期进入多核时代,多核架构虽未根本解决功耗问题,但通过增强并行性提升了性能。然而根据 Amdahl 定律,多核性能上限取决于工作负载的并行度。幸运的是,神经网络层数的加深使深度学习任务高度并行化,从而抬高了多核架构的性能天花板,推动了深度学习时代的到来。
Amdahl 定律指出,系统的最大加速比受限于串行部分,其公式为:$$S=\frac{1}{(1-p)+\frac{p}{N}}$$ 其中 是可并行部分的比例, 是并行处理单元数。
⑥在二十一世纪十年代初,GPU 的发展引发了深度学习的快速增长。得益于多年来在人工智能领域的积累以及 CUDA 生态系统的支持,Nvidia 在深度学习训练方面取得了重大成功。Krizhevsky 等人利用 GPU 实现的卷积神经网络(ConvNet)性能超越了以往的手工方法,这一成果成为卷积神经网络与 GPU 发展史上的重要里程碑。受这些成果的启发,一些深度学习框架相继出现,例如 Caffe、Chainer 和 Theano。这些框架旨在帮助开发者实现更为复杂的深度神经网络(DNN),并支持 GPU 加速,进而推动了卷积神经网络(CNN)及其变种的研究。
⑦在 2010 年代后期,随着领域专用加速架构(DSA)和深度学习框架的发展,神经网络规模得以显著扩展。为实现更高性能并控制功耗,DSA 被广泛应用于训练与推理阶段,这在一定程度上源于 Dennard 缩放律的彻底终结。同期,多家大型科技公司陆续推出了开源深度学习框架,进一步促进了相关应用与研究的普及。依托 DSA 与深度学习框架,神经网络架构实现了从循环神经网络(RNN)到 Transformer 的持续演进,其应用场景也拓展至阅读理解、机器翻译以及图像生成等任务。然而,深度学习框架与硬件体系结构呈现碎片化趋势,导致大量移植需求,系统层面需频繁进行重复开发,显著增加了人工负担。因此,编译技术被引入以提升可重用性与可重定目标性,从而带来更多优化空间。
⑧进入 2020 年代初期,大规模神经网络将深度学习推向新高,对底层系统提出更高要求。经过多轮基于 Transformer 的设计迭代,生成式预训练 Transformer(GPT)系列取得了突破性进展,ChatGPT 的成功便是其中的代表。这类大模型的参数规模已达到千亿级别,训练与推理均需依赖高度并行的硬件架构与集群。各大科技公司也相继推出 AI 硬件与平台创新,例如 Nvidia、Xilinx、Intel、华为、寒武纪、平头哥、Tenstorrent、Sambanova、壁仞科技等。 为了实现高效的工作负载与硬件映射,计算框架也在持续发展新技术,以支持大模型的训练与部署。例如 Ray 和 OneFlow 等分布式计算框架,以及 PyTorch 2.0 和 OpenXLA 等深度学习平台,都得益于高效的编译优化机制。
可以预见的是,未来的软件与硬件生态将持续向软硬协同设计的方向发展。
不同时期的协同设计
软硬件协同设计是一种联合设计方法,旨在通过软硬件的协同优化以满足系统在性能、功耗等方面的约束。如图 1(上图) 所示,在神经网络早期的兴起与衰退阶段,软件与硬件的发展呈交替趋势。进入 2010 年代,深度学习相关的软件与硬件开始同步快速发展,为广泛的协同设计提供了可能。协同设计的研究范围广泛,在不同阶段与领域中提出了多种方法。软硬件协同设计已有约三十年的发展历程,本文将对这三十年的演进过程进行概述。
第一阶段的协同设计
20 世纪 90 年代,集成电路技术的发展推动了硬件设计的高度集成,指令集处理器的发展也促进了软件的发展,从而实现了初步的软硬件协同设计。当时的研究主要集中在软硬件划分问题,所采用的方法包括二分划分法和基于图的划分方法。该阶段的协同设计实现效率较低,主要依赖人工进行设计空间与参数的选择。随后,计算机辅助设计(CAD)工具的出现降低了协同设计的人工成本;同时,可编程逻辑器件(如 FPGA)的发展模糊了软硬件之间的界限,为协同设计提供了新的方向与机遇。
第二阶段的协同设计
进入 21 世纪初期,微电子技术的发展推动了异构系统级芯片(SoC)的集成,协同设计方法也开始关注片上网络通信开销,并引入 CAD 工具与多目标优化技术。此外,设计空间探索(DSE)技术的应用也开始推动软硬件的联合设计。这一阶段的协同设计系统复杂性显著提高,通常包括建模、仿真、优化、综合与测试等多个环节。
第三阶段的协同设计
自 2010 年代以来,摩尔定律的放缓与 Dennard 缩放的失效限制了处理器性能的进一步提升,并使得功耗控制面临更大挑战。与此同时,深度学习迅猛发展,模型规模不断扩大,对硬件性能的要求也大幅提高。因此,众多深度学习系统研究开始采用协同设计方法。在软件方面,深度学习框架与高性能算子库的发展充分利用硬件加速特性;在硬件方面,领域专用加速器(DSA)的设计则可针对特定工作负载进行加速,并规避通用架构中的功耗瓶颈。此外,随着硬件架构的创新,编译技术也进入快速发展阶段,在近年来被广泛应用于深度学习系统中,通过基于编译器的协同设计进一步拓展了加速优化的空间。
用于协同设计的深度学习系统
深度学习系统能够帮助开发者降低系统开销,并在不同层次上提供优化机会。如图 2(下图) 所示,该系统涵盖了端到端的深度学习软硬件体系、硬件开发方法以及协同设计技术。该系统旨在降低工作负载的计算复杂度,提升执行效率,并增强硬件的峰值性能。本节将介绍用于协同设计的深度学习系统的组成部分及其所使用的编译技术。
神经网络架构设计与优化
神经网络架构优化可有效降低工作负载的计算复杂度,常用方法包括高效模型结构设计、剪枝、量化、面向硬件的神经网络结构搜索,以及算子融合等。在这些方法中,结合编译技术的协同设计方法取得了更优的效果。
相较于传统的硬件感知型神经网络结构搜索,CHaNAS 在搜索空间中引入了编译器调度策略,从而在目标硬件上实现更高性能。MCUNet 将模型设计与编译器优化进行集成,包括 TinyNAS 与 TinyEngine 两个模块,前者用于神经网络结构搜索,后者通过消除指令与内存访问冗余以生成优化后的代码。在模型压缩方面,编译器模式可引导结构化剪枝,从而降低模型的计算复杂度,相关研究包括 PCONV、PatDNN 和 CoCoPIE 等。
工作负载划分与映射
深度学习的端到端过程包括将工作负载划分为加速节点,并进一步映射至硬件指令或结构。划分策略有助于挖掘并行性,提升训练或推理的可扩展性。映射方法涉及编程模型与编译器技术,用于提升工作负载的执行性能。
张量划分或模型划分是常见的策略,前者对输入数据进行划分,后者则对整体计算任务进行划分,以充分利用硬件资源实现并行化。数据并行与模型并行是两种主要划分方式:数据并行通过在每个加速节点上复制相同的模型,实现不同数据的并行处理;模型并行则将模型划分到不同的加速节点,各节点并行执行模型的不同部分。现有方案既有仅考虑通信开销的经验驱动方法,也有同时兼顾通信与计算开销的优化方法。
工作负载映射旨在将粗粒度的算子转换为目标硬件上的指令或接口。其实现方式可分为深度神经网络库与深度学习编译器两类。前者依赖针对特定硬件设计的编程模型来实现高性能算子,或通过复用现有的基本线性代数子程序(BLAS)库进行加速。这类库的优化通常依赖手工实现的算法。后者通过编译器将编程原语或内建函数映射为硬件指令。另一种常见方法是使用深度学习编译器,将深度学习模型转换为中间表示(IR),对其进行多层次优化,并借助硬件工具链完成最终的代码生成。编译技术的引入提升了协同设计的可重用性与自动化水平。
此外,在硬件后端为 FPGA 的场景中,高级综合(HLS)也是一种重要的映射手段。HLS 可将高层次的神经网络表示直接映射为硬件结构以实现加速。其开发流程通常始于使用特定编程模型(如 OpenCL)编写工作负载,并结合先进的编译技术进一步提升 HLS 的优化潜力。
硬件加速的分类与方法
深度学习工作负载的高计算密集性以及通用处理器性能提升的瓶颈共同推动了硬件加速能力的发展。目前,硬件加速体系结构呈现多样化趋势,涵盖多种类别与实现方法。此外,也出现了多种硬件开发范式与工具,近年来,一些新型编译技术也被引入到硬件开发流程中,其细节将在后续“深度学习硬件设计中的编译技术”部分进行详细阐述。本节将对硬件加速架构进行分类,并介绍其主要加速策略。
按硬件平台分类
CPU 加速扩展通过引入并行存储访问与计算单元以实现数据级并行性。其中,单指令多数据(SIMD)扩展是最常见的加速架构,能够支持深度学习工作负载的向量化处理;而新兴的向量扩展与高级矩阵扩展则在支持深度学习特性方面具有更强能力。在算子级别,性能提升可依赖编译器的自动向量化功能,或利用编译器提供的内建扩展特性手动实现优化算法。一些深度学习框架还引入了统一抽象层,以适配不同 CPU 扩展的内建接口,通常被称为通用内建层或全局内建层。
GPU 拥有强大的线程级并行能力,能够实现高吞吐量的数据处理,并且成熟的软硬件生态使其成为目前最广泛应用于深度学习领域的加速平台。已有加速器验证的优化策略也逐步被移植至 GPU 体系中,例如精度降低、稀疏性支持以及张量核心设计等。GPU 的性能优化主要依赖多线程机制与存储层次结构的高效利用。开发者通常使用如 CUDA、OpenCL、OpenACC 以及 Vulkan 等 GPU 编程接口来实现相应的优化策略。这些接口中的部分在MLIR或LLVM中间表示中具备对应的转换机制,用于开发编译优化过程。此外,标准可移植中间表示(SPIR-V)正在构建适用于并行计算与 GPU 编译器的统一生态,力图成为连接高层编程接口与底层硬件平台的标准中间表示。
这里作者疑似有严重疏漏,LLVM 早就不是 low-level virtual machine 的缩写了(虽然其曾经是)。所以这里直接写了 LLVM。
FPGA 具备高性能与低功耗的特性。由于其硬件可编程性,基于 FPGA 的设计具有足够的灵活性以适应深度学习工作负载的变化。在软硬协同设计方面,FPGA 为用户提供了细粒度的协同优化能力与更广阔的设计空间,进而有助于提升系统整体性能。对 FPGA 的优化主要集中在高效利用其大量的数字信号处理单元。此外,FPGA 厂商也在持续提供面向深度学习的软硬件支持,例如 Xilinx 推出的 Versal 自适应计算加速平台与 Vitis AI 平台等。
CGRA(粗粒度可重构架构)由处理单元阵列和互连交换结构组成,其快速重构能力为特定领域提供了良好的灵活性与实用性。基于 CGRA 的深度神经网络加速器可以作为 CPU 的协处理器接收指令与数据,并通过静态分配的指令完成处理单元的执行。此外,CGRA 也可作为数据流处理器,加速深度神经网络的数据流图。这类设计通常依赖编译器与工具链的支持,用于将深度学习模型映射到具体指令或图表示形式上。
ASIC(应用特定集成电路)针对特定的加速架构进行设计,在功耗受限场景下可实现极高性能。然而,此类硬件在制造完成后不可重新配置,因此通常需要具备一定的软件可编程性以适应深度学习模型的演进。基于 ASIC 的设计可作为加速 DNN 的 CPU 协处理器、独立的 DNN 加速器,甚至构建为超级计算机。此类加速器的编译器与工具链往往与特定深度学习框架深度绑定,从而在协同设计过程中缺乏灵活性。
按照神经网络执行策略的不同,硬件加速架构可分为流式架构与计算引擎架构。
- 流式架构以数据驱动为核心理念,将神经网络映射为若干硬件模块,每个模块对应一个神经网络层,各层模块组合形成流水线以执行完整模型。由于每个模型对应一套特定的硬件实现,此类架构通常部署于可重构硬件平台上。
- 计算引擎架构则以指令驱动为主,编译器将神经网络转换为指令集,由计算引擎进行解码与执行。此类计算引擎可设计为 systolic 架构或向量处理架构。
前述章节总结了深度学习系统中的关键优化技术,包括神经网络架构优化、高性能库与编译器优化,以及硬件加速架构优化。为实现上述技术的协同增益,协同设计成为核心环节。我们认为,协同设计的本质在于平衡软硬件之间的优化权衡。在实践中,软件与硬件开发者需理解彼此设计方案,进行高效沟通,并共同做出设计决策。根据我们的经验,通用的协同设计流程通常包括约束条件的制定、接口的设计以及优化策略的迭代。完成初始设计与实现之后,可进一步采用多种协同优化技术以微调特定负载,包括自动调优、自动调度与设计空间探索等。这些技术在基本思想上较为一致,其步骤包括: - (a)构建参数化的软件或硬件设计组成的搜索空间;
- (b)选择搜索策略以在搜索空间中选取配置;
- (c)根据配置参数通过模拟器或硬件执行工作负载;
- (d)从实际硬件或代价模型中收集执行数据;
- (e)依据数据反馈对设计进行优化;
- (f)迭代搜索,直至满足约束条件。
在上述步骤中,搜索策略与代价模型决定了整个调优过程的效率。目前已有部分研究聚焦于搜索策略与代价模型的改进。此外,我们认为,通过引入更多维度扩展搜索空间也是一个值得进一步探索的方向。
深度学习系统中用于协同设计的编译技术
近年来,编译技术逐渐被引入到深度学习系统中,特别是在深度学习编译器与硬件编译基础设施方面,以提供更大的协同设计空间和优化机会。传统编译器通常划分为三个阶段:
- 前端解析编程语言,
- 中端对中间表示(IR)进行优化,
- 后端生成硬件指令。
每一阶段的编译技术涵盖:前端的词法、语法与语义分析;中端的中间表示转换、数据流分析、控制流分析及跨过程优化;以及后端的指令选择与寄存器分配。
这些传统编译技术思想为当前深度学习软硬件系统中面临的问题提供了解决思路。本节将介绍适用于深度学习编译器与硬件编译基础设施的编译技术。
注:编译技术里只描述到了能跑通一个编译流程的最核心步骤。
深度学习编译器
深度学习编译器起源于深度学习框架。传统的深度学习框架依赖深度神经网络(DNN)库与运行时引擎来执行计算图。然而,在面向多种硬件平台部署时,DNN 库通常需要重新实现,而编译器的可重定向性为这一问题提供了解决方案。因此,现代深度学习框架逐步引入了编译支持。当前已有许多独立的深度学习编译器,这些编译器与多个深度学习框架兼容,并主要用于推理阶段:编译器以预训练模型为输入,由前端将模型转换为中间表示,经过中端优化后降低为低层次 IR,最后由后端结合现有工具链生成目标硬件代码。随着大规模神经网络的出现,训练框架也开始引入编译技术以实现加速。近期发布的 PyTorch 2.0 引入了 TorchDynamo 与 TorchInductor,用于将 PyTorch 代码编译为优化后的计算核,并利用 Triton 作为 GPU 编程模型生成代码。
深度学习编译器的基础设施包括:前端模型导入器、高层语言绑定机制、多层次中间表示及其扩展机制、张量运算与数据结构、优化通道与管理器,以及针对不同硬件平台的工具链集成。在这些组件中,优化能力与中间表示的设计尤为关键,它们分别决定了模型的执行性能与开发效率。
深度学习编译器的优化技术旨在更高效地将神经网络工作负载映射到硬件上。编译器通常会将完整的 DNN 模型划分为若干子图,并在图层级应用多种优化技术,如布局优化、算子融合和常量折叠。随后,这些子图的 IR 会被转化为更低抽象层级的表示,以便执行循环层级和硬件相关的优化,如循环重排、循环分块与内存优化等。
IR 的演进反映了深度学习编译器从碎片化向统一生态系统的发展趋势。在早期,每个编译器通常定义其专属的中间表示及相应的前端、优化器与后端支持模块。例如,Tensor Comprehensions 使用 Halide IR 和多面体 IR 来生成 CUDA 内核;Glow 从深度学习框架接收数据流图,并在两个层次的 IR 上进行优化:高层 IR 面向数据流优化和线性代数表示,低层 IR 则面向指令级硬件优化;nGraph 定义了自身的 IR,并进一步降低到 LLVM IR,其核心功能现已并入 OpenVINO;XLA 将 TensorFlow 的图表示转换为 XLA 图 IR,并最终降低为 LLVM IR。上述编译器所使用的 IR 不具备可复用性,因此其优化流程往往需要重复开发。为了提升开发效率,深度学习编译器正朝着统一生态的方向发展。目前,主要的两个深度学习编译器生态系统为 Tensor Virtual Machine(TVM)与 MLIR。下文将详细介绍这两个系统。
TVM 与 MLIR 编译生态系统
TVM 是当前最广泛应用的深度学习编译器之一,提供了一个从多种前端框架定义的神经网络到多种硬件后端的端到端编译方案。更重要的是,其张量表示与优化基础设施构建了一个可复用的编译生态系统。TVM 能够将来自不同深度学习框架的 DNN 模型统一转换为一种中间表示(IR),从而规避了前端与后端组合导致的组合爆炸问题。此外,TVM 继承并发展了 Halide 的思想,实现了算法与调度的解耦,并通过强大的自动调优与自动调度机制,提供高性能的编译方案。在 TVM 的生态系统中,自动内核生成机制结合多面体转换以优化张量表达式(TE),并支持与神经网络处理器平台兼容的自动调优。HeteroCL 在 TVM 基础上扩展,面向 FPGA 构建了一个基于 Python 的领域特定语言及其编译流程组成的编程基础设施。
注:但是仅仅间隔一两年时间,TVM 已经逐步过时。
MLIR 是一个多层次中间表示基础设施,用于构建各类编译器。其最初源自深度学习领域,随后发展为可服务于各类领域特定编译器的通用基础设施。MLIR 能够形成生态系统的关键在于其扩展机制与对 LLVM 的集成。MLIR 提供了一种称为“方言”的核心抽象,并具备强大的扩展能力。用户可以便捷地添加新的方言,定义自定义操作、类型与属性。所有自定义扩展都与核心方言兼容,不同方言之间亦可组合使用,增强了可复用性。此外,MLIR 作为 LLVM 项目的一部分,其抽象层级高于 LLVM IR,因此可以复用 LLVM 的强大后端能力,实现良好的可重定向性。尽管 MLIR 本身并不提供端到端的深度学习模型编译流程,但已有大量基于 MLIR 的编译系统构建起深度学习生态。例如,IR 执行环境(IREE)实现了完整的编译与优化流程,被认为是 MLIR 最具创新性的应用之一。
MLIR-HLO、Torch-MLIR 与 ONNXMLIR 分别将 TensorFlow、PyTorch 与 ONNX 引入 MLIR 生态。此外,一些编程模型与领域特定语言也被集成至 MLIR 体系之中,如 OpenAI 的 Triton 使用 MLIR 进行 GPU 代码生成,xDSL 基于 MLIR 构建了 DSL 生态系统,Beaver 则在 Elixir 与 MLIR 之间架起桥梁。总的来说,TVM 是专为深度学习负载构建的端到端编译器,而 MLIR 是一个通用的、可复用且可扩展的编译基础设施。尽管二者在核心理念上存在差异,但所构建的生态系统具有可比性。TVM 的扩展性主要来源于其张量表示与优化机制,支持高效的自动化设计以获得优异性能,但在领域扩展性方面相对有限;MLIR 的扩展性则来源于其 IR 设计与对 LLVM 的集成,强大的 IR 扩展机制有利于构建更广泛的生态系统,但其具体实现通常需要具备足够的领域知识与经验,方能达成预期效果。下文将以 TVM 与 IREE 为例,对深度学习编译器的各个组件进行更为详细的比较分析,并在表格中总结比较结果。
编译器前端
深度学习编译器的前端负责将深度学习框架模型的计算图表示转换为中间表示(IR),该过程也被称为导入。前端转换器遍历计算图,将图中的节点映射为对应的 IR 操作,从而实现将不同框架的模型统一为一种 IR,缓解框架层级的碎片化问题。正如表格所示,TVM 支持的深度学习框架数量多于 IREE。TVM 与 MLIR 的生态设计本质差异决定了其前端策略的不同。TVM 是一个端到端的深度学习编译解决方案,其社区维护专属的编译器前端以支持将模型转换为 Relay IR。而 MLIR 是编译基础设施,其前端支持则由各深度学习框架自身提供。这些框架通过定义自身的 MLIR 方言,实现计算图到核心 IR 的直接转换或桥接。在这种设计下,IREE 只需利用这些已有的方言或接口,即可完成与深度学习框架的连接。
中间表示(IR)
中间表示(IR)是深度学习编译器中最关键的组件之一,起到了解耦深度学习框架与硬件平台的作用。IR 的设计也决定了不同编译生态系统的核心特征。在传统编译器中,IR 连接编程语言与后端目标,承载编译优化的核心逻辑。深度学习编译器同样依赖传统编译器的 IR,以复用其已有的后端重定向能力。其中,LLVM IR 是应用最广泛的传统 IR。然而,LLVM IR 仅具备单一层次的抽象与细粒度的操作表达能力,难以直接映射深度学习中高度抽象、粗粒度的运算语义。因此,深度学习编译器普遍引入更高层次的 IR,以拓展优化空间并弥合与低层次 IR 之间的鸿沟。尽管多层次 IR 并非新兴技术,但它已成为深度学习编译器的重要标志。
TVM 的 IR 设计包含两个层次:Relay IR 和 Tensor IR(TIR)。Relay IR 主要用于深度学习模型的映射与图级优化,TIR 则用于调度与调优。Relay IR 采用函数式风格,具备 let-binding 结构,并支持自动微分。在模型向低层表示下沉的过程中,TVM 提供了张量表达式(TE)机制以构建 TIR,TE 支持多种调度原语,用于指定如循环分块、向量化与并行化等优化策略。此外,TVM 还提供了张量算子模板库 TOPI(Tensor Operator Inventory),可减少使用 TE 进行手工优化的负担。在调度与调优完成后,生成的 TIR 将被进一步转换为 LLVM IR。
MLIR 是 IREE 所采用的 IR 基础设施,具备多层次结构。MLIR 引入了“方言”这一概念,用以表示不同的抽象层级,每个方言由操作、类型与属性构成。IREE 项目的 IR 包括 MLIR 核心方言、IREE 自定义方言以及第三方方言。作为一种基础设施,MLIR 构建了多项机制以简化 IR 的设计过程,例如操作定义规范(ODS)框架用于定义 IR 操作,表驱动声明式重写规则(DRR)用于编写优化 pass。此外,后续研究还提出了如 IRDL 等方法进一步简化开发流程。MLIR 还定义了一系列通用抽象的核心方言以提升可复用性,而 IREE 通过扩展机制引入如 flow、HAL(硬件抽象层)、VM(虚拟机)等自定义方言。为了连接主流深度学习框架,IREE 复用了第三方方言,例如 Torch-MLIR 的 Torch 方言与 TensorFlow 的 HLO 方言。编译器将模型级方言逐步向下转换为 LLVM 方言,并最终生成 LLVM IR。
TVM 与 MLIR 在 IR 设计理念上具有一定相似性,但在结构与体系上存在显著差异。尽管两者都用于表示深度学习模型的数据流,但 TVM 采用的 A-Normal Form(ANF)结构与 MLIR 所采用的静态单赋值(SSA)结构存在根本区别。基于 ANF 的设计能够自然表达函数式语义,并清晰限定计算作用域,从而消除语义歧义;而基于 SSA 的设计则更易于进行常量传播、死代码删除等优化。
从系统层面来看,MLIR 与 TVM 在定位上的差异进一步决定了其 IR 的特点。TVM 作为一个端到端的深度学习编译器,其 IR 设计高度集成,调度与调优机制为编译器用户提供了良好的易用性,但其结构的耦合性也提升了编译器开发者进行扩展的难度。相比之下,MLIR 作为一项编译基础设施,采用模块化的 IR 设计,并配备了丰富的定义与扩展工具,显著降低了编译器开发的工程复杂度。然而,用户在使用 MLIR 构建深度学习编译器时,需要具备足够的经验,以应对多样化的编译 pass 设计与调度问题。
转换与优化
深度学习编译器通过一系列转换与优化策略以提升模型的执行效率。在图级抽象层面,优化技术主要包括算子融合与数据布局转换。前者可减少中间数据的内存访问与通信开销,后者则能够生成更适合后端执行的数据格式。在进一步向低层表示下沉后,可应用滑动窗口基础上的窥孔优化及基于数据流分析的全局优化。此外,还可引入多种针对特定硬件加速架构的优化算法。
针对 CPU 的优化方法主要包括:针对 SIMD 或矢量扩展的矢量化、多核架构下的并行计算、以及面向内存层次结构的访问优化。虽然 GPU 不具备 CPU 所拥有的大容量缓存与高主频,但其高吞吐、并行结构在深度学习工作负载中具备显著优势。因此,面向 GPU 的加速策略通常包括多线程执行与内存访问优化。
为适应不同架构,自动调优技术可提升编译器优化的有效性。编译器将优化策略参数化,构成搜索空间,由目标硬件或代价模型反馈每一步搜索的评估结果,不断迭代直到满足设定的约束条件。除编译器优化外,程序员也可通过硬件编程模型手动优化代码,例如采用 intrinsic 或面向硬件的编程模型(如 CUDA、OpenCL、Vulkan)为 CPU 扩展或 GPU 编写高效算法。在这种情形下,编译器的作用是支持多层次抽象并实现对上述模型的映射。
在 IR 层面,TVM 与 IREE 均具备实现上述优化的能力,但在优化策略的实现方式上存在差异。TVM 将算法定义与调度过程解耦,增强了算法的可读性,并支持借助调度表示进行有效调优;IREE 则基于 MLIR 基础设施,结合自定义方言,以混合抽象的形式实现优化 pass。二者的优化策略均通过编译 pass 实现,每一 pass 都是基于 IR 的转换操作。相关的 pass 基础设施包含了定义、注册与执行等组件,二者机制类似,但因 IR 设计不同而存在实现差异。MLIR 引入声明式定义机制,使得 pass 能灵活适配扩展性更强的 IR;其多层次抽象结构与混合方言的使用策略对 pass 的排列顺序提出更高要求。部分跨方言的高级优化 pass 需精心设计顺序方能达到预期效果。
TVM 将 Relay IR 与 TIR 的抽象层级划分,有助于构建不同 pass 之间的依赖关系,并将不同层级的优化封装组织起来。此外,TVM 具备强大的自动调优能力。AutoTVM 通过定义搜索空间与搜索迭代机制,在每一轮中调整优化参数,并依据所选配置生成代码。为进一步提高调优效率,TVM 提出了更高级的自动调度方法 Ansor(AutoScheduler),无需手动定义搜索空间即可自动完成调优过程。
代码生成
传统编译器的代码生成过程是将 IR 转换为目标平台的汇编代码,关键步骤包括指令选择与寄存器分配,并在寄存器分配前后执行指令调度,以实现指令级并行度最大化,从而生成高质量代码。深度学习编译器在执行模型时,根据不同的执行方式生成对应代码,并将其交由处理器或执行器运行。
代码生成过程可分为机器码生成与执行引擎指令生成两类,分别对应领域加速器的两种构建路径:领域特定指令与领域专用引擎。前者是在通用指令基础上扩展用于特定硬件的指令,以加速特定工作负载,该方式需要编译器将指令封装为编程接口,并通过这些接口实现高性能算子。同时,编译器中的优化 pass 可实现对硬件的映射支持。从这个角度看,深度学习编译器可视作传统编译器的领域扩展,其基础设施可在代码生成过程中复用。而领域专用引擎则需编译器生成用于自定义驱动、执行器或虚拟机的图表示或字节码。
TVM 的代码生成结果被封装为统一的运行时对象,具体生成何种类型的代码由其执行方式决定。TVM 的图执行器与虚拟机分别要求编译器生成图表示与字节码。另一种方案是使用预编译器(Ahead-of-Time, AOT)生成可链接的共享库。此外,TVM 还提供“自带代码生成”(BYOC)机制,允许后端开发者注册自定义生成的代码,作为 Relay 编译器的后端。
IREE 默认使用虚拟机执行程序,因此高层 IR 会在逐层下沉后生成虚拟机字节码。IREE 的 HAL 方言提供了用于代码生成的一系列操作,如调度区域定义、应用二进制接口(ABI)、输入输出定义等。若需要静态部署,IREE 可基于 MLIR 表示生成 LLVM IR、C 代码或其他中间表示。以 GPU 为例,IREE 可通过 MLIR 和 LLVM IR 生成 NVVM 代码,或将 IR 转换为 SPIR-V 方言后生成 SPIR-V 二进制文件。
运行时与执行模式
中间表示(IR)抽象了深度学习模型的结构,代码生成过程则将 IR 转换为可执行文件。为了在目标硬件平台上运行这些可执行文件,必须维护一个运行时环境,以便与操作系统及其他系统软件进行交互。为支持运行时,编译器需了解内存分配规范、可见性规则、过程调用约定、应用二进制接口(ABI)等。这些规范确保不同软件组件之间能够正确协同工作。
深度学习编译器还需适配异构架构及其对应的运行时。异构架构的运行时承担主程序与计算核(kernel)之间的桥接角色,其职责包括构建计算核、设置核参数、加载核程序及启动核执行。类似于传统程序的执行方式,深度学习模型的执行模式主要包括静态编译(AOT)、解释执行与即时编译(JIT)。
静态编译将深度学习模型编译为机器码,并与其他程序链接为可直接在目标平台运行的可执行文件。解释执行则不会将模型转化为机器码,而是转换为抽象语法树(AST)、图表示或字节码等中间状态,并通过解释器或虚拟机进行运行。即时编译结合了静态编译与解释执行的优点,在运行过程中将 IR 编译为机器码,能够基于运行时信息进一步优化,兼顾性能与灵活性。
TVM 的运行时环境支持将代码生成阶段产生的运行时对象导出、加载与执行。其运行时采用模块化设计,支持开发者在运行时动态添加新的数据结构。TVM 将执行模式封装为运行时对象的接口,主要包括以下几种:
- (a)Relay 解释器通过遍历抽象语法树执行程序,效率较低,不适合部署;
- (b)Relay 执行器运行图表示,能够有效利用静态信息优化内存分配;
- (c)Relay 静态编译将模型构建为共享库以实现本地执行,具备较高性能,但可扩展性与可修改性较差;
- (d)Relay 虚拟机提供一个动态执行环境,用于运行字节码,支持动态形状推理,兼顾性能与灵活性;
- (e)远程过程调用机制支持模型部署到远程设备上运行。
IREE 的运行时环境主要由硬件抽象层(HAL)与虚拟机(VM)组成。HAL 为不同执行目标提供一致的接口,支持可执行文件定义、设备内存分配、命令缓冲配置、设备通信与同步。VM 则用于执行代码生成阶段产生的字节码。程序被加载至命令缓冲区,并通过 HAL 接口分发至硬件平台执行。
IREE 的执行模型引入了 timeline 与 fence 机制,用于支持灵活的调度与调用策略,如顺序执行、流水线执行以及流序分配等。除虚拟机执行模式外,IREE 在集成不同深度学习框架时也支持静态编译与即时编译模式,从而满足多样化的部署需求。
深度学习硬件设计中的编译技术
除了深度学习编译器本身,编译技术的创新同样对硬件设计产生积极影响。随着深度学习硬件的迅速发展,硬件设计过程中暴露出语言支持和抽象层次不足等问题。编译技术可提供更高层次的抽象,并为语言与工具的碎片化问题提供统一的支持。本节重点探讨用于深度学习硬件设计的编译技术。
面向不同硬件架构的编译方法
根据神经网络执行策略的分类,深度学习硬件架构可分为流式架构与计算引擎架构。这两类架构采用不同的编译方法以完成神经网络工作负载向硬件的映射。
流式架构以数据驱动为特点,编译器可分析神经网络与硬件资源,将计算图映射为具体的硬件描述。在此过程中,编译器可获取充足的信息以执行相应的优化。在硬件设计实践中,常通过高层次综合(HLS)工具实现流式架构。
计算引擎架构则以指令驱动为核心。其硬件设计通常使用硬件描述语言实现架构模板,而编译器负责将高级语言映射为低级硬件表示,如 Verilog。一些设计方案使用 HLS 构建接口与控制逻辑,另一些则使用硬件语言设计计算单元。硬件架构的模板可以根据神经网络模型与硬件资源进行参数化实例化,从而获得定制化实现。
高层次综合中的编译技术
高层次综合(HLS)将硬件设计的抽象层级提升至 C/C++/OpenCL 级别。编译器借助启发式规则将高级语言表示映射为硬件描述语言(HDL)。程序员需通过指令(如 pragma)引导编译器完成转换,这一过程通常依赖约束求解器以满足时序、资源等设计要求。相比底层 HDL,HLS 可加快设计周期并提升开发效率。
HLS 编译工具采用多种优化策略将高层表示映射为高效的寄存器传输级(RTL)代码。例如,Vivado HLS 与 Vitis HLS 支持将 C 程序编译并优化为 RTL 代码。其优化效果依赖于程序中嵌入的 pragma 指令,涉及数据流设计、流水线调度、循环展开与循环分块等策略。Xilinx 推出的 SDSoC 工具进一步提升了抽象层次,能够将 C/C++ 程序转换为完整的软件—硬件系统,仅对选定部分进行硬件加速。该工具对所选区域进行分析,识别计算密集部分,借助 Vivado HLS 工具优化硬件代码,协调 CPU 与加速器之间的数据传输,并重新组织处理系统(PS)与可编程逻辑(PL)之间的数据访问路径。
Intel 的 OpenCL SDK 提供了一整套编译工具,用于将 OpenCL 编程模型转化为面向 FPGA 的硬件设计。编译过程中可执行多种优化操作,例如消除冗余硬件资源需求、展开与向量化循环、以及为每个计算核生成多个计算单元。
上述 HLS 工具均要求用户手动编写原语以指导硬件代码生成或指定加速区域。为了实现高效设计,用户需具备扎实的硬件领域知识,并熟悉特定的编程模型与指令语义。此外,这些编译工具通常以抽象语法树(AST)或中间表示(IR)作为分析与优化的基础表示。其抽象层级为单层,主要面向软件逻辑,不利于表达高层次的硬件信息,从而在编译过程中丧失大量潜在的优化机会。
为应对上述问题,ScaleHLS 在传统 HLS 工具基础上引入多层次抽象机制,在多个层级上执行优化。ScaleHLS 致力于提供一个可扩展、可定制的 HLS 框架。在 IR 设计方面,ScaleHLS 以 MLIR 为编译基础设施,定义了包括图级、循环级与指令级在内的多层次中间表示,并可在各个层级上进行分析与优化。例如,图级分析数据流节点的依赖关系,循环级执行重排序与分块,指令级则完成流水线调度与数组划分。此外,ScaleHLS 支持设计空间探索(DSE)与针对 Vivado HLS 工具的代码生成。综合而言,ScaleHLS 相较传统 HLS 编译工具可实现显著的性能提升。
面向高级硬件语言的编译技术
高层次综合(HLS)显著提升了硬件设计的抽象层次,然而,传统 HLS 语言与工具在映射硬件过程中多采用黑盒策略,导致生成结果难以预测。为解决此类问题,近年来出现了一系列更高级别的 HLS 语言与工具,旨在明确硬件实现路径,并生成具备可预测性的硬件架构。除了 HLS 语言外,高级硬件描述语言(HDL)也可更有效地描述结构清晰、可预测的处理器与加速器架构。本节重点探讨支持上述高级硬件语言的编译技术。
Dahlia 是一种通用型硬件设计语言,其抽象层次高于传统 HLS 语言,支持将程序可预测地编译为硬件加速器。Dahlia 编译器可将语言源代码转换为 HLS C++,并与现有商业 HLS 工具链兼容。在编译过程中,编译器可执行类型检查以避免内存类型冲突,自动并行化与重排序无依赖代码,以及对展开循环的副本进行并行执行。未来,该编译器预计可直接生成 RTL 级代码,从而彻底摆脱传统 HLS 工具的不可预测性。此外,语言语法可进一步简化,以降低编译器的实现复杂度。
Bluespec 是一种高级 HDL,其语言设计借鉴 Haskell 的抽象机制,适用于描述高级且可参数化的硬件架构。该语言在保持传统硬件语义基础上,引入软件化策略支持静态验证与精化。Bluespec 编译器 bsc 可将高级 HDL 编译为可综合的 Verilog 代码,供后续 RTL 工具使用。其显著特征是生成具备时钟同步特性的 Verilog 控制逻辑,同时保留原子事务行为语义,称为规则调度机制。此外,bsc 可通过 SAT 求解器优化控制逻辑并分析规则条件之间的关系。编译模式方面,bsc 支持模块化包的单独编译,从而实现增量式构建。自 2000 年起,Bluespec 的商业编译器与库已广泛应用,2020 年起开放源码版本亦对外发布。
Chisel 是一种通用型高级硬件编程语言,内嵌于 Scala 语言中。其既可高效构建底层硬件模块,也可扩展用于高级硬件设计模式。Chisel 所生成的 RTL 级代码兼容主流 FPGA 与 ASIC 的设计流程。作为高级语言,Chisel 支持参数化硬件生成器的设计,从根本上解决了传统 HDL 在结构复用与灵活性方面的局限。Chisel 采用 FIRRTL(Flexible Intermediate Representation for RTL)作为中间表示与编译框架,具备直接语义、简洁节点与友好接口等特性,有利于执行优化与转换。优化主要基于抽象语法树(AST)执行,包括常量传播、公共子表达式消除与死代码删除等。在 Chisel 与 FIRRTL 基础上,Gemmini 提出了一套完整的深度神经网络加速器生成系统。该系统所生成加速器在性能方面优于同类方法,同时基于 RocketChip 的处理器内核,支持系统与加速器的协同设计,表明通用高级硬件语言与可复用编译框架结合可有效实现高性能硬件设计,并降低开发与验证成本。
Spatial 是一款面向应用加速器设计的高级领域特定语言(DSL),其模板化设计在编程效率与设计性能之间取得良好平衡。Spatial 的中间表示为层次化数据流图,其中图节点包括控制节点、存储节点与基础计算节点。编译器将 Spatial 程序翻译为可综合的 Chisel 表达形式,支持 FPGA 与 Plasticine CGRA 等硬件平台。其编译流程包括流水线调度、自动内存分组与自动化设计调优。Spatial 借助参数化编译 pass 执行设计空间探索(DSE),而 RTL 模板以 Chisel 实现,便于在代码生成阶段实例化硬件模块。
硬件编译基础设施
硬件编译基础设施是硬件语言编译器的核心支撑,其作用在于统一抽象层次并提升硬件设计编译器的复用性。典型的基础设施由统一的中间表示(IR)、可扩展机制以及可复用的优化模块组成。本节将介绍近年来提出的代表性硬件编译基础设施——Calyx 与 CIRCT,重点分析其设计理念与实际应用。
Calyx 是一种面向硬件设计的中间语言(IL),用于支撑高层程序向硬件实现的编译过程。Calyx 的 IL 语言融合了命令式与结构化子语言,用以描述控制流、硬件模块及其互联方式。此外,Calyx 还提供了面向硬件设计的编译基础设施,并支持已有的领域特定语言(DSL)接入。Calyx 的编译流程涵盖代码分析与优化,最终生成可综合的 RTL 代码。在优化方面,Calyx 提供了资源共享、寄存器复用以及周期延迟推断等功能。作为基础设施,Calyx 既支持硬件设计人员使用高级且易于理解的语言进行开发,也便于语言设计者构建统一的中间表示与可复用的编译管线。基于 Calyx 的硬件设计不仅实现成本低于传统 HLS 方法,且在性能方面具备一定优势。
CIRCT 是一款开源的模块化硬件编译基础设施,其核心目标是在中间表示层统一各类硬件设计工具的抽象表达。CIRCT 借鉴了 MLIR 与 LLVM 的设计思想与基础设施,致力于解决硬件设计过程中抽象层次与工具之间的碎片化问题。CIRCT 社区认为,异构系统设计的核心在于抽象表示与其操作方式的表达能力。借助 MLIR 的基础结构,CIRCT 可集成现有的工具流程、定义新型抽象、重用优化机制并生成硬件代码。CIRCT 支持多种中间表示,包括 MLIR、FIRRTL 与 Calyx,并在编译流程中将它们转换为核心的硬件方言,最终生成 RTL 代码。CIRCT 正在快速发展,有望推动开放式硬件设计工具链的持续演进。
当前问题与未来研究方向
前文系统分析了深度学习软硬协同设计系统及其相关编译技术,揭示出当前由碎片化向生态化演进的趋势。本节将归纳现阶段存在的问题,并提出未来的研究方向。
协同设计框架的问题与方向
问题:缺乏统一的协同设计框架
随着大规模神经网络的发展,人工智能训练的计算需求呈指数级增长,远超传统摩尔定律的演进速度。为满足这种性能需求,深入的软硬件协同设计成为必然选择。协同设计的关键在于实现软件与硬件设计人员之间的高效沟通与协作。然而,当前尚无统一的协同设计框架可供使用,导致软硬件协同设计的研究和工具使用门槛较高。软件与硬件设计之间存在理念和方法上的鸿沟,在当前实践中,算法、编程语言、编译器与硬件基础设施通常是分别设计的,难以形成整体优化效应。
方向:构建统一的协同抽象机制
统一的软硬件中间表示(IR)是实现领域专用架构与可编程性支持的关键。软件编程模型正朝向高抽象与领域特定化演进,而硬件架构则愈发异构化、并行化与定制化。在协同设计中,统一的软硬件抽象可以扩大系统设计空间,促进软硬件协同划分,并提升开发者之间的理解与协作能力。目前,MLIR 被用作软硬件的统一 IR,前端可通过其将高级抽象映射至硬件指令,后端则可支持高层综合或加速器设计。尽管 MLIR 与 CIRCT 仍处于实验性阶段,但基于统一 IR 构建的协同设计框架有望形成软硬件一体化生态,解决设计过程中的碎片化问题。
多层次 IR 编译基础设施的问题与方向
问题:IR 到硬件的映射效率较低
多层次 IR 是深度学习编译技术不可或缺的组成部分。不同抽象层的引入提升了软件与硬件的复用性,扩展了优化空间。然而,多层次设计会带来编译效率下降的问题。抽象层数的增加导致编译流程变得更加复杂,需要开发者具备充分的经验来合理安排优化 pass 与 pipeline,影响开发效率及最终执行性能。
方向:多层次编译效率优化
提升编译效率需从开发效率与执行效率两方面着手。未来研究可聚焦于自动化机制,例如自动分析源程序并智能安排 pass pipeline,以提升开发效率;并通过自动并行化优化 pass 自身的执行效率,或引入 auto-tuning 机制以适配目标硬件。在此基础上,如何在多层次抽象带来的庞大搜索空间中实现设计空间压缩与搜索加速,也将成为研究重点。
面向特定领域编译技术的问题与方向
问题:特定领域编译器实现成本高昂
深度学习编译器作为特定领域编译的代表,揭示出当前 DSL 与架构研究中编译器开发工作量巨大的问题。编程语言方面,现有 DSL 多为嵌入式设计或独立语言,需重写前端及绑定接口;硬件方面,特别是指令驱动架构的实现,需要投入大量工程工作来完成从抽象到指令的映射。当前缺乏前后端的标准化支持,导致重复开发,缺乏复用性。
方向:建立特定领域编译器扩展机制
针对多样化的前端语言与后端指令集问题,未来应构建标准化接口并支持领域特定的扩展机制。在前端语言方面,可基于 Python 的主导地位或设计独立语言构建统一的扩展机制,从而降低开发负担。在后端方面,RISC-V 架构凭借其模块化与可扩展特性,非常适合作为特定领域硬件的目标架构。如果编译基础设施能原生支持 RISC-V,则后端的开发成本将大幅降低。因此,设计灵活可扩展的 RISC-V 编译后端框架是未来研究方向之一。
协同设计编译生态的问题与方向
问题:统一生态中的隐性碎片化
尽管 TVM 与 MLIR 生态不断发展并吸引众多项目接入,但统一生态中仍存在隐性碎片化现象。其表现为基础设施尚未稳定,版本不一致导致接口不兼容,难以实现跨项目复用。同时,在相同抽象层反复定义,甚至为特定框架或硬件引入重复的高层抽象,也破坏了生态系统应具备的通用性与复用性。
方向:完善协同设计编译生态基础设施
隐性碎片化源于基础设施的不完善。为缓解此问题,未来的基础设施应支持核心抽象的兼容性修改机制、优化 pass 的跨项目注册机制及稳定高效的 HAL。兼容性修改机制可避免重复定义抽象,但其挑战在于如何以非侵入方式对操作添加新的领域信息。跨项目 pass 注册机制可提升复用性,需稳定的上游版本支持一致接口。而 HAL 的设计需在抽象层级与性能之间取得平衡,在保持高抽象能力的同时实现针对硬件的最优性能。
下面为作者创新:
Buddy 编译器:面向协同设计的深度学习编译框架
在前文对深度学习协同设计系统中的编译技术进行回顾,并分析当前问题与未来研究方向的基础上,本文提出了一种面向特定领域的协同设计编译框架——Buddy 编译器。该框架旨在将软件与硬件共同下沉至中间表示(IR)层,进行联合优化,从而实现编译器与体系结构的协同设计。在技术路径上,Buddy 编译器采用 MLIR 与 RISC-V 构建模块化、可扩展的软硬件协同设计生态系统,覆盖从领域特定语言(DSL)到领域特定架构(DSA)的全流程。
如图所示,该框架由五个核心模块构成:编译器框架、基准测试框架、DSA 平台、协同设计模块与编译即服务平台。
- 编译器框架(buddy-mlir):帮助开发者便捷地设计并实现面向特定领域的编译器。
- 基准测试框架(buddy-benchmark):为不同应用案例的性能评估提供支持。
- DSA 平台(buddy-dsa):提供加速器模板,并在 IR 层编译高级硬件描述。
- 协同设计模块(buddy-codesign):支持软件与硬件在 IR 层的联合自动调优与设计空间探索(DSE)。
- 编译即服务平台(buddy-caas):作为生态系统入口,支持在线使用基础设施。
目前,buddy-mlir 与 buddy-benchmark 已作为开源项目发布,可分别支持端到端编译与性能评估功能。同时,buddy-caas 已上线部署,支持 MLIR pass pipeline 的配置及 RISC-V 后端集成。其余两个模块 buddy-dsa 与 buddy-codesign 正在开发中,未来也将开源。
Buddy 编译器概览
作为一个编译框架,Buddy 编译器致力于基于 MLIR 与 RISC-V 构建一个可扩展且灵活的软硬件协同设计生态系统。其设计理念采用模块化实现、解耦式基础设施与用户友好的工具链,以解决当前协同设计软硬件技术栈中的碎片化与依赖性问题。以下章节将具体介绍 Buddy 编译器的各个模块。
编译器模块
Buddy 编译器的编译器模块(buddy-mlir)构建于 MLIR 之上,专注于为从 DSL 到 DSA 的编译流程提供支持。该模块面向编程语言、编译器与领域特定架构后端的研究者与工程师,提供灵活可扩展的编译基础设施。
在 DSL 支持方面,Buddy 编译器采用了成熟的语言绑定方法,尤其是 Python 绑定。框架使用 MLIR 的 Python 接口与诸如 PyTorch 2.0 等深度学习框架对接。此外,前端还支持独立 DSL,通过基于 Antlr 的 DSL 到 MLIR 映射机制,显著降低了 DSL 设计者的编译器开发成本。中间端则引入了自定义 MLIR 方言以支持面向特定应用或硬件的优化需求。我们结合不同层级的方言将优化算法实现为 pass,并设计了 Auto-Config 机制,根据目标硬件平台自动配置优化 pass,从而生成具备硬件感知能力的 IR。借助 MLIR 和 LLVM 的强大重定目标能力,后端可支持多种工具链。但对于面向特定领域的 ISA 扩展支持并不方便。尽管 LLVM 后端基础设施可复用于 RISC-V 指令集,但其需要进行大量源码修改,不利于上游同步与独立扩展。为此,buddy-mlir 实现了一种树外(out-of-tree)指令扩展机制,兼顾了扩展性与同步性。未来将引入更多基于当前端到端编译流程的自动化方法,以进一步提升开发效率。
基准测试模块
基准测试模块专注于提供多层次的性能评估能力。在深度学习方向,模块支持如下功能:
(a)模型级评估,如 ResNet 和 MobileNet;
(b)算子级评估,如卷积与矩阵乘(GEMM);
(c)预处理级评估,如图像与音频处理;
(d)编译优化级评估,如自动向量化。
每一层级的测试案例均可扩展,并支持引入新层级与新领域。当前评估依赖 Google Benchmark 提供基础执行时间指标。未来将加入更多性能指标与基于模拟器的评估功能以适应 DSA 的需求。
DSA 模块
DSA 模块致力于基于 RISC-V 的可编程加速器设计与实现,并提供软硬协同接口。在可编程性方面,RISC-V 生态因其模块化与可扩展性成为当前最佳选择。buddy-mlir 模块可支持面向自定义 RISC-V 指令集的编译。在协同设计方面,软硬件交汇点定位于 MLIR,因此选用基于 MLIR 的 CIRCT 作为硬件编译基础设施。框架内提供默认参数化的 DSA 模板,可选实现方式包括高层硬件语言 Chisel 或基于 Calyx 的 DSA 生成器。Chisel 与 Calyx 均可接入 CIRCT 编译路径,有助于统一协同设计模块的实现。DSA 模块可与 buddy-codesign 模块联动实现软硬协同设计,也可连接 buddy-mlir 模块支持编译与执行。未来该模块将在上述功能完成后实现开源。
协同设计模块
协同设计模块专注于软硬件的联合设计空间探索(DSE)。我们提出在配置编译 pass 与硬件设计参数时保持同步,并将协同设计模块解耦为独立基础设施。该模块的核心组件包括设计空间、搜索策略与代价模型。针对这些组件,已有若干成熟的研究可提供搜索策略与代价估算模型,关键在于选择适配的策略。我们的创新在于将软硬件搜索空间统一至 IR 层,该搜索空间涵盖硬件架构、编译优化与编译 pipeline。设计空间来源于编译器中参数化 pass 的组合及其在软硬件编译器中的排列组合。DSE 完成后,可依据搜索结果指导软硬件代码生成。由于软硬件配置组合增长迅速,该模块的关键挑战是通过剪枝降低搜索时间。未来,该模块将与 DSA 模块一并开源。
编译即服务模块
编译即服务(CAAS)模块是 Buddy 编译器生态系统的重要入口。在实际使用中,各类工具与依赖组件需协同运行以支持协同设计或端到端编译流程,其配置复杂度较高。因此,我们构建了一个在线平台集成整个工具链,帮助用户快速实现与验证设计思路,从而专注于科研本身而非环境搭建,尤其适用于基于 DSA 的模拟器使用场景。该平台提供了用户友好的交互界面与配置机制,极大地方便了 MLIR 开发者的调试与测试需求。此外,平台还整合了 RISC-V 工具链,可支持无需实体硬件的研究与工程实践。例如,平台已被用于 RISC-V 向量扩展的 MLIR 抽象设计与集成测试。我们正在开发更多通用功能,进一步降低用户的项目接入门槛。未来将集成更多 MLIR 相关项目,构建完整的在线协同设计生态系统。
Buddy 编译器的主要贡献
Buddy 编译器旨在解决前述“当前问题与未来方向”部分所提出的挑战。作为一个开源社区项目,Buddy 编译器致力于构建一个面向软硬件协同设计的编译框架,欢迎来自不同领域的研究者共同参与,推动生态系统的持续发展。该项目的核心贡献包括:
1. 提出一个面向协同设计的编译器框架。
我们认为,MLIR 是当前在软件与硬件之间实现统一抽象的最佳方案。MLIR 及其衍生项目 CIRCT 作为编译器基础设施本身已有显著成效,而 Buddy 编译器的框架设计正是为了将二者融合,实现真正意义上的软硬协同。我们认为,软硬件协同设计是 MLIR 生态中最具潜力的关键应用场景之一。因此,我们基于 MLIR 提出了该框架,以激发更多协同优化的可能性。
2. 提升多层编译的开发与执行效率。
为了提高多层编译器的开发效率以及生成代码的执行效率,我们构建了 buddy-caas 在线平台,并设计了 Auto-Config 自动配置机制。buddy-caas 能帮助开发者快速调试 MLIR 代码并配置 pass 流水线,同时配备集成后端环境以便演示。Auto-Config 机制的目标在于实现面向硬件的自动优化与代码生成,提升执行性能,避免因平台差异而重复开发。
3. 降低面向特定领域的编译器开发开销。
领域专用编译器的实现成本主要来自于前端语言解析与后端指令支持。为应对这一挑战,buddy-mlir 构建了基于 Antlr 的前端和面向 RISC-V 的后端,具备良好的定制性与可扩展性,从而实现了前端解析器、中间 IR 与后端生成器的基础设施复用。通过这种机制,领域编译器的实现被简化为一种声明式扩展,显著降低了工程负担。
4. 构建软硬件协同的编译生态系统。
生态系统的构建旨在将各项目的能力无缝整合,减少重复开发,并实现协同效应。当前,不同的 MLIR 项目因上游版本不同,常存在接口不兼容问题,难以构建完整的生态系统。为此,我们维护了一个可集成 IREE、Torch-MLIR 等 MLIR 项目的编译生态,并配套提供基准测试框架与在线服务平台,助力编译生态的发展。
总结
在神经网络的发展历史中,软件与硬件始终互相促进,协同设计在近十年愈发重要。面对深度学习应用与硬件爆发式增长所带来的系统碎片化问题,编译技术被寄予厚望,以连接多样化负载与异构硬件平台,并为优化提供更多空间。本文系统回顾了深度学习协同设计中的编译技术,发现其主要集中于深度学习编译器与硬件编译基础设施两个方面。我们认为,深度学习系统正在从碎片化走向生态化,但仍有诸多问题亟需解决。文中总结了相关挑战并提出了未来研究方向。
基于前述分析,我们提出了一个面向领域的协同设计编译器框架蓝图,并介绍了当前的工作进展。在计算架构与领域编译器技术发展的黄金时期,我们相信,基于编译技术的协同设计将成为未来深度学习系统发展的关键突破方向。
如需数据与材料支持,可联系通讯作者 Y.W.(邮箱:yanjun@iscas.ac.cn)获取。