ResNet模型

前言
在上一次的测试中,我们从头开始训练了一个三个卷积层串联一个全连接层的输出,作为猫狗分类的预测的模型,这次我们自己训练一个ResNet模型,并在以下三个环境中进行性能的对比

  • AIStudio CPU: 2 Cores 8GB Memory
  • AIStudio GPU: V100 16GB VMem
  • Edgeboard

训练模型

模型使用AIStudio 进行训练,训练和预测代码如下

RESNET:https://aistudio.baidu.com/aistudio/projectdetail/67775
MOBILE:https://aistudio.baidu.com/aistudio/projectdetail/67776
按照之前我们的做法,导出model文件和param文件。

测试结果
我们执行预测,忽略掉预处理的速度,仅仅计算模型前向传播的时间。

对于AIstudio平台,我们计算以下代码的运行时间

label = exe.run(inference_program, feed={feed_target_names[0]: tensor_img}, fetch_list=fetch_targets)

对于Edgeboard上面的PaddleMobile,我们计算以下代码的运行时间

PaddleTensor tensor;
tensor.shape = std::vector({1, input_channel, input_width, input_height});
tensor.data = PaddleBuf(data, sizeof(data));
tensor.dtype = PaddleDType::FLOAT32;
std::vector paddle_tensor_feeds(1, tensor);

PaddleTensor tensor_out;
tensor_out.shape = std::vector({});
tensor_out.data = PaddleBuf();
tensor_out.dtype = PaddleDType::FLOAT32;
std::vector outputs(1, tensor_out);

predictor->Run(paddle_tensor_feeds, &outputs);

以下为两个模型的评测数据

ResNet

Edgeboard:

CPU:

GPU:

Mobile_Net
Edgeboard:

GPU:


CPU:


总结:
下表为两个模型预测速度的对比,从中来看,其速度相对于V100的GPU甚至还有一定的优势,让人难以相信。个人的分析是由于以下几个原因

  • Paddle-mobile较为启动预测,与AIstudio的完整版Paddlepaddle相比有启动效率上的优势,AIstudio启动预测可能较慢。
  • 整个预测模型batch size相当于1,发挥不出GPU的优势。
  • 部署预算按三年算的话,GPU V100价格大概是10万,CPU 1万, EdgeBoard 5千,性价比还是蛮高的。

我在进行模型预测的时候,使用钳表对功率进行了大概的估计(条件有限),钳表的读数在0.6A-8A之间变化。结合使用的12V适配器,我大概估计Edgeboard的功耗为8W.

以8W的功耗,在单张图片的预测速度上面领先了几十倍功耗的GPU与CPU。Edgeboard的表现还是令我比较惊喜。本来想继续移植一个前段时间的大尺度的分割网络Unet进行尝试,想继续试试他最大可以跑的模型大小,但似乎Edgeboard目前还不支持分割,存在了一定遗憾。

另外我在进行调试的时候,发现过有几个发布版本的固件不是很稳定,有些op有些问题。还发现了Edgeboard在我的两台笔记本电脑上网络不是很稳定,经常出现相互无法ping通的情况,更换PC后正常,暂时还没发现为什么。

Edgeboard是我第一款接触的嵌入式神经网络加速设备。Paddle-mobile也是我接触的第一个移动端神经网络框架,也是我接触的第一个基于FPGA实现的加速框架。从我了解这个框架到现在仅仅不到半年的时间,已经发布了多个模型转换工具,降低了开发难度,并且支持EasyDL这种方式。虽然目前仍然有一些不成熟的坑需要填,不过相信在软件的迭代下面,它能成为一个很好的嵌入式原型设计平台。

Mobile-SSD 模型

这次我们自己训练一个 Mobilenet-SSD 模型,增加了不同输入维度的情况下,模型运行效率的对比

AIStudio CPU: 2 Cores 8GB Memory
AIStudio GPU: V100 16GB VMem
Edgeboard

训练模型
模型使用AIStudio提供的官方工程 进行训练,训练和预测代码如下

