engio终结Theano不是偶然,其性能早在Keras支持的四大框架中垫底

本文将对目前流行的几种Keras支持的深度学习框架性能做一次综述性对比,包括Tensorflow、CNTK、MXNet和Theano。作者Jasmeet Bhatia是微软的数据与人工智能架构师,本文内容仅代表个人观点。

如果现在有人质疑Keras在数据科学家和工程师社区的地位,那么就先请他去看看专业AI和云计算玩家对Keras的支持率吧。官方发布的最新版Keras,除了支持Theano等通用库之外,已经可以支持谷歌的Tensorflow和微软的CNTK深度学习库。去年,亚马逊云宣布他们的系统支持另一款强大的工具MXNet。

就在前几周,新一版的MXNet也兼容Keras。不过,截止目前MXNet貌似只支持v1.2.2版本的Keras,对最新版2.0.5的Keras还不支持。

尽管只要产品选用被支持的后端服务,就可以在其中部署Keras模型,但是开发人员和架构师们必须牢记Keras是属于适配不同深度学习框架的高层接口,还不支持任意调整外部库的模型参数。

因此,如果大家想要精细调节后端框架提供的所有参数,作者建议大家直接选用具体的框架,不必再用Keras做一层包装。不过随着时间的推移,Keras的功能必定会逐步完善。但是我们不得不说,目前Keras仍然是深度学习项目早期开发阶段的一个神器,它让数据科学家和工程师们可以快速生成和测试复杂的深度学习模型。
Keras还可以让开发人员快速对比测试几种深度学习框架的相对性能。Keras的配置文件中有一个参数指定了用什么后端框架。所以,大家只要写一份代码,就可以在Tensorflow、CNTK和Theano上都运行一次而无需改动代码。

至于说MXNet,因为它现在只支持v1.2.2版本的Keras,所以要稍微修改代码才能运行。显然,这些独立的框架可以利用开发库中各式各样的特性进一步调试优化,不过Keras为我们提供了一个比较这些框架基础性能的机会。

有不少人写过文章对比Keras支持后端的相对性能,Keras或者后端框架每出一个新版本,我们都能看到性能的巨大改善。

那么让我们看看最新版本的Keras和各个后端框架能达到什么性能。

首先,介绍一下本次实验的硬件配置。

所有的测试都是在装有NVidia Tesla K80 GPU 的Azure NC6 虚拟机上完成的。虚拟机的镜像文件是Azure DSVM (Data Science Virtual Machine)。镜像文件预装了Keras、Tensorflow、Theano、MXNet及其它数据科学工具。为了进行测试实验,所有应用都升级到最新版本,针对MXNet选用v1.2.2版本的Keras。有关Azure DSVM的细节资料可以点击链接

配置

由于每个框架的依赖不同,作者用三种不同的配置进行测试实验,具体如下:

尽管所有框架的开发团队都声称正在研发的新版本性能有所提升,可以用于科研项目,不过实际产品还是倾向于使用稳定版本。因此,本次测试的所有后端框架都使用了最新的稳定版本。

性能测试

为了比较各个框架的性能,作者使用了下面五种深度学习模型。为了保证实验的公平性,所有的模型都来自于Github上Keras项目的示例代码。

作者在自己的Github页面公布了所有的测试代码。

值得注意的是,其中两组测试没有包括MXNet模型。还是由于MXNet不支持最新版Keras的功能,需要改动较多的代码才能运行,所以排除在本次实验之外。其它三组实验只需少许改动代码即可支持MXNet,主要改动在于函数的命名不同。

实验1:CIFAR10 CNN

模型类型:卷计算机网络
数据集/任务名称: CIFAR10 图像数据集
目标:将图片分到10个类别

就完成每个epoch速度而言,Tensorflow略胜MXNet一筹。就准确率/收敛速度而言,CNTK在第25轮迭代之时略微领先,不过第50轮迭代之后所有框架的准确率几乎趋同。

不同框架的性能比较图

实验2:MNIST CNN

模型类型:卷计算机网络
数据集/任务名称:MNIST手写数字数据集
目标:识别照片中的手写数字

在本组实验中,Tensorflow的训练速度略快于www.xyseo.net/ Theano,远好于CNTK,不过各个框架的准确率和收敛速度不分伯仲。

实验3:MNIST MLP

模型类型:多层感知机/神经网络
数据集/任务名称:MNIST手写数字数据集
目标:识别照片中的手写数字

本实验还是在MNIST数据集上测试标准的深度神经网络模型,CNTK、www.yiqianou.cn Tensorflow和Theano的速度大致相同(2.5-2.7s/epoch),而MXNet独树一帜,达到了1.4s/epoch的速度。MXNet在准确率和收敛速度方面也表现略好。

实验4:MNIST RNN

模型类型:层次循环神经网络
数据集/任务名称:MNIST手写数字数据集
目标:识别照片中的手写数字

