趋近智
即时(JIT)编译从根本上改变了优化和代码生成 何时 发生,将这些阶段从离线的预编译(AOT)过程转移到实际的运行时执行。这种时间上的变化对JIT编译器中使用的中间表示(IR)提出了独特且严格的要求。与AOT场景不同,AOT场景下编译时间不那么要紧,JIT系统中的IR设计不仅要重视表达能力,还要重视其构建、操作和降级的速度,因为这些直接影响用户感受到的应用程序延迟。
机器学习 (machine learning)JIT编译器的效率在很大程度上取决于其IR的能力。有几个特性非常重要:
JIT IR处理的一个核心难题是表示最初未知或可变的信息。张量形状是典型的例子。AOT编译器可能要求所有张量维度都是静态常量。然而,JIT编译器经常遇到某些维度取决于运行时输入的张量。
IR可以使用以下机制来处理:
tensor<Nx1024xf32>)。C = matmul(A, B),其中 A 的形状为 ,B 的形状为 ,其IR表示将编码 C 的形状为 ,无论 、 或 是具体值还是符号。这种表示和操作部分指定信息的能力,是实现运行时专用化的基本条件,JIT会生成针对特定执行轨迹中遇到的 实际 张量形状优化的代码。
为了平衡高级语义与低级优化需求,JIT IR通常采用分层或多方言的方法。JIT中的典型流程可能如下所示:
JIT编译器中IR降级阶段的视图。编译从捕获的框架操作开始,通过逐步降低抽象的IR实现不同的优化,最终实现目标代码生成。形状专用化通常发生在从高级IR到中级IR的转换期间。
这种分层方法允许在最合适的抽象级别应用优化:例如,在高级IR上进行图融合,在中级IR上进行循环平铺,在低级IR上进行指令调度。JIT编译器协调这些层之间的转换(降级)。
捕获用户模型的方法影响JIT IR的初始形式:
tf.function装饰器)定义模型时,JIT会直接解析此代码。生成的IR通常更接近抽象语法树(AST),或包含显式的控制流结构(例如MLIR术语中的scf.if或scf.for)。与追踪相比,这为编译器提供了更明确的程序结构进行分析。在这两种情况下,初始IR都捕获了程序结构,随后利用运行时可用的动态上下文 (context)进行细化和优化。
尽管JIT IR与AOT编译器IR共享一些基本思想(如SSA形式、操作语义),但它们在不同的限制下运行。AOT编译器可以承担昂贵的分析和转换,因为编译时间是在离线进行的。它们通常依赖于关于形状和类型的详细静态信息。
相反,JIT IR必须:
TensorFlow的XLA使用HLO(高级优化器IR),它是基于图的,适用于积极的融合,而PyTorch的TorchScript使用一种IR,在降级之前最初保留更多Python风格的语义。两者都旨在平衡表示能力与JIT编译的性能要求,体现了此处讨论的原则。这些系统将在第7.7和7.8节中进行更详细的考察。
总而言之,中间表示是任何机器学习 (machine learning)JIT编译系统的根本。它的设计必须权衡忠实地表示高级的、可能动态的程序语义与实现高效的、运行时敏感的优化和代码生成。处理动态信息、支持多层抽象以及促进快速操作的能力,是有效JIT IR的决定性特点。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•