Mobilenet-SSD:https://aistudio.baidu.com/aistudio/projectdetail/41752
按照之前我们的做法,导出model文件和param文件。

运行预测
我们执行预测,忽略掉预处理的速度,仅仅计算模型前向传播的时间。

对于AIstudio平台,我们计算以下代码的运行时间

label = exe.run(inference_program, feed={feed_target_names[0]: tensor_img}, fetch_list=fetch_targets)

对于Edgeboard上面的PaddleMobile,我们计算以下代码的运行时间

PaddleTensor tensor;
tensor.shape = std::vector({1, input_channel, input_width, input_height});
tensor.data = PaddleBuf(data, sizeof(data));
tensor.dtype = PaddleDType::FLOAT32;
std::vector paddle_tensor_feeds(1, tensor);

PaddleTensor tensor_out;
tensor_out.shape = std::vector({});
tensor_out.data = PaddleBuf();
tensor_out.dtype = PaddleDType::FLOAT32;
std::vector outputs(1, tensor_out);

predictor->Run(paddle_tensor_feeds, &outputs);

以下图片为预测结果,由于时间有限,没有很细致去训练模型,仅仅对比了模型运行的速度。

下表为模型在不同维度下的预测速度的对比,从中来看,其速度相对于V100的GPU基本处于同一个数量级,远远领先与GPU

在之前的文章里我们提到,本来想继续移植一个前段时间的大尺度的分割网络Unet进行尝试,想继续试试他最大可以跑的模型大小,但似乎Edgeboard目前还不支持分割,所以我们更换了目标检测网络进行尝试。在mobilenet-SSD这个模型上,Edgeboard最大可以跑到700*700的输入维度,并且能保持在16fps之上(不包含输入图像的语出过程),基本上具有实时性。

之前我提到的,在我的两台笔记本电脑上网络不是很稳定,经常出现相互无法ping通的情况,目前经过试验之后,发现问题为板子的网卡在与不支持千兆的网卡进行通信时候,不能正确的协商,仍然使用千兆模式,使用以下命令固定为百兆即可正常连接

ethtool -s eth0 speed 100 duplex full 

Edgeboard是我第一款接触的嵌入式神经网络加速设备。Paddle-mobile也是我接触的第一个移动端神经网络框架,也是我接触的第一个基于FPGA实现的加速框架。从我了解这个框架到现在仅仅不到半年的时间,已经发布了多个模型转换工具,降低了开发难度,并且支持EasyDL这种方式。虽然目前仍然有一些不成熟的坑需要填,不过相信在软件的迭代下面,它能成为一个很好的嵌入式原型设计平台。

作者:Litchll

