神经网络

神经网络是一种受到生物神经系统启发而设计的计算模型,用于机器学习和人工智能领域。神经网络由大量的人工神经元(模拟生物神经元)组成,这些神经元通过连接权重相互连接,形成网络结构。神经网络的目标是通过学习和调整权重来模拟和解决复杂的问题。

意法半导体(ST)发布了STM32Cube.AI version 7.2.0,这是微控制器厂商推出的首款支持超高效深度量化神经网络的人工智能(AI)开发工具。

“意法半导体STM32Cube.AI

STM32Cube.AI 将预先训练好的神经网络转换成STM32微控制器(MCU)可以运行的C语言代码,是充分利用嵌入式产品有限的内存容量和算力开发尖端人工智能解决方案的重要工具,将人工智能从云端下移到边缘设备,能够为应用带来巨大的优势,其中包括原生隐私保护、确定性实时响应、更高的可靠性和更低的功耗。边缘人工智能还有助于优化云计算使用率。

现在,通过支持 qKeras 或 Larq 等深度量化输入格式,开发者可以进一步降低神经网络代码量、内存占用和响应延迟,这些优势让边缘人工智能释放出更多可能,包括经济型应用和成本敏感应用。因此,开发者可以创建边缘设备,例如,功能和性能先进的电池续航更长的自供电的物联网端点。从超低功耗 Arm Cortex-MCU® 微控制器,到利用 Cortex-M7M33 和 Cortex-A7 内核的高性能产品,意法半导体的STM32系列为开发者提供了许多适合的硬件平台。

STM32Cube.AI 7.2.0版还增加了对TensorFlow 2.9模型的支持,改进了内核性能,新加了scikit-learn机器学习算法和开放神经网络交换(ONNX)运算符。

有关 STM32Cube.AI v7.2.0的更多信息和免费下载,请访问 www.st.com

博客网址:https://blog.st.com/stm32cubeai-v72/

围观 8

书接上文(点此查看前文),我们横向比较了在应用TFLm引擎进行模型文件导入时候,所使用的三种常用方式:

  • SD卡存储结合文件系统,

  • xxd小工具进行文件的十六进制转换

  • 以及使用汇编指令.incbin直接进行模型导入。

可以说各有所长,但是,当我们需要频繁地进行模型的替换、更新时,麻烦就出现了。xxd和.incbin的形式都需要重新编译目标工程,并下载到板子中。

当我们的程序体量较大时,即便不需要对全部工程进行编译(做到改啥编啥),但是,下载这一步,是无论如何不能跳过的,随着最终镜像大小的不同,所消耗的时间也会不同。而使用文件系统的方式,无形中增加了移植文件系统的工作量。

设计思路

为了克服这一问题,小编在上一篇的结尾提出了一个新的方案,直接把flash看作一大块空白存储区,并开辟一个固定区域存放模型文件。这样一来,我们只需要在程序中将模型的读取位置固定,无论模型是否更新,都能够读取最新的模型数据,进行后续处理。

而且小编也特意强调建议大家直接使用Nor Flash来实现这一操作。

以i.MX RT系列MCU为例说明这样做的优势。i.MX RT系列由于没有片上Flash芯片,都通过外扩Flash芯片存储代码。当我们将启动方式调整为XIP,即从flash启动时,芯片内部的BootROM会帮我们配置初始化好这个片上的Flash芯片,而由于Nor Flash的特性,支持随机的内存访问,也就是说,我们在程序内部,可以直接通过指针的形式进行访问,甚至可以直接调用memcpy函数进行数据的拷贝。

比起集成文件系统的方式,可以说方便至极。不过,也不是说Nand Flash就不适合,只是处理起来会稍稍麻烦一点,由于不支持随机的读操作,就要先拷贝到RAM区域再进行操作。

设计实现

言归正传,为了方便进行数据的管理,我们需要设计一套简单的管理逻辑,说的专业一点就是为我们的数据添加一个帧头,当然,既然大道至简,数据打包格式大致就是如下格式(可能有些简陋啊,大家见谅):

