Tengine 推断引擎:树莓派也能玩转深度学习

来自 Hey~YaHei! 的投稿,感谢~

一直以来,树莓派以其良好的社区生态,广受嵌入式爱好者、创客欢迎。在一些相关的社区上(比如树莓派实验室),我们可以看到非常丰富的应用示例及其教程。但在树莓派上的深度学习应用并不常见,这主要是受到树莓派计算力的限制,比如之前看到过有人把yolov2原原本本生硬地部署到树莓派上,结果每一帧检测耗时高达6分钟!!作一帧目标检测花费6分钟这实在是无法忍受的!
如果是用yolov2-tiny的话会快很多,但耗时依旧接近40秒,参考树莓派3B上测试YOLO效果 | CSDN

那树莓派只能跟深度学习无缘了么?那可未必!

Tengine

OADI/Tengine | github

Tengine 是OPEN AI LAB为嵌入式设备开发的一个轻量级、高性能并且模块化的引擎。
Tengine在嵌入式设备上支持CPU,GPU,DLA/NPU,DSP异构计算的计算框架,实现异构计算的调度器,基于ARM平台的高效的计算库实现,针对特定硬件平台的性能优化,动态规划计算图的内存使用,提供对于网络远端AI计算能力的访问支持,支持多级别并行,整个系统模块可拆卸,基于事件驱动的计算模型,吸取已有AI计算框架的优点,设计全新的计算图表示。

编译安装开源版Tengine

安装相关工具

sudo apt-get instal git cmake
  • git 是一个版本控制系统,稍后将用来从 github 网站上下载Tengine的源码
  • cmake 是一个编译工具,用来产生make过程中所需要的Makefile文件

安装支持库

sudo apt-get install libprotobuf-dev protobuf-compiler libboost-all-dev libgoogle-glog-dev libopencv-dev libopenblas-dev
  • protobuf 是一种轻便高效的数据存储格式,这是caffe各种配置文件所使用的数据格式
  • boost 是一个c++的扩展程序库,稍后Tengine的编译依赖于该库
  • google-glog 是一个google提供的日志系统的程序库
  • opencv 是一个开源的计算机视觉库
  • openblas 是一个开源的基础线性代数子程序库

下载&编译

  1. 从github上下载最新的开源版Tengine源码
    git clone https://github.com/OAID/Tengine.git
  2. 切换工作目录到Tengine
    cd Tengine
  3. 准备好配置文件
    Tengine目录下提供了配置模板 makefile.config.example 文件

    cp makefile.config.example makefile.config
  4. 修改配置文件 makefile.config
    由于开源版的Tengine不支持针对armv7的优化,所以需要用openblas替代实现;

将 CONFIG_ARCH_ARM64=y 这一行注释掉(行首加井号 #)以关闭ARM64架构的优化实现;
解除 CONFIG_ARCH_BLAS=y 这一行解除注释(删除行首的井号 #)以开启BLAS计算库的实现方式

  1. 编译并安装
    make -j4
    make install

    这里的 -j4 表示开启四个线程进行编译

测试

  1. 下载mobilenet-ssd模型并放置在 Tengine/models 目录下
    下载链接:https://pan.baidu.com/s/1jzPADdCAah4y8NMk3P9Exg
  2. 将工作目录切换到mobilenet-ssd示例程序的目录下
    cd ~/Tengine/examples/mobilenet_ssd
  3. 编译示例程序
    cmake –DTENGINE_DIR=/home/pi/Tengine .
    make
    

    这里 -DTENGINE_DIR用于为cmake指定环境变量TENGINE_DIR,该变量可以在CMakeLists.txt文件中找到

  4. 运行示例程序
    ./MSSD

    可以看到对一张照片进行目标检测,总共耗时1148.32ms

树莓派专用教育版Tengine

最近 Open AI Lab公司 和 浙江大学生物医学工程与仪器科学学院 在嵌入式人工智能领域上开展了教学合作,公司为学院提供了速度更快的针对armv7优化的Tengine版本用于教学用途(已上传到 Github),接下来让我们看看这个树莓派专用教育版的Tengine到底有多快吧!

  1. 用树莓派专用教育版Tengine的动态链接库覆盖掉原先的开源版
    动态链接库路径为:Tengine/install/lib/libtengine.so

编译时,make会在build目录下产生libtengine.so动态链接库,而make instll将动态链接库、头文件等拷贝到install目录下

  1. 重新运行mobilenet-ssd的示例程序
    可以看到,单帧耗时从1148.32ms下降为286.136ms,速度有了非常明显的提升!

小试牛刀

用上高性能的树莓派专用教育版Tengine,看看mobilenet-ssd在树莓派上能表现如何——

为了方便,视频流直接从mp4文件读取,原始视频如下:

  1. 从 hey-yahei/my_blog/RasPi-Tengine/mobilenet-ssd | github 上下载源码,并放置在 Tengine/example 目录下
  2. 检查 CMakeLists.txt 文件中TENGINE_DIR变量是否正确指向Tengine路径
  3. 执行 cmake . 生成Makefile
  4. 执行 make 编译程序
  5. 执行 ./MSSD 运行程序

实际效果如下:

由于一部分cpu资源被用于视频的解码工作(对于支持硬解码的平台来说不存在这个问题),可以看到单帧耗时有所下降(400ms-700ms),但对于多数应用场景来说这个帧率是绰绰有余的。

本文开头我们说道,直接在树莓派上配置darknet部署的yolo网络,yolov2单帧耗时接近6分钟,yolov2-tiny单帧耗时接近40秒;而在树莓派上配置Tengine部署的yolov2网络,在blas实现下单帧耗时不到8秒(参考利用Tengine在树莓派上跑深度学习网络 | songrbb),在针对armv7优化实现的教育版下单帧耗时甚至不到2秒

这是一篇发布于 5年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


10 评论

  1. 编译出现错误:./MSSD: symbol lookup error: ./MSSD: undefined symbol: init_tengine,提供的动态库可能有一点问题

  2. 由于新版Tengine对makefile.config做了修改,编译前除了需要解除CONFIG_ARCH_BLAS=y的注释之外,还需要解除CONFIG_ARCH_ARM32=y的注释(否则make install会出现找不到libhclcpu.so的错误)

  3. 执行时报错Unable to stop the stream: Inappropriate ioctl for device
    Failed to read image from camera.OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/pi/opencv-3.4.1/modules/highgui/src/window.cpp, line 356
    terminate called after throwing an instance of ‘cv::Exception’
    what(): OpenCV(3.4.1) /home/pi/opencv-3.4.1/modules/highgui/src/window.cpp:356: error: (-215) size.width>0 && size.height>0 in function imshow

    • 这个错误看起来是因为摄像头配置问题。说的好像是那个摄像头窗口尺寸是负数—–意思就是没有窗口。以及读取不到摄像头数据检查一下摄像头驱动有没有正确配置或版本是否最新

  4. 好多教程说有makefile.config文件,但是下了很多次都没有找到makfile.config文件,而且直接编译会报错

cattle进行回复 取消回复

你的邮件地址不会公开


*