Relay BNNS 集成

本文介绍了如何在Apple的BNNS库支持下在TVM中构建和部署神经网络模型,包括如何打开USE_BNNS标志、迁移Relay计算图到BNNS原语、调整输入数据布局以及使用BNNSruntime进行模型编译和运行。主要关注了Mobilenetv2示例和BNNS支持的算子列表。

更多 TVM 中文文档可访问 →https://tvm.hyper.ai/docs

介绍

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)

迁移到 BNNS 执行操作的输入数据布局

BNNS 内核仅支持平面格式的输入数据,分区器需要 NCHW 输入布局(用于 conv2d 输入)。

要对混合输入布局的模型进行 BNNS 集成,应在模块传递给 partition_for_bnns 之前对其进行转换。布局转换只发生在显式枚举类型的操作中。根据拓扑结构,可能会围绕 conv2d 将常规数据重新排序为交织布局和平面布局。这样做会使得性能损失,并影响执行时间。建议分析整个拓扑结构,并扩展以下列表,将所有中间张量转换为 NCHW 数据布局。

输入布局更改的示例:

对于具有 NHWC 输入布局的模型
with tvm.transform.PassContext(opt_level=3):
    mod = relay.transform.InferType()(mod)
    mod = relay.transform.ConvertLayout({"nn.conv2d": ["NCHW", "default"],
                                         "nn.bias_add": ["NCHW", "default"],
                                         "nn.relu": ["NCHW"]})(mod)

示例:使用 BNNS 构建和部署 Mobilenet v2 1.0

从 MXNet Mobilenet v2 1.0 模型创建 Relay 计算图:

import tvm
from tvm import relay
import mxnet
from mxnet.gluon.model_zoo.vision import get_model

dtype = "float32"
input_shape = (1, 3, 224, 224)
block = get_model('mobilenetv2_1.0', pretrained=True)
module, params = relay.frontend.from_mxnet(block, shape={'data': input_shape}, dtype=dtype)

标记要迁移到 BNNS 原语的计算图部分,BNNS 集成支持的所有操作都将由 BNNS 调用处理,其余操作将通过常规 TVM LLVM 编译和生成代码。

然后将新模块编译到所需的 Apple 平台:

from tvm.relay.op.contrib.bnns import partition_for_bnns

# target for macOS Big Sur 11.1:
target = "llvm -mtriple=x86_64-apple-darwin20.2.0"

model = partition_for_bnns(model, params=params)  # to markup operations to be offloaded to BNNS
with tvm.transform.PassContext(opt_level=3):
    lib = relay.build(model, target=target, params=params)

导出模块:

lib.export_library('compiled.dylib')

用(在启用 USE_BNNS 条件下构建的) TVM 在目标机器上加载模块,并运行推理:

import tvm
import numpy as np
from tvm.contrib import graph_executor

dev = tvm.cpu(0)
loaded_lib = tvm.runtime.load_module('compiled.dylib')
gen_module = tvm.contrib.graph_executor.GraphModule(loaded_lib['default'](dev))

dtype = "float32"
input_shape = (1, 3, 224, 224)
input_data = np.random.uniform(0, 1, input_shape).astype(dtype)
gen_module.run(data=input_data)

支持的算子

Relay 节点备注
nn.conv2d
nn.batch_normBNNS 集成仅支持 nn.conv2d-batch_norm 模式
nn.dense
nn.batch_matmul
nn.bias_addBNNS 集成仅支持 nn.conv2d 或 nn.dense 中融合的偏置部分
addBNNS 集成仅支持 nn.conv2d 或 nn.dense 中融合的偏置部分
nn.reluBNNS 集成仅支持 nn.conv2d 或 nn.dense 中融合的偏置部分
nn.geluBNNS 集成仅支持 nn.conv2d 或 nn.dense 中融合的偏置部分
【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值