“一种基于MCU的神经网络模型在线更新方案之数据处理篇"

当然为了能够在程序中使用,我们再定义一个对应的C语言形式来表达,这里要用到C语言中0长度数组的概念:

struct {
	uint32_t n, w, h , c;
	uint8_t data[0];
}

这样一来,我们就具象化了我们所设计的那个简单的数据打包协议。

下一步是如何将数据打包成我们要的样子,这里要借助于Python来编写一个简单的脚本处理,并假设最终会生成一个二进制文件,假设输入一个多维数组results,首先构建其帧头,默认维度不足4的数据,用1补齐,保证最终的帧头包含4个维度信息:

def save_to_bin(bin_name, results):
    shape = list(results[0].shape)
    element_size = [1] * (3 - len(shape)) + shape
    element_len = len(results)
    # shape is [N, H, W, C]
    bin_values = np.asarray([element_len] + element_size, dtype=np.uint32).tobytes()
    bin_values += results.tobytes()
    with open(bin_name, "wb") as f:
        f.write(bin_values)
        f.close()

聊到这儿,可能有同学会问了,针对于tflite模型,我们往往只需要知道其首地址就好了,TFLm会处理那些长度信息,我还有必要构造帧头吗?这下给小编问的有点哑口无言。马上着手设计了第二种数据结构:

“一种基于MCU的神经网络模型在线更新方案之数据处理篇"

是的,针对于模型数据这一特殊的存在,可以设计出更加精简的表达格式,而且,我们知道tflite模型本身实际上已经是二进制文件的形式了,也就是说,可以直接拿过来使用,无需再做任何操作,直接烧写到固定地址即可。

那我们上面所设计的数据结构就毫无用武之地了吗?当然不是!小编做这些当然都是有理由的啊。

大家想一想,运行神经网络模型的时候,光有模型就可以了吗?当然不,我们还缺少输入啊!如果你是摄像头输入,请跳过这节。而如果是离线测试呢?需要大量加载静态图到内存中,是不是和之前我们的分析就类似了。

每次更换测试数据,依旧需要重新下载链接,那么按照本文提供的方案,也为数据设置一块固定的区域,然后借助于上述save_to_bin代码,将数据打包成固定格式,是不是就可以在程序中利用那个结构体访问了呢?没错!小编早就设计好了。

下期预告

那么至此,小编就给大家介绍了数据的组织结果,以及如何编写PC端工具对数据进行打包处理,以变成“应用程序可以访问的样子”。

当然,考虑到模型文件在使用上的特殊性,也为其设计了特殊的存储格式,即直接删去了帧头,只保留了数据部分。而对于图像输入等,需要明确知道其输入维度的数据,就需要保留帧头信息了。

在这里再次做个广告:下一篇我们以i.MX RT1060系列芯片为例,进行MCU实战部分,包括如何进行C代码的的编写获取数据,Keil的散列加载文件的编写以实现数据的运行时加载,完成将数据拷从Flash拷贝到sdram等,敬请期待!

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 79

相信不少在MCU平台使用Tensorflow Lite Micro(Tensorflow Lite Micro专为嵌入式平台推出的专用版TFlite),以下简称TFLm,推理引擎体验过AI的小伙伴们,一定都遇到过这样的情况:当我们历经千辛万苦训练出来一个模型之后,要如何将它导入工程里呢?

各抒己见

这时候有同学会说了:我有文件系统啊,模型放到sd卡中,文件操作读进来分分钟啊!还有的同学会说了:我有xxd,当然,xxd也是TFLM的御用工具,负责将一个文件以十六进制的形式显示出来,使用过这个推理引擎的同学一定对下面这段注释很是熟悉:

// xxd -i mobilenet_v1_0.25_128_quant.tflite > mobilenet_v1_0.25_128_quant_model.h

这之后,我们的模型就会被转化成类似于下面这个样子,不要怀疑,这就是我们的模型真正的样子,并非眉清目秀,在程序中就可以通过mobilenet_model这个指针来访问模型数据:

