Relay BNNS 集成
作者:Egor Churaev
介绍
Apple BNNS 库由一组函数构成,这些函数用来构建推理(和训练)过程中的神经网络。macOS、iOS、tvOS 和 watchOS 支持 Apple BNNS。 BNNS 提供在这些平台上支持的所有 CPU 上执行的原语,并针对高性能和低能耗进行了优化。这种集成将尽可能多的算子从 Relay 迁移到 BNNS。
BNNS runtime 是平台 API 的一部分,且在现代所有 Apple 的操作系统上都可用。使用 BNNS 的应用程序不依赖额外的外部依赖。
BNNS 函数使用了 Apple 尚未公开的私有硬件功能,例如 AMX Apple CPU 扩展。
本教程演示了如何在 BNNS codegen 和 runtime 启用的情况下构建 TVM,还给出了用 BNNS runtime 编译和运行模型的示例代码,最后,还记录了支持的算子。
使用 BNNS 支持构建 TVM
打开 USE_BNNS 标志可将 TVM BNNS codegen 和 TVM BNNS runtime 打开。
- USE_BNNS=ON/OFF - 将子图迁移到 BNNS 原语,并把 TVM 库链接到 BNNS runtime 模块。 启用此标志会搜索当前 target SDK(所需最低版本为 macOS 11.0、iOS 14.0、tvOS 14.0 和 watchOS 7.0)上的默认加速框架。
config.cmake 文件的设置示例:
set(USE_BNNS ON)
Relay 计算图的 BNNS 分区
传递模块进行编译前,必须对迁移到 BNNS 执行的操作进行注释。由 partition_for_bnns 注释的所有操作都将被迁移到 BNNS 上执行,其余的操作将通过 LLVM 进行编译和生成代码。
重要提示:BNNS 仅支持具有恒定权重的原语,因此必须将常量映射到 Relay 表示中的相关张量抽象。若要冻结张量,并将它们作为常量进行操作,则需要用特殊标志「freeze_params=True」调用 ONNX 导入器或手动绑定执行器。所有 Relay 导入器默认都不会这样做。若将 params 字典作为参数传递,可用「partition_for_bnns」来实现。
from tvm.relay.op.contrib.bnns import partition_for_bnns
model = partition_for_bnns(model, params=params)