趋近智
部署环境决定了您的机器学习模型何时以及如何从高级图转化为可执行机器码。这种转化时机是区分即时 (JIT) 编译和提前 (AOT) 编译的主要因素。理解这种区别对于针对特定目标优化模型非常重要,例如边缘设备上的低延迟推理或云集群上的高吞吐量训练。
AOT 和 JIT 的核心区别在于编译栈相对于应用运行时何时执行。
在提前 (AOT) 工作流中,编译过程离线进行。您通常在训练完成后,获取模型定义,并通过编译器栈处理,生成一个独立的二进制文件或库文件。此产物包含运行模型所需的优化机器码,但不包含编译器本身。在运行时,应用只需加载并执行此二进制文件。
在即时 (JIT) 工作流中,编译在程序运行时动态发生。框架(如 PyTorch 或 JAX)会监控执行。模型或函数首次被调用时,JIT 编译器会捕获图,对其优化,并即时生成机器码。该代码随后被缓存并执行。后续调用会跳过编译步骤,直接使用缓存的内核。
下图展现了这些工作流的结构区别。
AOT 和 JIT 工作流的比较。在 AOT 中,编译器在部署前运行一次。在 JIT 中,编译器是执行循环的一部分。
JIT 编译是模型研究和训练期间的主流做法,因为它保留了灵活性。当使用 torch.compile 或 XLA(加速线性代数)等工具时,框架会尝试融合运算符并优化执行,而不强迫用户完全放弃 Python。
JIT 的主要特点是预热开销。数据首次流经模型时,延迟会显著升高,因为系统正在忙于编译图。
考虑 JIT 编译函数的性能表现。系统需要分析输入张量形状,追踪操作,应用优化,并生成 GPU 内核。如果后续调用中输入形状发生变化(动态形状),JIT 编译器可能需要触发重新编译,以生成针对新维度优化的内核。
AOT 编译将机器学习模型视为 C++ 程序。目标是生成一个专用可执行文件,只依赖于最小运行时,而不是完整的训练框架。这种做法是部署到移动设备、嵌入式系统或像 FPGA 这样的专用加速器的标准方式。
在 AOT 环境中,您通常必须提供静态形状或为动态维度定义严格的边界。编译器进行大量分析,预先确定内存需求。这使其能够静态分配内存,避免执行期间动态内存管理的开销。
.so 或 .dll),无需在目标机器上安装 Python 或 PyTorch,即可从 C、C++、Java 或 Rust 调用。为清晰显示这些策略的作用,我们可以查看一系列推理请求的执行时间。下图比较了标准解释器(如标准 PyTorch eager 模式)、JIT 编译器和 AOT 编译模型。
10 次运行的延迟比较。注意 JIT 由于编译开销导致的初始峰值,随后性能超越解释器。AOT 从第一步起提供持续的低延迟。
AOT 和 JIT 之间的选择很少是关于哪个能产生更快的内核,现代编译器通常对两者使用相同的底层优化过程。具体的选择应根据部署限制来定。
何时使用 JIT:
何时使用 AOT:
在后续章节中,我们将主要查看这些过程生成的中间表示 (IR)。无论是即时触发还是提前触发,编译器最终都会将图转化为这种 IR 来实现其功能。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造