在这组实验中,CNTK和MXNet的训练速度比较接近(162-164s/www.wmyld11.cn epoch),Tensorflow比它们稍慢,只有179s/epoch。Theano在RNN模型上的表现相当糟糕。

实验5:BABI RNN

模型类型:循环神经网络
数据集/任务名称:bAbi项目
目标:基于描述和问题训练两个循环神经网络模型。生成的向量用来回答一系列bAbi任务。

MXNet没有参与本组实验。Tensorflow和Theano的性能差不多,CNTK比它们快了50%,只需9.5s/epoch。

结论

各组实验中,不同框架的性能对比

Tensorflow在各组CNN模型的实验中都表现出色,但是在RNN模型上表现一般。
CNTK在 BAbi RNN 和 MNIST RNN 实验中的表现远远好于Tensorflow和Theano,但是在CNN实验中不及Tensorflow。
MXNet在RNN测试中的表现略好于CNTK和Tensorflow,在MLP实验中性能碾压其它所有框架。但是受限于v2版Keras的功能,无法参与另外两组对比实验,不过这种情况马上会得到解决。
Theano在MLP实验中的性能略好于Tensorflow和www.tianhengyl1.com CNTK。

总结

从实验结果来看,所有框架都有各自擅长的领域,目前并没有哪一种框架能够全面碾压其它产品。不过,开源社区的参与者们仍旧在持续开发和维护这几款产品,不断提升它们的性能和扩大它们的功能,使得用户的使用和部署过程更方便。不过,性能只是深度学习模型的一个方面,用户在实际使用时还要兼顾效果、便捷性等多个因素。

原文 :Search fastest Keras Deep Learning www.xbylpt5.cn backend

时间: 2024-10-07 06:54:55

engio终结Theano不是偶然,其性能早在Keras支持的四大框架中垫底的相关文章

【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心就这2个要求: 日志文件能够按照 /_logs/{group}/yyyy-MM/yyyy-MM-dd-{sequnce}.log 这样的规则生成: 调用写日志的方法能够带 group 这个字符串参数,差不多是这样:LogHelper.TryLog(string group, string messa

图形性能(widgets的渲染性能太低,所以推出了QML,走硬件加速)和网络性能(对UPD性能有实测数据支持)

作者:JasonWong链接:http://www.zhihu.com/question/37444226/answer/72007923来源:知乎著作权归作者所有,转载请联系作者获得授权. -----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层毕竟是C++,而且Qt的模块写的也不错,做过很多优化,这个渲染的性能在桌面上与有硬件加速的框架比差别不大,除

[Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所

Oracle性能诊断艺术-读书笔记(执行计划中显示 Starts, E-Rows, REM A-Rows and A-Time)等)

spark性能调优(四) spark shuffle中JVM内存使用及配置内幕详情

转载:http://www.cnblogs.com/jcchoiling/p/6494652.html 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所以掌握Spark对JVM的内存使用内幕是至关重要的.很多人对 Spark 的印象是:它是基于内存的,而且可以缓存一大堆数据

mxnet,theano与torch的简单比较

这两天一直没有去准备这一周的内容,其实我也不是闲着,只不过被另外一个东西吸引了注意力.今天看了一天mxnet的文档,记了一点笔记,有点小收获,笔记会在另一篇随笔里面贴出来. 这篇文章我想来比较一下Theano和mxnet,Torch(Torch基本没用过,所以只能说一些直观的感觉).我主要从以下几个方面来计较它们: 1.学习框架的成本,接口设计等易用性方面. 三个框架的学习成本在我看来是 Theano>Torch>mxnet 因为Torch底层语言是lua,一种类似python和js的脚本语言

【Spark】Spark的Shuffle机制

MapReduce中的Shuffle 在MapReduce框架中,shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量. Shuffle是MapReduce框架中的一个特定的phase,介于Map phase和Reduce phase之间,当Map的输出结果要被Reduce使用时.输出结果须要按key哈希.而且分发到每个Reducer上去.这个过程就是shuffle.因为shu

Android7(N)开发者应该知道的一切(最全)

Android N for Developers 转载请注明: http://blog.csdn.net/wen_demo/article/details/51943340   1.多窗口支持 Android N 添加了对同时显示多个应用窗口的支持. 在手持设备上,两个应用可以在"分屏"模式中左右并排或上下并排显示. 在电视设备上,应用可以使用"画中画"模式,在用户与另一个应用交互的同时继续播放视频. 如果您使用 N Preview SDK 构建应用,则可以配置应用

使用开源软件sentry来收集日志

原文地址:http://luxuryzh.iteye.com/blog/1980364 对于一个已经上线的系统,存在未知的bug或者运行时发生异常是很常见的事情,随之而来的几点需求产生了: 1.系统发生异常时是否能够通过日志查看到具体原因 2.怎样第一时间扑捉到异常 3.系统都出现了哪些异常 4.哪些异常出现频率高      第一点好解决,利用log4j.logback等日志框架把异常信息(stacktrace,params)打印到日志文件,可以在查找时很方便看到相信信息.但是这样往往具有滞后性