TensorFlow、Keras、CNTK……到底哪种深度学习框架更好用?

作者 | 微软 Cortana AI 和 ML 团队

译者 | Debra

编辑 | Emily

AI 前线导读:社区里流行的深度学习框架不少,但是 TensorFlow、Julia、CNTK... 到底哪种使用起来既方便又高效呢?微软的 CortanaAI 和 ML 团队对几种主流的深度学习框架进行了比较,并在 GitHub 上开放了测试结果。那么,测试的结果如何呢?更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)

repo 1.0 GitHub 地址:

https://github.com/ilkarman/DeepLearningFrameworks

我们认为深度学习框架就像语言一样:当然,英语被很多人使用,但每种语言都有各自的用处。我们为几种不同的框架创建了通用的代码,并在许多不同的框架中使用这些语言。我们的想法,是创建一类似外语学习软件 Rosetta Stone 的深度学习框架,让人们自如地使用不同框架。当关于一种全新的框架代码或语言论文发表时,就会出现问题,与其在你最喜欢的框架中从头开始编写模型,倒不如使用“外来”语言来得更容易。

在此,我们感谢 CNTK、Pytorch、Chainer、Caffe2 和 Knet 团队,以及来自开源社区的所有朋友在过去几个月为这个 repo 做出的贡献。

总之,我们发布这个 repo 的目的在于创建:

一个深度学习框架的“Rosetta Stone”,它可以让数据科学家轻松地将他们的专业知识应用到不同的框架中。

一套使用最新的最高级 API 优化过的 GPU 代码。

一个对不同 GPU 进行比较的常见设置(可能为 CUDA 版本和精度)。

对不同语言进行比较的常用设置(Python、Julia、R)。

验证自己所用框架的预期性能的可能。

不同开源社区之间的合作。

深度学习框架测试结果

在下面的章节中,我们将回顾一下每种 CNN 模型的训练时间,经过预训练的 ResNet50 模型的特征提取,以及每种 RNN 模型的训练时间测试结果。我们的实验在使用 K80 和更新的 P100 的 Azure 深度学习虚拟机上进行。

训练时间(单位为秒):用 CIFAR-10 训练 CNN(VGG 式,32 位)——图像识别

该模型的输入是包含 5 万个训练图像和 1 万个测试图像的标准 CIFAR-10 数据集,被均匀地分成 10 个类。每张 32×32 图像被设为张量(3,32,32),像素强度从 0-255 重新定为 0-1。

Caffe2:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Caffe2_Inference.ipynb

Chainer:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Chainer_Inference.ipynb

CNTK:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/CNTK_Inference.ipynb

Keras(CNTK):https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_CNTK_Inference.ipynb

Keras(TF):https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Keras_TF_Inference.ipynb

Tensorflow:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Tensorflow_Inference.ipynb

MXNet:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/MXNet_Inference.ipynb

PyTorch :https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/PyTorch_Inference.ipynb

Julia –Knet:https://github.com/ilkarman/DeepLearningFrameworks/blob/master/notebooks/Knet_Inference.ipynb

1000 张图像的平均测试时间(单位为秒):ResNet-50——特征提取

当 avg 池化在(7,7)结束之后加载并截断一个预先训练好的 ResNet50 模型,输出一个 2048D 维向量。在这里可以插入 softmax 层或其他分类器(如提升树)以进行迁移学习。考虑到热启动的因素,这个仅向前传递给 avg_pool 层的时间是定时的。

注意:批量大小保持不变,但是在 GPU 上填充 RAM 会进一步提高性能(优于具有更多内存的 GPU)。

训练时间(单位为秒):IMDB 上的 RNN(GRU) ——情感分析

该模型的输入是标准的 IMDB 电影评论数据集,其中包含 25000 个训练评论和 25000 个测试评论,统一分为 2 个类别(正例 / 负例)。使用 Keras 的方法,其中起始字符被设置为 1,词汇外(使用 30k 的词汇大小)被表示为 2,词索引从 3 开始。每个评论零填充 / 截断到 150 字。

* 表示未进行实验。

经验教训

