请选择 进入手机版 | 继续访问电脑版
从零开始 从零开始 资讯 查看内容

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)

2020-4-26 11:43| 发布者: 风筝线7| 查看: 106| 评论: 3

摘要: 深度学习框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?对于这几大框架在运行各项深度任务时的性能差异如何,各位读者不免会有所好奇。微软数据科学家Ilia Karmanov最新测试的结果显示,亚马逊MXNet在CNN ...

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106


深度进修框架哪家强:TensorFlow?Caffe?MXNet?Keras?PyTorch?对于这几大框架在运转各项深度使命时的性能差别若何,列位读者难免会有所猎奇。

微软数据科学家Ilia Karmanov最新测试的成果显现,亚马逊MXNet在CNN、RNN与NLP感情分析使命上性能微弱,而TensorFlow仅擅擅长特征提取。

测试详情更新在Ilia Karmanov的GitHub项目DeepLearningFrameworks(https://github.com/ilkarman/DeepLearningFrameworks)内。不外作者暗示,项目内的测试代码并非专门为深度进修性能而编写,目标仅在于简单比力一下各框架之间的性能差别

以下为该项目标详情,have fun!

翻译 | 刘畅

编辑 | Donna

我们做这个榜单的初衷是为了好玩,所以省略了很多重要部分的比力。比如:帮助和支持,自界说图层(可以建立一个胶囊收集吗?),数据加载器,调试,分歧的平台支持,散布式练习等等。

我们不肯定能否能对框架的整体性能提出任何倡议,由于本项目首要还是在演示若何在分歧的框架中建立不异的神经收集

例如,利用Caffe2在Python中建立CNN,然后在Julia中利用KNet复制这个收集,大概也可以在PyTorch中尝试建立一个RNN并在Tensorflow中复制它。你可以在Chainer中停止一些特征提取,然后在CNTK中复制这个操纵。

由于Microsoft Azure深度进修虚拟机NC6上的框架已经更新到了最新版本,所以notebooks代码挑选在上面运转,仅占用了显卡Nvidia K80 GPU一半的性能。

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106

测试方针

建立深度进修框架的Rosetta Stone(译者注:一个很是好用的外语进修软件),使数据科学家可以轻松地将他们的专业常识从一个框架转移到另一个框架(经过翻译,而不是重新起头进修)。别的,是为了加倍通明地在模子练习时候和默许选项方面停止比力。

很多在线教程利用很是低级此外API,虽然这些API很是具体,但对于大大都用例来说,并没有多大意义,由于大大都时辰有更高级此外帮助法式可用。在这里,我们间接疏忽抵触的默许值的条件下,尝试采用第一流此外API,以便在框架之间停止更轻易的比力。

下面的成果将证实,一旦利用更高级的API,代码结构变得很是类似,而且可以大略地暗示为:

  • 加载数据; x_train,x_test,y_train,y_test = cifar_for_library(channel_first =?,one_hot =?)

  • 天生CNN / RNN收集结构(凡是在最初一层上不激活)

  • 指定损失函数(穿插熵与softmax是一路指定的),优化器并初始化收集权重+会话

  • 用mini-batch的方式来练习练习集并利用自界说迭代器(一切框架都利用公共的数据库)

  • 在测试集的mini-batch上面停止猜测

  • 计较正确率

本质上,我们是在比力一系列肯定性的数学运算(虽然是随机初始化),所以比力跨框架的正确性就是没成心义了。相反,它会提醒我们去检查想要的婚配(?),以确保我们正在比力的是不异的模子架构。

测试成果(2017年11月24日)

在CIFAR-10数据集上练习CNN(VGG范例)收集

性能对照- 图像识别

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106

该模子的输入是标准的CIFAR-10数据集,包括五万个练习图像和一万个测试图像,均匀散布在10个种别中。每个32×32像素的图像转化为张量的形式(3,32,32),像素值从0-255归一化到0-1。 例如:汽车图像的相关参数 y=(0,1,0,0,0,0,0,0,0,0),其标签是= [飞机,汽车,鸟,猫,鹿,狗,田鸡,马,船 ,卡车]

在IMDB数据集上练习RNN(GRU,门控循环单元)

性能对照 - 自然说话处置(感情分析)

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106

这个模子的输入是标准的IMDB电影批评数据集,包括两万五千个练习批评和两万五千个测试批评,同一分为2个品级(正面/负面)。 下载的批评已经是单词索引的张量形式,例如 (假如你喜好像南方公园这样的成人笑剧漫画)将被暗示为(1 2 3 4 5 6 3 7 8)。

遵守Keras框架的处置方式,其中肇端字符被设备为1,辞汇外(利用3万巨细的辞汇库)被暗示为2,是以词索引从3起头。经过零添补/截断的方式,把每条批评都牢固到150个字。

在能够的情况下,我会尝试利用cudnn的方式来优化RNN(由CUDNN = True开关来控制),由于我们有一个可以轻易下降到CuDNN水平的简单的RNN。例如,对于CNTK,我们利用optimized_rnnstack而不是Recurrence(LSTM())函数。 虽然它不太灵活,可是速度要快很多。

例如,对于CNTK,我们不能再利用类似层归一化的更复杂的变量。在PyTorch中,这是默许启用的。可是对于MXNet,我没法找到这样的RNN函数,而是利用稍慢的Fused RNN函数。

Keras比来刚获得了cudnn的支持,可是只要Tensorflow后端可以利用(而不是CNTK后端)。 Tensorflow有很多RNN变种,其中包括他们自己定制的内核。这里有一个很好的基准,我将尝试更新利用CudnnLSTM的样例而不是当前的方式。

注:CNTK框架是支持静态轴,这意味着我们不需要将输入添补到150个字,便可以按原样输入,可是由于我找不到与其他框架做到这一点的方式,所以我还是采用添补的方式。这样对CNTK框架有点不公允,由于会低估了它的才能。

分类模子建立巨细为(150x125)的嵌入矩阵,然后采用100个门控循环单元,并将终极输出(不是输出序列也不是隐藏状态)作为输出。

ResNet-50(特征提取)揣度性能对照

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106

加载一个预练习好的ResNet50模子并在avg_pooling竣事后酿成(7,7)向量处截断,输出一个2048维的向量。在这里可以插入一个softmax层或别的的分类器,例如用激励树来实现迁移进修。此处,在CPU和GPU上向avg_pool层停止前向传递的时候均计较在内。

我从中学到了什么?

关于CNN

以下供给了一些我在看到github上面提出的题目后比力跨框架的测试正确率时的一些看法。

1、上面的例子(Keras除外),为了便于比力,尝试利用不异级此外API,是以都利用不异的天生器函数。 对于MXNet和CNTK,我尝试了一个更高级此外API,在这里我利用了框架的练习天生器函数。在这个例子中,速度的进步是眇乎小哉的,由于全部数据集都是作为NumPy数组加载到RAM中的,而且在处置的时辰每个迭代的数据都是随机的。我思疑框架的天生器是异步履行随机的。

希奇的是,框架的随机操纵似乎是在一个批次条理上而不是在一个观察条理上停止的,是以会稍微下降测试精度(最少在10个迭代以后)。 对于我们会停止的输入输出活动以及能够在运转中停止预处置和数据增强的情况,自界说的天生器将对性能发生更大的影响。

2、让CuDNN自动调剂/穷举搜索参数(能挑选最有用的CNN算法来牢固图像的巨细)能在性能上带来一个庞大的提升。Chainer,Caffe2,PyTorch和Theano这四个框架都必须手动启动它。CNTK,MXNet和Tensorflow三个框架是默许启用CuDNN的。

贾扬清提到了cudnnGet (默许)和cudnnFind之间性能的提升。但是,其在TitanX GPU上的差别小很多。

现在看来,在K80 +上采用的新的cudnn使其性能差别题目更加突出。由于在方针检测各类图像巨细的组合上运转cudnnFind会出现较大的性能下降,所以穷举搜索算法应当是不能在方针检测的使命上利用了

3、利用Keras时,挑选与后端框架相婚配的[NCHW]排序很重要。CNTK是channels first,我已经在Keras上毛病的设置为channels last。这样就必须在每一个batch上改变它的顺序,同时会形成性能严重的下降。凡是,[NHWC]是大大都框架的默许设备(如Tensorflow),[NCHW]是在NVIDIA GPU上利用cuDNN练习时可以利用的最好顺序。

4、Tensorflow,PyTorch,Caffe2和Theano四个框架都需要一个供给给dropout层的布尔值来指示我们能否练习,由于这对在测试集上的正确率有很大的影响,72 vs 77%。是以,在这类情况下不应当利用Dropout来测试

5、利用Tensorflow框架时需要两个改变:经过启用TF_ENABLE_WINOGRAD_NONFUSED,同时还改变供给给channel first而不是channel last的维度(data_format ='channels_first')。对卷积操纵启用WINOGRAD,自但是然的就将keras酿成改成以TF作为后端。

6、Softmax层凡是与cross_entropy_loss()函数一升引于大部分的功用,你需要检查一下你能否要激活终极的全毗连层,以节省利用两次的时候。

7、分歧框架的内核初始化器能够会有所分歧,而且会对正确性有±1%的影响。我尽能够同一地指定xavier / glorot,而不要太冗杂的内核初始化。

8、为了SGD-momentum中momentum范例的实现,我不能不封闭unit_gain。由于它在CNTK框架上是默许封闭,以此来跟其他框架的实现连结分歧。

9、Caffe2对收集的第一层(no_gradient_to_input = 1)停止了额外的优化,可以经过不计较输入的梯度发生了一个比力小的速度提升。 Tensorflow和MXNet能够已经默许启用了此功用。 计较这个梯度对于研讨和像deep-dream的收集是有用的。

10、在max-pooling以后利用ReLU激活意味着你在削减维度以后才履行一个计较,从而可以削减几秒钟。这可以使采用MXNet框架的运转时候收缩3秒。

11、一些能够有用的额外检查:

  • 能否指定的内核(3)酿成了对称元组(3,3)或1维卷积(3,1)?

  • 步长(最大池化中的)能否是默以为(1,1)或即是内核(Keras这样做的)?

  • 默许添补凡是是off(0,0)或valid,但检查一下它不是on/'same'是很有用的

  • 卷积层上默许的激活能否是'None'或'ReLu'的

  • Bias值的初始化能够不能(偶然是没有bias值)

  • 梯度的下降和无穷大的值或 NaNs的处置能够因框架分歧而分歧

  • 有些框架支持稀疏的标签,而不是one-hot编码范例的(例如我利用的Tensorflow有f.nn.sparse_softmax_cross_entropy_with_logits函数)

  • 数据范例的假定能够是分歧的-例如,我已经试着用float32和int32范例来初始化X和Y。可是在torch中Y需要double范例(是为了可以利用在torch.LongTensor(y).cuda函数中)的数据

  • 假如框架有一个稍微低级一点的API,请确保在测试进程中不要经过设备training= False来计较梯度。

12、听说安装支持python3.5版本的Caffe2有点困难。是以我这里分享了一个剧本

深度进修框架跑分考试(TensorFlow/Caffe/MXNet/Keras/PyTorch)_资讯_2020-4-26 11:43发布_从零开始_106

关于RNN

1、大大都框架(例如Tensorflow)上,都有多个RNN实现/内核; 一旦下降到cudnn LSTM / GRU级别,履行速度是最快的。可是,这类实现不太灵活(例如,能够希望层归一化),而且接下来假如在CPU上运转推理能够会出现题目。

2、在cuDNN这个层面,大部分框架的运转时候是很是类似的。这个Nvidia的博客文章写到过几个风趣的用于循环神经收集cuDNN优化的方式,例如,融合 - “将很多小矩阵的计较连系为大矩阵的计较,并尽能够地对计较停止流式处置,增加与内存I / O计较的比率,从而在GPU上获得更好的性能。”

作者 | Ilia Karmanov

原文地址:https://github.com/ilkarman/DeepLearningFrameworks

鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

引用 时光 2020-4-26 11:45
mark
引用 ai1216152165 2020-4-26 11:44
时间对于深度学习真的如此重要么?或者说真正应用的时候训练都是在后台集群的,速度上的损失应该能接受吧
引用 feixiang 2020-4-26 11:43
mxnet.io  快封神了[捂脸]

查看全部评论(3)

相关分类

点击排行
  • 联系我们
  • 邮箱:admin@c0ks.com(请把#改成@)
  • 电话:18530790808
  • QQ客服 1031180668
  • 工作时间:周一至周五(早上9点至下午5点)
  • 微信二维码

  • 扫描访问手机版

Archiver|手机版|小黑屋|从零开始

GMT+8, 2020-6-5 04:24 , Processed in 0.173683 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

  • QQ: 1031180668

    客服电话

    18530790808

    电子邮件

    admin@c0ks.com

    在线时间:8:00-16:00