const char mobilenet_model[] __ALIGNED(16) = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00,
  0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x78, 0x5b, 0x07, 0x00,
  0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
  。。。。
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x97, 0x26, 0x08, 0x39
};
unsigned int mobilenet_model_len = 496912;

这时候,又有同学说了,你们这些方法都太弱了:你们有SD卡,有文件系统,有xxd!这些我统统不需要,不用额外安装工具,不用文件系统扩展,不用看着我这空荡荡的钱包,还要祭出小钱钱去买张SD卡。

嗯,我只需要编译器+裸板即可!要的就是简洁(也想高调,可是小钱钱不允许啊)。

不卖关子了,我们有.incbin。这个小东西是一个汇编指令,用来包含某一个文件到汇编文件中,文件的内容将会按字节逐一添加到当前elf(镜像文件)节中。不会做任何方式的解释,保证数据的完整和一致性。即原封不动的添加进来,不过要注意,以下代码要保存在以.s尾缀的汇编文件中:

.global mobilenet_model   // 导出全局符号
.global mobilenet_model _end
.section .rodata   // 存储位置

. mobilenet_model :
   .incbin “mobilenet_v1_0.25_128_quant.tflite”
. mobilenet_model_end :

这样一来,同样可以使用mobilenet_model这个模型指针来进行模型的访问。

很难说,上面三位同学的方法哪一种更好一点,可能第三位同学提出的方法,是对于外部依赖最少的,只需要利用编译器对于汇编指令的支持即可。既不需要费力的移植文件系统,也不用花费小钱钱购买SD卡,也不用求求xxd工具帮我们做事。

当然,小编在这里也站一下队,明确一下立场!我投.incbin一票,当然了,这个也是小编一直在用的方式。更换模型,只需要修改一下导入路径即可,可以说香的不行了!

新的挑战

不好,,,好像有点跑题变成夸夸群了,回到主题。

小伙伴既然已经回答了小编提出的问题:导入模型的N种方法,小编就再追问大家一个问题:如果频繁更新模型要怎么办呢?

当然,使用文件系统的小伙伴可能这时候会心一笑了:哈哈,我就知道有这么一出,让我猜到了吧,比灵活性,没人能和我比!

的确,无论是使用.incbin还是xxd的方式,每更新一次模型都要对整个模型重新编译下载。而使用文件系统的方式,只需要将模型拖到SD即可,不过根据程序设计,是否需要保证模型名字保持一致才能够正确loading。。。这个就不是本篇要讨论的了。

柳暗花明

相信看到这里的小伙伴们心里已经有数了,小编一定是已经找到了另一种替代方案,既能实现模型的更新,又不用重新对模型进行编译。是的,小编也就不再卖关子了,这就揭开庐山真面目。

小编这里要提出的方法,有点类似于引入文件系统的概念,只不过,是一个手动管理的“丐版”文件系统。

一句话概括就是:在非易失性器件上,说普通话就是Nor Flash上开辟一块固定的区域来存储模型,之后我们只需要将最新的模型也同样下载到这一区域即可,这样一来,我们在主程序中,只需要维护这一区域,将其作为模型的数据起始地址,就可以达到实时更新模型的目的了。

是不是感觉小编的这个想法,思路是如此的清晰!而且,还免去了移植文件系统的繁琐过程,最重要的是,保住了钱包里的小钱钱,不用买SD卡了。

这里特别强调是Nor Flash,作为可以随机读的器件,可以方便地进行随机访问,使用起来或者说在程序的编写上会更加的便捷。当然,使用NAND flash也未曾不可,有兴趣的伙伴可以自行整理。

留下悬念

当然,可能有小伙伴要质疑:那你这个可以实现存储多个模型吗?小编很负责任地告诉大家,只要胆子大,宇宙都能给你装下!只不过,在存放数据的时候,需要额外存储一些帧头信息,告知程序一共有多少组模型存储其中。

