• 文档 >
  • ExecuTorch 内核库概述
快捷方式

本页介绍了可移植内核库 (Portable Kernel Library) 和优化内核库 (Optimized Kernel Library),它们是 ExecuTorch 默认附带的内核库。如果您有兴趣使用这些内核库执行 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)

可移植内核库在某种意义上是 ExecuTorch 使用的“参考”内核库。可移植内核库的开发考虑了以下目标:

  • 正确性

    • 提供与 PyTorch ATen 库中运算符原始实现严格一致的 ATen 运算符简单实现

  • 可读性 / 简洁性

    • 提供清晰、易读的源代码,以便那些希望开发运算符自定义实现的人可以轻松理解运算符的预期行为。

  • 可移植性

    • 可移植内核应与 ExecuTorch 运行时一样可移植;运算符实现不应使用任何外部依赖项,或使用 C++ 的任何未经批准的特性。

  • 运算符覆盖范围

    • 作为 ExecuTorch 的“参考”内核库,可移植内核库旨在实现高程度的运算符覆盖。其目标是让可移植内核库为列为核心 ATen 运算符的每个运算符提供实现。但是,请注意,可移植内核库的运算符覆盖范围仍在进行中。

可移植内核库主要旨在提供易于访问的运算符实现,这些实现可在大多数平台上“正常工作”,并保证提供正确输出。性能不是可移植内核库的目标。事实上,许多瓶颈运算符,如卷积和矩阵乘法,都以最简单的方式实现,以优先考虑简洁性和可读性。因此,如果仅使用可移植内核库,不应期望观察到快速的推理时间。然而,除了特定的瓶颈运算符外,大多数运算符都足够简单,可移植内核库的直接实现仍应提供足够的性能。二进制大小也不是可移植内核库的目标。

优化内核库 (Optimized Kernel Library)

优化内核库是 ExecuTorch 附带的一个补充内核库,与可移植内核库不同,它旨在以牺牲可移植性和可读性为代价,提供以性能为中心的运算符实现。优化内核库中的许多运算符实现受到 PyTorch ATen 库中相应实现的启发或基于其实现,因此在许多情况下,可以期待相同的性能水平。

一般来说,优化内核库中的运算符通过以下两种方式之一进行优化:

  1. 使用 CPU 向量内嵌函数

  2. 使用优化的数学库,例如 sleefOpenBLAS

尽管可移植性不是优化内核库的设计目标,但其实现并非旨在针对特定 CPU 架构进行微调。相反,优化内核库力求提供可在各种平台上应用的性能优异的实现,而不是使用特定于单个平台的优化。

另一个重要注意事项是,运算符覆盖范围也不是优化内核库的目标。目前没有计划为每个核心 ATen 运算符添加优化内核;相反,会根据需要添加优化内核以提高特定模型的性能。因此,与可移植内核库相比,优化内核库中的运算符覆盖范围将更为有限。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深度教程

查看教程

资源

查找开发资源并获得问题解答

查看资源