1. 主页 > 物联网(iot)技术 >

无需重新综合或重启 FPGA 即可更新的 TinyML

物联网

提供一种简单且面向未来的方法来将 ML 整合到各种系统中

预计到本十年末,FPGA 芯片将主导物联网端点深度神经网络 (DNN) [1]。它们比微控制器更节能、速度更快,并且比 ASIC 更容易开发。Infxl 已与 Microchip 合作,通过提供两项技术优势来加速其采用:

1. 从训练数据到 C 语言中的紧凑 DNN 再到 HLS 的简单工具

2. 无需重新综合或重启即可更新的 TinyML FPGA 实现

其中第一个解决了嵌入式开发人员社区的一个共同问题:ML 和 FPGA 工具需要一定程度的专业知识,而这些专业知识既昂贵又难以找到。

第二个解决了机器学习 (ML) 的一个固有问题:ML 解决方案在一段时间后变得陈旧,需要定期更新。我们提出了一种 DNN-on-FPGA 设计,可确保无需重新综合、重新实现或重启 FPGA 即可更新 DNN。

通过使用简单紧凑的 ML 模型,可以进一步放大 FPGA 实现的能效和速度优势。Infxl net 就是这样一种模型(示例代码 [2])。它使用 8/16 位数据路径在简单的 C 语言中实现了一个完全连接的 DNN,没有乘法或浮点运算。

Infxl 网络的一个重要特征是它在网络结构/参数和推理引擎之间保持清晰的分离。我们通过将参数保存在 LSRAM 中来利用此功能,同时使用 LUT 和 FF 实现引擎。我们更新 LSRAM 中的参数,FPGA 几乎立即开始根据更新的网络结构/参数提供改进的结果。这样,当我们需要更新已部署的 Infxl 网络时,我们不需要重新综合、重新实现甚至重新启动 FPGA。

开发流程

开发过程包括两个主要步骤:

• 将预处理数据上传到cloud.infxl.com 并将经过训练的Infxl 网络下载为即用型C 代码。此过程不需要任何 ML 背景。

• 根据项目的具体要求,使用Microchip 易于使用的SmartHLS 编译器[3] 从C 代码生成HLS。SmartHLS 是一种基于 Eclipse 的 IDE,它以 C/C++ 代码为输入,并生成 SmartDesign IP 组件 (Verilog HDL) 作为输出。为了构建 FPGA 系统,我们可以在 Libero SoC 设计套件 [4] 中提供的 SmartDesign 画布中实例化生成的 SmartDesign IP 组件。

Infxl net C 代码包括一个测试平台和一个通用接口。在将其部署到 FPGA 中之前,需要进行一些简单的修改:

• 为传入的传感器数据定义首选互连,例如寄存器或AXI4 接口。

• 定义用于传达 Infxl 网络预测的类的机制。

• 将 Infxl 网络的存储器类型更改为仅模拟,并在 C 代码外部但仍在 FPGA 内部定义存储器。

• 在C 代码中创建一个顶级函数以合并Infxl 网络。这将是之后实例化到整个 FPGA 系统中的 IP。

默认的 Infxl net C 代码通过少量 RAM 将推理引擎连接到输入和输出。这是微控制器的典型方法。对于 FPGA 实现,与类似 FIFO 的接口交互更有效。额外的小函数被添加到默认的 Infxl net C 代码中以适应这一点。然而,Infxl 网络推理引擎的代码保持不变。

请参阅下面的原始 C 代码和修改后的 C 代码的比较。

原来的:

数据:图像/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E

修改的:数据:图像/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E

Infxl 网络的默认测试平台函数 copy_inp_vec_to_ram8_head 和 read_op_vec_frm_ram8_tail 被修改或删除,并引入了新函数 net_and_interface。net_and_interface 是将使用 SmartHLS 合成的顶级函数。函数 copy_inp_vec_to_ram8_head 仍然从 testbench 中获取数据;但是,它使用 FIFO 数据类型将数据输出到顶级函数。使用 batch.read() 命令读取来自 FPGA-IP 的数据。变量批处理然后为预测的类设置位。

下一步,SmartHLS 会在代码生成期间提取函数内部 RAM 并将其转换为简单的存储器接口。这需要对 ROM16 阵列进行简单的修改。ROM16 封装了结构以及 Infxl 网络的所有参数。对于状态监控用例,原始ROM16修改如下:

原来的:

数据:图像/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20650%2039'%3E%3C/svg%3E

修改的:

数据:图像/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E

在测试平台中,将在运行 Infxl 网络之前填充 ROM16。在完整的 FPGA 设计中也需要等效负载。这种加载机制还可以更新已部署的 Infxl 网络:数据:图像/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%200%200'%3E%3C/svg%3E

 

多路复用器 (MUX) 被放入 LSRAM 端口之一的地址路径中。连同那些用户可访问的地址和写端口,LSRAM 可以根据需要填充和更新。上图显示了带有 Infxl 网络的 IP 核,该网络配置了用于传感器数据和已识别类类型的 FIFO 接口。但是,根据综合设置,这可以更改。

现在让我们看看硬件。IP 核的确切大小取决于所选的接口和任何所需的附加组件。AXI4 接口由于具有额外的接口功能,因此需要比类似 FIFO 的接口或连接到 AHB 总线的寄存器接口更多的资源。上面显示的配置大约需要以下资源:

• 用于 IP 的 763 个 LUT 和 776 个 FF,包括接口

• 仅 Infxl 网络就有 546 个 LUT 和 610 个 FF

在此配置中,对单个输入向量的推断需要大约 2800 个时钟周期。以 100 MHz 或 200 MHz 运行将分别每 28 µs 或 14 µs 产生一个新分类。

在按照上图的方式实现时,我们可以通过将现有的ROM16替换为更新版本来更新Infxl net的结构和参数。Infxl 网络的内容定义的交换在 ROM16 中每个项目需要一个时钟周期。在我们的用例中,ROM16 阵列的长度为 899。这相当于 899 个时钟周期,其中无法进行识别。然而,新旧 ROM16 之间的快速切换可以通过增加一些 LSRAM 来实现。如果需要连续运行,可以使用两个并行 LSRAM。在这两者中,在任何给定时间只有一个处于活动状态,另一个处于待机状态。为了更新 Infxl 网络,备用 LSRAM 更新为新的 ROM16。然后,切换 LSRAM 输出数据路径中的 MUX,从而激活新加载的 ROM16 并停用前一个。

输入法

如果在分类率上需要更高的性能,也可以将 Infxl 网络合成为一个并行结构,直至完全并行。这将导致明显更快的分类。这种优化是实现规模和性能之间的权衡。此外,完全并行的实现将 In​​fxl 网络的结构和参数合并到 IP 核本身中。这消除了无需重新合成和重新启动即可进行简单更新的能力。所讨论的用例的完全并行实现需要大约 10900 个 LUT 和 4800 个 FF,但将分类加速到大约 600 个时钟周期(包括所有握手)。

本质上,Infxl 网络与 Microsemi 的 SmartHLS 相结合,提供了一种面向未来且直接的方法,可以将 ML 整合到各种系统中。本文中讨论的用例基于来自运动传感器的数据。但是,使用 Infxl net 的应用程序不仅限于该用例。它可用于从预测性维护到环境监控到机器人技术到恶意软件检测到医疗保健可穿戴设备等等的用例。

 

 

本文由网上采集发布,不代表我们立场,转载联系作者并注明出处:http://www.34iot.com//a/yingxiao/470.html

联系我们

在线咨询:点击这里给我发消息

微信号:weixin888

工作日:9:30-18:30,节假日休息