小编将在下期为大家介绍如何设计合适的存储结果以存放我们的flash数据,并编写一个PC端小程序,负责进行数据的转换,敬请期待!

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 163
  • 恩智浦展示了应用于MCU的Glow神经网络编译器为基于视觉和语音的机器学习应用带来的诸多优势。恩智浦也是首家针对MCU实现相较于标准版Glow 2至3倍性能的半导体供应商
  • 开源Glow编译器最初由Facebook开发,恩智浦现在将其集成到eIQ™机器学习软件开发环境中,为旗下i.MX RT系列跨界MCU提供高性能推理
  • 恩智浦的Glow实施面向Arm® Cortex®-M内核和Cadence® Tensilica® HiFi 4 DSP,为i.MX RT系列跨界MCU提供特定平台的优化

8月5日——恩智浦半导体NXP Semiconductors N.V.(纳斯达克代码:NXPI)发布了eIQ机器学习(ML)软件对Glow神经网络(NN)编译器的支持功能,针对恩智浦的i.MX RT跨界MCU,带来业界首个实现以较低存储器占用提供更高性能的神经网络编译器应用。Glow编译器由Facebook开发,能够集成特定于目标的优化,恩智浦利用这种能力,使用适用于Arm Cortex-M内核和Cadence Tensilica HiFi 4 DSP的神经网络算子库,最大程度地提升i.MX RT685以及i.MX RT1050和RT1060的推理性能。此外,此功能已集成到恩智浦的eIQ机器学习软件开发环境中,在恩智浦的MCUXpresso SDK中免费提供。

使用Glow充分发挥MCU架构特性的优势

2018年5月,率先开发PyTorch的Facebook推出了开源社区项目Glow(Graph Lowering神经网络编译器),其目的是提供优化,提高一系列硬件平台上的神经网络性能。作为一种神经网络编译器,Glow基于未优化的神经网络生成高度优化的代码。这个特点有别于典型的神经网络模型处理,后者采用即时编译,因而需要更高的性能,还会增加存储器开销。像Glow这样直接运行优化代码可以显著降低处理和存储器要求。恩智浦也在Glow开源社区中扮演着积极角色,帮助推广和普及Glow的新功能。

Facebook软件工程经理Dwarak Rajagopal表示:“GitHub中提供的标准版Glow可以直接在任何设备上运行,让用户能够灵活地针对感兴趣的基础架构编译神经网络模型,包括Arm Cortex-A和Cortex-M内核以及RISC-V架构。恩智浦使用充分利用MCU计算元件的专用软件库,实现了2-3倍的性能提升,展示了从基于云的高端机器到低成本的嵌入式平台的广泛范围内,将Glow神经网络编译器用于机器学习应用的诸多优势。”

优化机器学习框架以增强竞争优势

未来几年内,对机器学习应用的需求预期将会大幅增加。据TIRIAS Research预测,到2025年,98%的边缘设备将使用某种形式的机器学习/人工智能。根据市场预测,到2025年,预计将有180亿至250亿部设备包含机器学习功能,尽管它们可能并没有专用的机器学习加速器。消费型设备制造商和嵌入式物联网开发人员将需要优化机器学习框架,以便实现使用MCU的低功耗边缘嵌入式应用。

恩智浦半导体资深副总裁兼边缘处理业务总经理Ron Martino表示:“借助eIQ机器学习软件框架,利用高度集成的i.MX应用处理器和高性能i.MX RT跨界MCU的强大功能,恩智浦正在推动机器学习功能在边缘设备上的实现。随着i.MX RT系列跨界MCU增加对Glow的支持,我们的客户能够编译深度神经网络模型,为他们的应用带来竞争优势。”