使用自动调整(auto-tune):大多数框架使用 cuDNN cudnnFindConvolutionForwardAlgorithm() 进行穷举搜索,并优化用于固定尺寸图像上卷积正向传播的算法,通常这个选项是默认启用的,但是一些框架可能需要手动标记,如 torch.backends.cudnn.benchmark=True 等标识。

尽可能多使用 cuDNN:对于 vanilla RNNs(例如 GRU/LSTM)通常可以调用 cuDNN wrapper(https://devblogs.nvidia.com/optimizing-recurrent-neural-networks-cudnn-5/)提高速度,例如,cudnn_rnn.CudnnGRU() 而不是 rnn.GRUCell()。但是这种方法的缺点是这会让后期在 CPU 上进行推理变得更难。

Match shapes:在 cuDNN 上运行时,匹配 NCHW 的 CNNs 和 TNC 的 RNNs 通道顺序会缩短调整时间,且用户可以直接进行矩阵乘法。

本地生成器(Native generators):使用框架的本地生成器,通过线性进行异步增强甚至预处理(例如混排,shuffling),从而提高速度。

在推理阶段,请确保在可能保存不必要梯度计算的地方做标记,并确保 batch-norm 和 dropout 层得到正确应用。

最初,我们创建此 repo 时必须使用许多小技巧和窍门来确保在框架之间使用的是一样的模型,并且是以最优方式完成的。然而,过去几个月内,这些框架以令人难以置信的速度发展,很多都已经更新了,因此我们许多在 2017 年得出的优化方法现如今已经过时。

例如,带有 TF 后端的 Keras 通道排序硬编码为 channels-last(对于 cuDNN 非最佳),因此指定优先通道意味着它会在每批次(硬编码值)处理后重新进行调整,从而大大减缓训练速度。现在,支持 TF 的 Keras 已经允许本地通道优先。我们可以通过指定一个标志使用 Winograd 算法进行卷积来加速 Tensorflow,但这样的方法已经不起作用了。有兴趣的话可以查看我们早期的 repo 得出的结论。

通过在不同框架中完成端到端解决方案,可以用多种方式对不同框架进行比较。由于每个框架都使用相同的模型体系结构和数据,因此所有框架的准确性相差无几(实际上,这是我们测试代码的一种方式,以确保不同框架使用相同的模型!)另外,notebook 的开发方式让我们可以轻松地对不同框架进行比较,而不一定在速度方面。

当然,虽然我们很容易从速度、推理时间等维度对不同的框架进行比较,但结果并不意味着框架的整体性能有任何问题,因为这种方法省略了重要维度之间的比较,例如:帮助和支持、预先训练模型的可用性、自定义图层和架构、数据加载器、调试、支持的不同平台、分布式训练等!这种方法仅展示了如何在不同的框架中创建相同的网络,以及示例中框架的性能。

深度学习框架的“旅伴”

在社区中有很多流行的深度学习框架,它们帮助 AI 开发人员和数据科学家在各种情况下使用不同的深度学习框架解决问题。其中,开源的 Open Neural Network Exchange (ONNX,https://github.com/onnx/onnx)成为在不同框架之间应用深度学习模型互操作性的标准。例如,当你使用某一个框架进行模型开发,却需要在另一个框架中评估这个模型时,ONNX 就会很有用。同样,MMdnn (https://github.com/Microsoft/MMdnn)作为一组工具,可帮助用户直接在不同框架之间进行转换,并对模型体系结构进行可视化处理。

ONNX 和 MMdnn 等深度学习框架的“旅伴”就像一台自动机器翻译机。相比之下,我们今天发布的完整 1.0 版 repo 就像一个深度学习框架的 Rosetta Stone,展示了在不同框架之间构建模型的全过程。众人拾柴火焰高,所有人的努力结合起来,就能使所有深度学习开发者能够在多语言环境中更好地”畅游“。

https://blogs.technet.microsoft.com/machinelearning/2018/03/14/comparing-deep-learning-frameworks-a-rosetta-stone-approach/

AI前线

紧跟前沿的AI技术社群

想看更多这类文章, 请给我们点个赞吧!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180317G13NVJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券