趋近智
生成机器学习工作负载的高度专业化代码存在多种策略。其中一种有效且常有辅助作用的方法是运用硬件供应商提供的预优化例程。这些供应商专用库,比如 NVIDIA 的 cuDNN、AMD 的 MIOpen 和 Intel 的 oneDNN,封装了多年针对特定架构的调优成果,用于常见的、对性能要求高的机器学习基础操作。有效整合这些库是构建生产级机器学习编译器后端的一个显著方面。
硬件供应商对其芯片的微架构细节、内存子系统和指令集拥有无与伦比的认识,包括未公开特性或复杂交互。他们投入大量工程资源,手动调优卷积、矩阵乘法 (GEMM)、池化和归一化层等基础操作的核函数。这些库通常为单一操作提供多种算法,每种都针对不同输入维度、批次大小、数据类型或硬件代系进行了优化。
在通用机器学习编译器中,为每个受支持的硬件目标和每个可能的运算变体复现这种优化水平通常不切实际,甚至不可能。因此,对于这些定义明确、计算密集型的构建块,依赖供应商库具有多项优点:
然而,这种方法并非没有权衡。供应商库通常处理独立操作,可能错过通过跨操作合并实现的优化机会,而编译器自身的代码生成路径可以加以发挥。此外,依赖外部库会引入依赖关系和潜在的版本控制难题。
机器学习编译器采用各种策略与这些库进行整合:
最直接的机制是识别编译器IR中的特定操作节点(或小型子图),该节点直接对应供应商库提供的函数。例如,IR中的2D卷积节点可以映射到 cudnnConvolutionForward (用于 NVIDIA GPU) 或 miopenConvolutionForwardImmediate (用于 AMD GPU)。
编译器后端生成如下代码:
这要求编译器对库的API有详细了解,包括函数签名、数据布局期望(例如 NCHW 与 NHWC)和所需的描述符。
供应商库经常为同一逻辑操作提供多种底层算法(例如,基于GEMM、基于FFT、Winograd 等不同的卷积算法)。最佳选择在很大程度上取决于运行时参数,如输入/滤波器维度、步长、填充、数据类型以及特定的GPU架构。
cuDNN 等库提供查询可用算法和启发式方法以选择“最佳”算法的机制。例如,可以使用 cudnnGetConvolutionForwardAlgorithm 或 cudnnFindConvolutionForwardAlgorithm。编译器可以通过以下方式进行整合:
这些选择取决于编译上下文(AOT 与 JIT)、可接受的编译开销以及对确定性性能的需求。
一个先进的编译器后端不会将库整合视为一个非此即彼的命题。它保留了自身的代码生成能力(如前几节所述),同时具备调用供应商库的能力。决策逻辑可能如下所示:
编译器在自定义代码生成和供应商库调用之间做出选择的决策流程。
这使编译器能够运用库来处理标准、高性能的核函数,同时保持生成自定义代码的灵活性,以应对合并操作、不受支持的操作,或者其自身代码生成预计更优的情况。
为 GPU 等目标生成代码的机器学习编译器(为 NVIDIA 生成 PTX,或为 AMD 生成 GCN ISA)通常隐式或显式地依赖于供应商的下游工具链。
ptxas)编译成二进制 SASS (NVIDIA) 或 GCN 机器码 (AMD)。机器学习编译器框架可能会在最终构建步骤中调用这些工具。了解这些供应商工具链的能力和局限(例如,寄存器分配策略、指令调度),在生成像 PTX 这样的中间代码时也有益处,旨在生成供应商汇编器可以有效优化的输入。
实际中,高性能机器学习编译系统策略性地结合其自身复杂的代码生成技术与有目标地运用供应商优化过的库。这种混合方法使它们能够跨越广泛的模型和硬件平台,实现当前最好的性能,并在灵活性和合并需求与硬件供应商提供的原始核函数性能之间取得平衡。掌握这种整合对于弥合优化过的IR与可部署、高速机器学习推理之间的最后差距十分重要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造