恩智浦的面向机器学习的边缘智能环境解决方案是一个全面的工具包,提供开发人员需要的构建模块,帮助他们高效地在边缘设备中实施机器学习。Glow整合到eIQ软件后,机器学习开发人员将拥有全面的高性能框架,可在包括i.MX RT跨界MCU和i.MX 8应用处理器的恩智浦边缘处理解决方案上进行扩展。客户拥有了更强大的工具,能够在i.MX RT MCU和i.MX应用处理器上开发机器学习语音应用、对象识别、人脸识别等应用。

利用恩智浦的Glow神经网络实施来提高性能

eIQ现在包含对Glow和TensorFlow Lite的推理支持,对于这些实施,恩智浦通常会执行基准测试以衡量其性能。MCU基准测试包括标准神经网络模型,例如CIFAR-10。以CIFAR-10模型为例,恩智浦采集的基准测试数据表明了如何利用i.MX RT1060器件(采用600MHz Arm Cortex-M7)、i.MX RT1170器件(采用1GHz Arm Cortex-M7)和i.MX RT685器件(采用600 MHz Cadence Tensilica HiFi 4 DSP)的性能优势。

恩智浦对Glow的支持离不开Cadence为Tensilica HiFi 4 DSP提供的神经网络库(NNLib),该DSP提供了4.8GMAC性能。同样以CIFAR-10为例,恩智浦的Glow实施使用这一DSP来加快神经网络运算,实现了25倍的性能提升。

Cadence Tensilica IP企业副总裁Sanjive Agarwala表示:“Tensilica HiFi 4 DSP最初集成在i.MX RT600跨界MCU中,目的是提高各种不同的音频和语音处理应用的速度。但是,当有越来越多机器学习推理应用瞄准了低成本、低功耗的MCU级应用时,HiFi 4 DSP凭借固有的DSP计算性能,成为加快这些神经网络模型的理想选择。随着恩智浦在eIQ机器学习软件中实施Glow,i.MX RT600 MCU的客户能够利用该DSP来满足多种机器学习应用的需求,包括关键词检索(KWS)、语音识别、降噪和异常检测。”

Arm公司机器学习营销副总裁Dennis Laudick表示:“恩智浦将Arm CMSIS-NN软件库包括在elQ中,目的是最大程度地提升性能,减少Arm Cortex-M内核上的神经网络存储器占用。以CIFAR-10神经网络模型为例,恩智浦能够利用CMSIS-NN实现1.8倍的性能提升。其他神经网络模型应该能够产生相似的结果,这清晰地展示了这款高级编译器和我们的优化神经网络算子库的优势。”

上市时间

恩智浦的集成Glow神经网络编译器的eIQ软件现已上市,通过i.MX RT600跨界MCU、i.MX RT1050和i.MX RT1060跨界MCU的MCUXpresso SDK提供。未来将会推出适用于恩智浦其他MCU的集成Glow神经网络编译器的eIQ软件。

关于i.MX RT系列跨界MCU

i.MX RT系列是业内首个跨界MCU产品组合,以经济的价格,提供高性能的Arm Cortex-M内核、实时功能和MCU可用性。该系列代表了低功耗应用处理器与高性能微控制器的融合。i.MX RT系列填补了传统MCU和i.MX应用处理器之间的空白,为MCU客户提供了显著提高性能和改进集成的方法,一如既往地简单易用。

有关更多信息,请访问www.nxp.com.cn/eiqwww.nxp.com.cn/eiq/glow

关于恩智浦半导体

恩智浦半导体(纳斯达克代码:NXPI)致力于通过先进的安全连结解决方案为人们更智慧安全、轻松便捷的生活保驾护航。作为全球领先的嵌入式应用安全连结解决方案领导者,恩智浦不断推动着安全互联汽车、工业与物联网、移动设备及通信基础设施市场的创新。恩智浦拥有超过60年的专业技术及经验,在全球逾30个国家设有业务机构,员工达29,000人,2019年全年营业收入88.8亿美元。更多信息请登录www.nxp.com.cn

围观 25

Microchip VectorBlox SDK和IP能让软件开发人员在不具备FPGA专业知识的前提下,轻松地对经过训练的神经网络进行编程