百度大脑EdgeBoard计算卡基于Resnet50/Mobile-SSD模型的性能评测的更多相关文章

  1. 百度大脑EasyEdge端模型生成部署攻略

    EasyEdge是百度基于Paddle Mobile研发的端计算模型生成平台,能够帮助深度学习开发者将自建模型快速部署到设备端.只需上传模型,最快2分种即可生成端计算模型并获取SDK.本文介绍Easy ...

  2. PHP:基于百度大脑api实现OCR文字识别

    有个项目要用到文字识别,网上找了很多资料,效果不是很好,偶然的机会,接触到百度大脑.百度大脑提供了很多解决方案,其中一个就是文字识别,百度提供了三种文字识别,分别是银行卡识别.身份证识别和通用文字识别 ...

  3. 基于双XCKU060+双C6678 的双FMC接口40G光纤传输加速计算卡

    基于双XCKU060+双C6678 的双FMC接口40G光纤传输加速计算卡 一.板卡概述 板卡采用基于双FPGA+双DSP的信号采集综合处理硬件平台,板卡大小360mmx217mm.板卡两片FPGA提 ...

  4. python预课06 基于百度大脑AI的人工智能,百度颜值检测,语音合成与识别

    百度大脑: 如下图,百度开放了许多人工智能接口可以使用,先注册一个百度大脑账户 点击创建应用,选择需要的功能,如人脸识别,语音识别等 点击查看文档,可以查看功能对应语言的方法,参数.首先在CMD命令下 ...

  5. 百度大脑发布“AI开发者‘战疫’守护计划”,AI支援抗疫再升级

    面对新冠肺炎疫情,AI开发者们正在积极运用算法.算力.软件等“武器”助力抗疫.针对开发者们在疫情防控期间的开发与学习需求,2月6日,百度大脑推出“AI开发者‘战疫’守护计划”, 正在进行疫情防控相关应 ...

  6. AI+教育落地,百度大脑如何让校园更智能?

    人工智能作为影响社会底层技术革命逐渐向传统行业渗透,“AI+”已经替代“互联网+”成为创业创新的新引擎,出人意料的是,在AI在教育业的率先落地并且相当火爆. 现在,人工智能教育已成为从业者心目中的“教 ...

  7. 百度大脑UNIT3.0智能对话技术全面解析

    智能客服.智能家居.智能助手.智能车机.智能政务……赋予产品智能对话能力是提升产品智能化体验.高效服务的重要手段,已经开始被越来越多的企业关注并布局.然而,智能对话系统搭建涉及NLP.知识图谱.语音等 ...

  8. 全面解析百度大脑发布“AI开发者‘战疫’守护计划”

    即日起,百度大脑发布“AI开发者战疫守护计划” 大疫当前,人人有责,携手开发者共同出击抗击疫情 基于百度大脑AI开放平台和飞桨深度学习平台,积极运用算法.算力.软件等“武器”助力抗疫!   谁能参与计 ...

  9. 发布AI芯片昆仑和百度大脑3.0、L4自动驾驶巴士量产下线,这是百度All in AI一年后的最新答卷...

    机器之心报道,作者:李泽南. 去年的 7 月 5 日,百度在北京国际会议中心开办了首届「AI 开发者大会」.在会上,百度首次喊出了「All in AI」的口号.一年的时间过去了,今天在同样地点举行的第 ...

随机推荐

  1. Linux 配置环境变量的tar

    打开工具  连接 到Xshell 6 工具里面 查看是否 配置成功 作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具.

  2. 细说JVM内存模型

    细说JVM内存模型 前言 在正式学习 JVM 内存模型之前,先注意以下几个是问题: JVM 内存模型与 JAVA 内存模型不是同一个概念.JVM 内存模型是从运行时数据区的结构的角度描述的概念:而 J ...

  3. 【JMX】jmx结合jmx_exporter实现promethues监控

    JMX JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Lev ...

  4. 按照ID倒序查出某个字段不重复的集合

    一.需求 有如下一个表pp_test: id name 1 aa 2 bb 3 cc 4 aa 5 cc 6   要求查出name字段中不重复的值(不算空值),并且按照id的倒序排列(不必输出ID). ...

  5. k 近邻算法解决字体反爬手段|效果非常好

    字体反爬,是一种利用 CSS 特性和浏览器渲染规则实现的反爬虫手段.其高明之处在于,就算借助(Selenium 套件.Puppeteer 和 Splash)等渲染工具也无法拿到真实的文字内容. 这种反 ...

  6. Go游戏服务端框架从零搭建(一)— 架构设计

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居海边. 本教程以Go语言分区游戏服务端框架搭建为例. Go语言是Google开发的一种静态强类型.编译型.并发型.具有垃圾回收功能的编程语言.语法上近似C语 ...

  7. SpringBoot项目创建与第一个SSM项目示例

    本节介绍SpringBoot创建第一个示例SSM项目的完整过程,使用工具STS,与IDEA操作基本类似. 示例代码在:https://github.com/laolunsi/spring-boot-e ...

  8. componentWillMount VS componentDidMount

    前言 这与React组件的生命周期有关,组件挂载时有关的生命周期有以下几个: constructor(){} componentWillMount(){} render(){} componentDi ...

  9. 最全的linux系统安装教程和排错方法

    第4章 linux信息和系统安装与连接    260 4.1 linux的发展历史    260 4.2 GPL协议,FSF协议    261 4.3 linux系统的安装    261 4.3.1 ...

  10. 350. 两个数组的交集 II

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...