在人工智能的浪潮中,深度学习模型日益复杂,其计算量也随之剧增。为了将这些模型高效地部署到各种硬件平台,并充分榨取硬件性能,一种专门的软件工具应运而生,这就是AI 编译器。它如同AI模型与底层硬件之间的一座桥梁,将抽象的模型描述转化为高度优化的机器指令。
AI 编译器究竟是什么?
AI 编译器,顾名思义,是专门为机器学习(尤其是深度学习)模型进行编译优化的软件系统。它与传统的编程语言编译器有本质区别。
传统编译器与AI编译器的分野
- 传统编译器: 接收人类可读的源代码(如C++, Java),通过词法分析、语法分析、语义分析、中间代码生成、优化、目标代码生成等阶段,最终生成特定CPU架构可执行的机器码。其优化主要围绕通用计算指令和内存访问模式。
- AI 编译器: 接收的是以计算图形式表示的AI模型(如TensorFlow、PyTorch、ONNX模型),它的核心任务是将这些高层级的模型操作(如卷积、矩阵乘法、激活函数)转换并优化为特定AI加速器、GPU或CPU能高效执行的低层级指令。其优化侧重于张量操作、并行计算、内存带宽利用和特定硬件指令集(如张量核心指令)的利用。
AI编译器的核心功能与组成
一个典型的AI编译器通常包含以下核心功能模块:
- 前端(Frontend): 负责解析不同AI框架(如TensorFlow、PyTorch、MXNet)的模型表示,将其转换为编译器内部统一的中间表示(IR, Intermediate Representation)。ONNX(Open Neural Network Exchange)就常被用作一种跨框架的IR。
- 中间优化(Middle-end / Graph Optimization): 这是AI编译器的“大脑”。它对中间表示进行一系列的高级优化,旨在提高模型执行效率、减少内存占用。
- 图级优化: 包括死代码消除、公共子表达式消除、操作符融合(Operator Fusion,例如将卷积、偏置添加、激活函数融合成一个独立的计算核)、常量折叠、批归一化折叠等。
- 内存优化: 静态内存分配、缓冲区复用、内存布局转换(如将NCHW转换为NHWC或NHWC8c等,以适应特定硬件的高效访问模式)。
- 后端(Backend / Code Generation): 针对特定的硬件平台(如NVIDIA GPU、Intel CPU、ARM CPU、FPGA、ASIC等)生成高度优化的低层级代码。
- 张量调度与指令选择: 将优化后的计算图映射到硬件的并行计算单元上,选择最优的硬件指令。
- 代码生成: 生成针对目标硬件的汇编代码、CUDA核函数、OpenCL代码或其他特定指令集代码。
- 运行时库集成: 提供与目标硬件运行时环境交互的接口,确保编译后的模型可以被加载和执行。
为什么我们需要AI编译器?
AI编译器的出现,是解决深度学习模型在实际部署中遇到的诸多痛点的必然选择。它带来了显著的性能提升和工程效率优化。
弥合框架与硬件之间的鸿沟
“AI编译器是连接模型开发与硬件部署的‘语言翻译器’,确保模型能在任何设备上高效运行。”
深度学习框架(如PyTorch、TensorFlow)提供了高级抽象,方便研究员和工程师构建模型。然而,这些框架在执行模型时,通常会调用通用的、预编译的底层库(如cuDNN、MKL),这些库并非为特定模型和特定硬件的极致优化而设计。不同的硬件(GPU、NPU、CPU、FPGA)拥有迥异的架构和指令集,直接从高级框架生成代码难以充分利用其特性。AI编译器正是填补了这一空白,它通过对模型进行深度分析和重构,生成高度定制化的代码,从而最大限度地发挥硬件潜力。
极致的性能与资源效率
- 推理加速: 在边缘设备或实时应用中,模型的推理速度至关重要。AI编译器通过一系列优化,可以显著降低模型推理延迟,提高吞吐量。这包括:
- 算子融合: 减少内核启动开销,提高数据局部性。
- 量化与精度缩减: 将模型从FP32(单精度浮点)转换为FP16(半精度浮点)甚至INT8(8位整数),大幅减少内存占用和计算量,同时降低功耗。
- 内存访问优化: 减少不必要的数据传输,提高缓存命中率。
- 并行化调度: 充分利用硬件的多核并行能力。
- 训练优化: 虽然AI编译器主要在推理阶段发挥作用,但其部分技术(如图优化、内存优化)也能应用于训练,提升训练效率或支持更大模型的训练。例如,通过内存优化,可以在相同硬件条件下训练更大的批次或模型。
- 降低功耗: 尤其对于边缘AI设备,如智能手机、物联网设备、自动驾驶系统,功耗是一个严格的约束。AI编译器通过减少计算量、优化内存访问和支持低功耗指令集,有效降低模型运行时的能耗。
简化部署与跨平台兼容性
没有AI编译器,开发者需要为每个目标硬件平台手动优化模型,这无疑是巨大的工作量。AI编译器提供了一个统一的编译流程,使得模型一旦完成训练,就可以通过编译器快速适配到不同的硬件上,极大地提高了开发和部署效率。
AI编译器主要应用于哪些场景?
AI编译器的应用场景极其广泛,从云端大型数据中心到资源受限的边缘设备,无处不在。
云端AI推理服务
大型云服务提供商(如AWS、Azure、Google Cloud)利用AI编译器来优化其推理服务,以支持海量的并发请求并降低运营成本。它们通常部署在配备高性能GPU、TPU或其他ASIC加速器的服务器上,AI编译器确保这些模型以最高效率运行,提供低延迟、高吞吐的API服务。
边缘AI设备
这是AI编译器发挥最大价值的领域之一。边缘设备通常受限于计算能力、内存、功耗和散热。AI编译器使得复杂的AI模型能够在智能手机、智能音箱、摄像头、自动驾驶汽车、机器人、无人机等设备上本地运行,实现实时感知、决策和响应,同时保护用户数据隐私。
- 智能手机: 人脸识别、语音助手、图像增强等功能。
- 物联网(IoT)设备: 智能家居、工业传感器数据分析。
- 汽车: 自动驾驶感知、路径规划、驾驶员监控系统。
- 安防监控: 实时视频分析、异常行为检测。
特定领域AI加速器
许多公司正在开发专门的AI芯片(ASIC),这些芯片为了最大化AI计算效率而设计。AI编译器是这些芯片生态系统的核心组成部分,它将高层AI模型直接编译为芯片原生指令,充分利用其独特的架构优势(如张量核心、专用矩阵乘法单元等)。
主流AI编译器项目与产品
- 开源项目:
- Apache TVM: 一个通用的、模块化的、硬件无关的深度学习编译器栈,支持多种前端框架和后端硬件,是当前最活跃的开源项目之一。
- MLIR (Multi-Level Intermediate Representation): Google主导的一个可扩展的编译器基础设施,旨在解决各种特定领域编译器和深度学习框架的需求。Torch-MLIR和TensorFlow-MLIR是其在AI领域的具体应用。
- ONNX Runtime: 一个跨平台的推理加速器,它集成了多种执行提供者,可以利用不同的AI编译器和硬件后端。
- BladeDISC: 腾讯开源的AI编译优化工具,支持PyTorch/TensorFlow模型,并可在GPU/CPU上进行部署。
- 商业与硬件厂商特定产品:
- NVIDIA TensorRT: NVIDIA开发的深度学习推理优化器和运行时,针对NVIDIA GPU进行深度优化,提供高性能推理。
- Intel OpenVINO: Intel为优化其CPU、iGPU、FPGA等硬件上的深度学习推理而开发的工具套件。
- Qualcomm SNPE (Snapdragon Neural Processing Engine): 高通为旗下Snapdragon处理器优化的神经网络处理引擎。
- Huawei MindSpore: 华为的全场景AI计算框架,其编译器组件昇腾MindSpore Compiler针对昇腾AI处理器进行深度优化。
- Google XLA (Accelerated Linear Algebra): TensorFlow框架的线性代数编译器,能够将TensorFlow图编译为针对CPU、GPU和TPU优化的机器代码。
一个AI编译器优化过程通常包含多少个阶段?
一个完整的AI编译器优化过程通常包含多个相互关联且依次进行的阶段,这些阶段可以被抽象为以下几个核心步骤,每个步骤内部又包含若干个具体的“优化遍(Pass)”:
-
模型前端解析与IR生成(Parsing & IR Generation)
阶段数: 1个主要阶段,但涉及多种解析器。
这是编译过程的起点。AI编译器首先需要理解原始的深度学习模型。这一阶段会解析来自不同框架(如PyTorch的TorchScript、TensorFlow的GraphDef/SavedModel、ONNX文件)的模型定义,并将其转换为编译器内部统一的、与硬件无关的中间表示(IR)。这个IR通常以计算图的形式存在,每个节点代表一个操作(算子),边代表数据流。
-
高层级图优化(High-level Graph Optimizations)
阶段数: 通常包含数个到十数个不同的优化遍。
在这一阶段,编译器对IR图进行平台无关的通用优化,以提高整体效率和简化后续处理。常见的优化包括:
- 算子融合(Operator Fusion): 将一系列连续、相关性强的操作(如卷积、Batch Normalization、ReLU激活函数)合并成一个更大的自定义操作或高效的计算核,减少内存读写和内核启动开销。
- 死代码消除(Dead Code Elimination): 移除对最终结果没有贡献的操作。
- 常量折叠(Constant Folding): 在编译时计算并替换图中的常量表达式,例如将常量矩阵乘法结果直接嵌入。
- 公共子表达式消除(Common Subexpression Elimination): 识别并移除重复计算。
- 批归一化折叠(Batch Normalization Folding): 将Batch Normalization操作融入到其前一个卷积或全连接层的权重和偏置中,从而在推理时消除其计算开销。
- 布局转换(Layout Transformation): 根据目标硬件的最佳实践,转换张量的数据布局(如从NCHW到NHWC,或特定的瓦片布局),以提高数据访问效率。
-
中层级优化与硬件无关的低层IR生成(Mid-level Optimization & Lowering to Hardware-Independent IR)
阶段数: 多个,通常是向更低层次IR的逐步转换和优化。
在此阶段,高级的图操作会进一步细化,可能引入更底层的张量操作,并为硬件特定的优化做准备。例如,一个高层级的“卷积”操作可能会被分解成矩阵乘法和数据重排等更基本的IR操作。一些内存分配和调度策略也可能在此阶段开始规划。
-
硬件特定优化与后端代码生成(Hardware-Specific Optimization & Backend Code Generation)
阶段数: 数个到数十个,高度依赖目标硬件。
这是AI编译器最复杂和最能体现其价值的阶段。编译器深入了解目标硬件的架构特性,生成高度优化的机器代码。这包括:
- 指令选择(Instruction Selection): 将IR操作映射到目标硬件可用的最佳机器指令集(如CUDA指令、AVX指令、Tensor Core指令)。
- 寄存器分配(Register Allocation): 有效地利用有限的CPU/GPU寄存器资源。
- 内存分配与缓存优化(Memory Allocation & Cache Optimization): 精确规划内存使用,最大化缓存命中率,减少外部存储访问。
- 循环优化(Loop Optimizations): 如循环展开、循环合并、向量化,以充分利用并行计算单元。
- 张量瓦片化/切片(Tiling/Blocking): 将大型张量计算任务分解成适合硬件缓存和并行处理的小块。
- 量化与精度调整(Quantization & Precision Tuning): 根据硬件能力和模型需求,将浮点权重和激活量化为低精度整数,并插入相应的量化/反量化操作。
- 代码生成: 生成最终的可执行代码(如CUDA内核函数、OpenCL代码、汇编代码或LLVM IR,后者再由LLVM后端进一步编译)。
-
运行时系统集成(Runtime System Integration)
阶段数: 1个主要阶段。
虽然不是严格意义上的编译阶段,但它是编译结果能够运行的关键。编译器生成的代码需要一个轻量级的运行时系统来加载模型、管理内存、调度执行。这一阶段确保编译后的模型可以无缝地集成到应用程序中并高效执行。
总结来说,一个AI编译器的优化过程是一个多阶段、迭代、层层深入的复杂流程,从高级语义逐步过渡到低层硬件指令,每一步都旨在提升模型的执行效率。
AI编译器能带来多少倍的性能提升?
AI编译器所能带来的性能提升幅度是一个高度依赖于多种因素的变量,没有一个固定值。但普遍而言,其带来的加速效果是显著的,通常可以达到数倍甚至数十倍。
影响性能提升的关键因素:
- 模型复杂度与规模: 模型越大、越复杂、操作类型越多样,AI编译器的优化空间通常也越大。简单的模型可能提升有限,而大型的Transformer、ResNet、EfficientNet等模型则能从融合、量化等优化中获益良多。
- 目标硬件平台:
- 通用CPU: 编译器可以通过AVX/AVX512指令集、多线程并行、缓存优化等手段提升性能,但提升倍数相对有限,可能在1.5倍到5倍。
- GPU: GPU具有高度并行计算能力。AI编译器(如TensorRT)能通过张量核心利用、算子融合、高效的内存带宽利用等,带来显著提升,通常在2倍到10倍甚至更高。对于某些未经优化的模型,提升甚至可以达到数十倍。
- 专用AI加速器(ASIC/NPU/TPU): 这些芯片为AI计算而生,其架构高度定制化。AI编译器能够将模型深度映射到其硬件原语上,实现极致的性能。提升倍数可能非常惊人,达到10倍到100倍以上,但这是在与通用硬件(如CPU)对比,而非与通用GPU对比。
- 边缘设备(低功耗CPU/DSP): 在资源受限的边缘设备上,编译器通过量化、剪枝和针对性的调度,可以在保持可接受精度的情况下,让原本无法运行的模型变得可行,性能提升的意义在于“能跑起来”或“满足实时性”,具体倍数因设备和模型而异。
- 原始模型框架与优化程度: 如果原始模型未经任何优化,直接由PyTorch或TensorFlow的默认执行路径运行,那么AI编译器的提升会非常显著。如果模型本身已经经过部分手动优化,那么编译器的额外提升可能相对较小。
- 量化策略: 采用低精度量化(FP16、INT8)是AI编译器实现大幅性能提升的重要手段。在保持模型精度的前提下,量化可以带来2倍到4倍的直接计算加速,并减少内存带宽需求。
- 编译器自身的优化能力: 不同的AI编译器项目,其内部的优化算法、支持的Pass、对特定硬件的理解程度不同,也会导致最终性能差异。
具体示例:
- 在使用NVIDIA TensorRT优化某些ResNet模型时,相对于未经优化的PyTorch/TensorFlow推理,可以轻松达到2倍-5倍的吞吐量提升,同时降低延迟。
- 在某些边缘AI芯片上,将FP32模型编译为INT8,并进行图优化后,可以实现数倍到十几倍的加速,同时显著降低功耗。
- TVM在将深度学习模型部署到特定CPU或小型嵌入式设备时,通过其AutoTVM/Ansor等自动优化技术,可以在某些情况下比MKL/OpenBLAS等通用库获得2倍到5倍的性能提升。
总而言之,AI编译器的目标是将模型性能推向极致,其带来的性能提升足以改变AI应用的部署模式和经济效益。因此,尽管具体数字不一,但其价值和必要性是不言而喻的。
AI编译器如何进行模型优化与图转换?
AI编译器进行模型优化和图转换的核心在于其多级中间表示(IR)和一系列精巧的优化遍(passes)。整个过程如同庖丁解牛,将复杂的模型逐步拆解、重构、精炼,最终适应硬件特性。
1. 高级IR的构建与图抽象
首先,AI编译器会从不同的深度学习框架(TensorFlow、PyTorch、ONNX等)加载模型。这些模型最初的表现形式各异,但AI编译器的第一步就是将其统一转换为一种高层次的、框架无关的计算图(Computational Graph)表示。这种图通常是静态的、显式的,节点代表操作(如卷积、矩阵乘法、ReLU),边代表数据流(张量)。
例如:
一个PyTorch模型被转换为TorchScript,然后进一步被IR前端解析,生成如TVM的Relay IR或MLIR的方言(Dialect)。在这个阶段,编译器关注的是模型的逻辑结构和数据依赖关系。
2. 图级优化(Graph-level Optimizations)
一旦模型被转换为统一的计算图IR,编译器便开始进行第一轮“粗粒度”的优化。这些优化是独立于具体硬件的,旨在简化图结构、消除冗余计算、提高数据局部性。
- 算子融合(Operator Fusion): 这是最重要且效果显著的优化之一。它识别计算图中可以合并在一起的连续操作序列,将其组合成一个单一的、更大粒度的“融合算子”。
实例: Conv2D -> BatchNorm -> ReLU。传统的执行方式是分别调用三个独立的计算核,每次操作都需要将中间结果写回内存再读出。通过融合,这三个操作可以在一个大的计算核中完成,数据直接在寄存器或缓存中流动,大大减少了内存带宽消耗和内核启动开销。
- 死代码消除(Dead Code Elimination): 识别并移除那些计算结果不会被模型最终输出或任何后续操作使用的节点和边。
- 常量折叠(Constant Folding): 如果图中存在一些操作,其所有输入都是常量,那么这个操作可以在编译时就计算出结果,用这个常量结果替换原来的操作节点,减少运行时计算。
- 公共子表达式消除(Common Subexpression Elimination): 识别图中重复出现的、具有相同输入和操作的子图,将其计算一次,结果复用于所有引用处。
- 批归一化折叠(Batch Normalization Folding): 在推理阶段,Batch Normalization层的均值、方差等参数是固定的。AI编译器可以将其计算逻辑直接融合到前一个卷积层的权重和偏置中,从而在运行时完全消除Batch Normalization层。
- 内存布局转换(Layout Transformation): 根据硬件的特性,将张量的数据排布方式从一种格式(如NHWC)转换为另一种(如NCHW或更特定的瓦片布局),以便硬件能更高效地访问数据。这本身不是优化,而是为后续的硬件优化做准备。
3. 低层IR转换与硬件无关的细粒度优化
随着优化深入,AI编译器会逐步将高层IR转换为更接近硬件指令的低层IR。这个过程称为降低(Lowering)。在这个阶段,模型的操作可能被分解为更基本的张量操作,并引入一些硬件无关的并行化或内存访问模式。
- 循环优化: 对即将生成的底层循环进行优化,如循环展开(Loop Unrolling)、循环合并(Loop Fusion)、向量化(Vectorization)等,以充分利用处理器的并行能力。
- 通用内存优化: 规划缓冲区的复用,减少总内存占用。例如,为激活值分配静态内存,并在不同层之间复用这些内存块。
4. 硬件特定优化与代码生成(Backend Code Generation)
这是AI编译器最为复杂和差异化最大的部分。针对不同的硬件平台(GPU、CPU、NPU等),编译器会应用特定的优化策略并生成相应的代码。
- 指令选择与调度: 将低层IR操作映射到目标硬件最优的指令集。例如,对于GPU,选择最合适的CUDA核心函数或Tensor Core指令;对于CPU,选择AVX-512、NEON等向量指令。同时,还会对指令执行顺序进行调度,以最大化硬件利用率。
- 张量瓦片化/切片(Tiling/Blocking): 将大的张量操作分解成小块(tile),这些小块可以更好地适应硬件的缓存和寄存器容量,从而减少主内存访问。
- 线程/并行块分配: 决定如何将计算任务分配给硬件上的并行计算单元(如GPU的线程块和线程)。
- 量化与精度降低(Quantization): 将模型的权重和激活值从高精度浮点(FP32)转换为低精度(FP16、INT8甚至更低)。这通常涉及量化校准(在小数据集上运行模型以确定量化范围)和插入量化/反量化节点。编译器在此阶段会插入必要的量化和反量化操作符,确保计算在低精度下进行,同时保持精度。
- 后端代码生成: 最终生成目标硬件可以直接执行的二进制代码或中间代码(如LLVM IR,然后由LLVM编译成最终机器码),如CUDA kernels for NVIDIA GPUs, OpenCL code for various accelerators, or highly optimized assembly for CPUs.
整个过程是一个迭代优化的链条,每个阶段都致力于在不同抽象层次上对模型进行“改造”,使其在目标硬件上运行得更快、更省资源。
开发者通常怎么使用AI编译器?
开发者使用AI编译器通常涉及以下几个步骤和考虑因素,其工作流程比传统编译器更为复杂,因为它横跨了模型开发、优化和部署的多个环节。
1. 选择合适的AI编译器
这是第一步,也是关键一步。开发者需要根据以下因素来选择:
- 支持的深度学习框架: 编译器是否支持我正在使用的框架(PyTorch, TensorFlow, Keras等)?
- 目标硬件平台: 我的模型最终部署在什么硬件上(NVIDIA GPU, Intel CPU, ARM CPU, 边缘AI芯片等)?编译器对该硬件的优化程度如何?
- 模型类型和复杂度: 编译器对我的模型类型(如CNN, Transformer, RNN)的优化效果如何?
- 社区支持与文档: 是否有活跃的社区和完善的文档,方便学习和解决问题?
- 易用性: 编译器的API是否直观易用?
例如,如果目标是NVIDIA GPU,TensorRT通常是首选;如果是跨平台或学术研究,TVM或MLIR可能更合适;如果目标是Intel硬件,OpenVINO会是很好的选择。
2. 准备模型
在将模型输入AI编译器之前,通常需要进行一些准备工作:
- 导出模型: 将训练好的模型从其原始框架格式导出为编译器支持的格式。常见的格式包括:
- ONNX: 许多AI编译器都支持ONNX作为通用的中间表示。
- TorchScript: PyTorch模型的内部表示,可以被某些编译器直接使用。
- SavedModel/GraphDef: TensorFlow模型的标准导出格式。
- 模型冻结/量化校准(可选): 如果是部署推理模型,通常需要将其转换为推理模式,并进行量化校准(如果计划进行低精度推理)。量化校准需要使用少量代表性数据运行模型,以确定激活值的动态范围。
3. 调用编译器API进行编译
开发者通过编程接口(API)调用AI编译器的功能。这通常涉及以下几个核心参数:
- 输入模型路径/对象: 指定要编译的模型文件或模型对象。
- 目标硬件(Target): 明确指定模型将运行在哪个硬件上(如`”cuda”`、`”llvm -mcpu=skylake”`、`”arm cpu”`等)。这是编译器后端选择和优化的关键依据。
- 输入形状(Input Shapes): 提供模型的输入张量形状信息,以便编译器进行静态内存分配和图优化。
- 优化级别/配置(Optimization Level/Config): 可以选择不同的优化策略,例如是否进行量化、量化精度、是否允许精度损失等。
示例(以Apache TVM为例,简化代码):
import tvm
from tvm.relay.frontend import from_onnx
import onnx
import numpy as np
# 1. 加载ONNX模型
onnx_model = onnx.load("my_model.onnx")
# 2. 将ONNX模型转换为TVM的Relay IR
input_shape = {"input_name": (1, 3, 224, 224)} # 根据模型输入调整
mod, params = from_onnx(onnx_model, input_shape)
# 3. 定义目标硬件
target = "cuda" # 编译到NVIDIA GPU
# target = "llvm -mcpu=skylake" # 编译到Intel CPU
# 4. 编译模型
with tvm.transform.PassContext(opt_level=3): # 设置优化级别
lib = tvm.relay.build(mod, target=target, params=params)
# 5. 导出编译后的模型(可选)
lib.export_library("my_model_compiled.so")
4. 部署与执行
编译成功后,AI编译器会生成一个可加载到目标设备上的运行时模块或库(如`.so`、`.dll`、`.dylib`文件)。
- 加载模型: 在目标设备上,使用编译器的运行时库加载编译后的模型。
- 执行推理: 将输入数据传递给加载的模型,执行推理并获取结果。
这个过程通常比原始框架的推理更快、更省资源。
5. 性能评估与调试
在使用AI编译器后,开发者需要对部署的模型进行性能评估,并可能需要调试。AI编译器通常提供:
- 性能分析工具: 报告每个操作的执行时间、内存使用情况等,帮助识别瓶颈。
- 图可视化工具: 可视化优化前后的计算图,帮助理解编译器进行的优化。
- 精度验证工具: 验证编译优化(尤其是量化)对模型精度的影响。
AI编译器怎么支持自定义算子和特定优化?
先进的AI编译器通常提供扩展机制,以支持开发者定义其特有的算子(Custom Operators)或集成领域特定的优化策略:
- 注册自定义算子: 开发者可以为编译器注册新的算子类型,并提供其在不同硬件后端上的实现。这通常涉及编写C++或CUDA代码来实现算子逻辑,并提供与编译器IR的映射关系。例如,在TVM中,可以通过Relay注册新算子,并编写其TE(Tensor Expression)实现或直接C++/CUDA实现。
- 插入自定义优化遍(Pass): 开发者可以编写自己的优化算法,并将其作为编译流程中的一个“遍”插入到现有优化链中。这允许开发者实现针对其特定模型或硬件的定制化优化,例如专有的内存分配策略、特殊的图变换规则等。
这种可扩展性是AI编译器强大生命力的体现,它使得编译器能够适应不断演进的模型架构和多样化的硬件平台。