本页面将介绍 ExecuTorch 随附的默认内核库:Portable Kernel Library(便携式内核库)和 Optimized Kernel Library(优化内核库)。建议对执行带有这些内核库的 ExecuTorch 程序感兴趣的人员,或想要实现自己的内核和内核库的人员阅读此文档。
ExecuTorch 内核库概述¶
ExecuTorch 程序编码了描述程序应执行的计算的指令。其中许多指令将对应于调用特定的 ATen 运算符,例如 aten.convolution
。然而,ExecuTorch 的核心设计原则之一是运算符的签名应与其实现分离。这意味着 ExecuTorch 运行时不附带任何 ATen 运算符的标准实现;用户必须确保链接包含其 ExecuTorch 程序所需运算符实现的内核库,并配置 运算符注册 将运算符签名映射到所需的实现。这使得在执行 ExecuTorch 程序时,可以轻松调整 aten.convolution
等运算符的实现;它允许用户选择完全满足其用例独特的性能、内存使用、电池使用等约束的运算符实现。
本质上,内核库就是遵循共同主题或设计原则的 ATen 运算符实现集合。请注意,由于 ExecuTorch 的选择性构建过程(在下一节中讨论),运算符实现是单独链接的。这意味着用户可以在其构建中轻松混合不同的内核库,而不会牺牲构建大小。
ExecuTorch 默认随附两个内核库:Portable Kernel Library(便携式内核库)和 Optimized Kernel Library(优化内核库),它们都提供 CPU 运算符实现。
Portable Kernel Library(便携式内核库)¶
Portable Kernel Library 在某种意义上是 ExecuTorch 使用的“参考”内核库。Portable Kernel Library 在开发时考虑了以下目标:
正确性
提供 ATen 运算符的直接实现,这些实现严格遵循 PyTorch 的 ATen 库中运算符的原始实现。
可读性/简洁性
提供清晰、可读的源代码,以便想要开发自定义运算符实现的人可以轻松理解运算符的预期行为。
可移植性
Portable Kernels 应与 ExecuTorch 运行时一样具有可移植性;运算符实现不应使用任何外部依赖项,或使用任何未经批准的 C++ 功能。
运算符覆盖范围
作为 ExecuTorch 的“参考”内核库,Portable Kernel Library 旨在实现高度的运算符覆盖。目标是 Portable Kernel Library 为列出的每个 Core ATen 运算符提供实现。但是,请注意 Portable Kernel Library 的运算符覆盖范围仍在进行中。
Portable Kernel Library 主要旨在提供易于访问的运算符实现,这些实现可以在大多数平台上“直接使用”,并保证提供正确的结果。性能不是 Portable Kernel Library 的目标。事实上,许多瓶颈运算符(如卷积和矩阵乘法)都以最直接的方式实现,以优先考虑简洁性和可读性。因此,如果仅使用 Portable Kernel Library,不应期望看到快速的推理时间。然而,除了特定的瓶颈运算符之外,大多数运算符足够简单,Portable Kernel Library 的直接实现仍应提供足够的性能。二进制大小也不是 Portable Kernel Library 的目标。
Optimized Kernel Library(优化内核库)¶
Optimized Kernel Library 是 ExecuTorch 随附的一个补充内核库,与 Portable Kernel Library 不同,它旨在以牺牲可移植性和可读性为代价,提供面向性能的运算符实现。Optimized Kernel Library 中的许多运算符实现都受到 PyTorch ATen 库中相应实现的启发或基于其实现,因此在许多情况下,可以期待相同的性能水平。
总的来说,Optimized Kernel Library 中的运算符通过以下两种方式之一进行优化:
使用 CPU 矢量内在函数
使用优化的数学库,例如
sleef
和OpenBLAS
尽管可移植性不是 Optimized Kernel Library 的设计目标,但实现并不是为特定 CPU 架构进行微调的。相反,Optimized Kernel Library 旨在提供可以在各种平台上应用的性能优越的实现,而不是使用特定于单一平台的优化。
另一个重要说明是,运算符覆盖范围也不是 Optimized Kernel Library 的目标。没有计划为每个 Core ATen 运算符添加优化的内核;相反,根据需要添加优化的内核,以提高特定模型的性能。因此,与 Portable Kernel Library 相比,Optimized Kernel Library 的运算符覆盖范围将更加有限。