随着人工智能、机器学习技术和物联网的兴起,应用开始向收集数据的网络边缘迁移。为缩小体积、减少产热、提高计算性能,这些边缘应用需要节能型的解决方案。Microchip Technology Inc.(美国微芯科技公司)发布的智能嵌入式视觉解决方案,致力于让软件开发人员可以更方便地在PolarFire®现场可编程门阵列(FPGA)内执行算法,进而满足边缘应用对节能型推理功能日益增长的需求。作为Microchip嵌入式解决方案组合的重要新成员,VectorBlox加速器软件开发工具包(SDK)可帮助软件开发人员在不学习FPGA工具流的前提下,利用Microchip PolarFire FPGA创建灵活的低功耗覆盖神经网络应用。

FPGA是边缘人工智能应用(例如功耗受限的计算环境下的推理功能)的理想选择,因为FPGA拥有更高的运算能力(GOPS),能耗比中央处理器(CPU)和图形处理器(GPU)更优。但是,FPGA需要操作人员具备专业的硬件设计技能。Microchip的VectorBlox加速器SDK可帮助开发人员在不具备FPGA设计经验的前提下用C/C++语言进行编码,对节能神经网络进行编程。

这一高度灵活的工具包能够以TensorFlow和开放神经网络交换(ONNX)的格式执行模型,最大程度地提升框架的互操作性。ONNX支持Caffe2、MXNet、PyTorch和MATLAB®等众多框架。与其他FPGA解决方案不同的是,VectorBlox加速器 SDK在Linux®和Windows®操作系统上均可使用,且包含精度达到比特级的模拟器。利用模拟器,用户可以在软件环境中验证硬件的精度。此外,利用VectorBlox 加速器 SDK包含的神经网络IP,用户可在运行期间加载不同的网络模型。

Microchip FPGA事业部副总裁Bruce Weyer表示:“为确保软件开发人员能充分利用FPGA的节能特点,我们应设法使开发人员不再需要学习新的FPGA架构和专属工具流,同时让他们可以灵活地连接多框架和多网络解决方案。利用VectorBlox 加速器 SDK和神经网络IP核,软件和硬件开发人员可以在PolarFire FPGA上部署极其灵活的覆盖神经网络卷积架构。通过PolarFire FPGA,他们可以更轻松地构建和部署在外形尺寸、产热和功耗方面达到一流水准的人工智能边缘系统。”

在边缘执行推理功能时,PolarFire FPGA的总功耗比同类竞争产品低50%,同时数学模块的容量比同类竞争产品高25%,每秒运算次数(TOPS)高达1.5万亿次。开发人员还可凭借PolarFire FPGA固有的易升级性和将不同功能集成至单个芯片上的能力,更好地实施定制,实现差异化。PolarFire FPGA神经网络IP有多种尺寸可供选择,可在性能、功耗和封装尺寸之间实现平衡和取舍,符合应用需求,最小封装尺寸可以达到11×11mm。

去年7月发布的Microchip智能嵌入式视觉解决方案旨在为硬件和软件开发人员提供工具、知识产权(IP)核和电路板,以满足边缘应用对低发热和小封装的要求。相比其他解决方案,PolarFire FPGA的功耗更低。因此,客户不再需要在机壳内设置风扇。此外,客户在设计中利用PolarFire FPGA可实现功能整合。例如,在智能摄像头等应用中,PolarFire FPGA可以将传感器接口、DDR控制器、图像信号处理(ISP)IP和网络接口集成至图像信号管中,并整合机器学习推理功能。

供货

VectorBlox 加速器 SDK工具包将于2020年第三季度上市,早期使用计划将于6月开始。PolarFire FPGA目前已投产。欲了解更多信息,请访问智能嵌入式视觉解决方案网页或联系vectorblox@microchip.com

资源

可通过Flickr或联系编辑获取高分辨率图片(可免费发布):
应用图:www.flickr.com/photos/microchiptechnology/49450987492/sizes/l/

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。 其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

围观 8
订阅 RSS - 神经网络