微软打造深度学习开源框架“自动翻译机”:不同框架轻松切换

【新智元导读】微软Cortana智能和机器学习小组的数据科学家最新在Giuhub开源项目,对各个深度学习框架进行了基准测试,提供了很多有参考价值的数据以及GPU优化代码。众多的深度学习框架,就像世界上各种不同的语言一样,但是,不会“外语”并不可怕,他们希望构建一个深度学习框架的罗塞塔石碑,让开发人员和研究者能在这个众多框架并存的环境中,好好生存。

新智元编译

来源:blogs.technet.microsoft.com

作者:lia Karmanov, Mathew Salvaris, Miguel Fierro, Danielle Dean

翻译:小潘同学

微软打造深度学习开源框架“自动翻译机”:不同框架轻松切换

我们相信深度学习框架和语言一样:当然,很多人会说英语,但每种语言都有自己存在的目的。我们已经为几个不同的网络结构创建了通用代码,并可以基于不同的框架执行。我们想创建一个深度学习框架的“罗塞塔石碑”,如果你很了解现有的一个框架,这就可以帮助你学会其他的任何一个框架。可能出现的情况是,一篇论文发布的代码在另一个框架下,或者整个pipeline都使用了另一种编程语言。这时候,与其用你最喜欢的框架从头开始编写一个模型,不如直接使用那个你不熟悉的语言。

我们想要感谢CNTK、Pytorch、Chainer、Caffe2和Knet团队,以及过去几个月为repo做出贡献的开源社区内的其他人。

总而言之,我们的目标是创造:

一个深度学习框架的“罗塞塔石碑”,帮助数据处理的科学家可以轻松地利用他们的专业知识在框架之间进行随意切换

最新最高级别的API优化GPU代码

一种常见的方法,用于在GPU之间进行比较

一种用于比较不同编程语言的普遍结构(Python、Julia、R)

程序可以对自己安装系统的性能进行预判

不同的开源社区之间的进行协作

常见深度学习框架基准测试:图像识别、特征提取、情感分析

在接下来几个小节中,我们回顾了一种CNN模型的训练时间,在一个预训练的ResNet50模型上进行特征提取,以及一种RNN模型的训练时间。

识别时间:在CIFAR-10图像数据库上训练 CNN(VGG-style,32bit)进行图像识别

模型输入是标准的CIFAR-10 数据集,包含10KB的训练数据和10KB的测试数据图像,这些图像均匀分布在10个类别中。一个32x32的图像被表示为一个(3,32,32)的张量, 0-255的像素值被映射到0-1上进行表示(见下图表1):

微软打造深度学习开源框架“自动翻译机”:不同框架轻松切换

特征提取:ResNet-50数据集上1000幅图片的平均处理时间

一个预训练的ResNet-50模型是在7x7大小的avg_pooling层中加载和处理,并输出一个2048D维的向量。这个向量可以被嵌入到一个softmax层或者其他的分类器中,如用于迁移学习的增强树。这个向avg_pooling层的传递是正向计时的。值得注意的是:批处理的大小要保持不变,但是在GPU上填满RAM将会提高性能(见表2):

微软打造深度学习开源框架“自动翻译机”:不同框架轻松切换

训练时间:在IMDB上的RNN(GPU)进行情感分析

这个模型的输入是标准的IMDB电影评论集,包含25 KB的训练数据和25 KB的测试数据,全部分为正负2个类。处理过程遵循Keras的方法,将start-character设置为1,out-of-vocab表示为2,其中vocab的大小是30KB。因此word-index从3开始。每循环一次,Zero-padded/truncated到固定轴是150个单词(表3):

微软打造深度学习开源框架“自动翻译机”:不同框架轻松切换

我们从中学到了什么?

自动调整:大多数框架使用cuDNN中的语句:cudnnFindConvolutionForwardAlgorithm() 来运行一个全方面的搜索和优化算法,用于前在固定大小的图像进行前向卷积。通常这是默认的,但一些框架可能需要一个标记,如“torch.backends.cudnn.benchmark= True”。

尽可能多地使用cuDNN:对于普通RNN模型(如基本的GRU或者LSTM),通常可以调用一个cuDNN wrapper来提高速度,例如用cudnnrnn.CudnnGRU()来代替rnn.GRUCell()。但这中应用的缺点是,对CPU延迟的运行中断的要求更高。

形状匹配:当在cuDNN上运行时,为CNN匹配NCHW,以及为RNNs匹配TNC的本地通道顺序,这样可以减少重构上的时间浪费,并可以直接获得矩阵乘的结果。

本机生成器:使用框架的本机生成器,在这种情况下,扩展甚至预处理都是通过线程异步执行的,这可以提高速度。

为了进行推理,确保在可能的情况下指定标记,从而节省不必要的渐变,并确保正确地应用了批处理和退出等层级结构。

当我们最初创建repo时,我们使用了许多小技巧来确保框架之间可以使用相同的模型,而且它是用最理想的方式完成的。令人难以置信的是,这些框架在过去的几个月里发展得如此之快。因为框架的更新,2017年末获得的用于进行最优化的初始经验已经过时了。

例如,具有TF后端的Keras有一个被称为channels-last的通道顺序的硬编码,尽管这种编码顺序对于cuDNN来说不是最优的,因此指定的channle-first原则意味着它会在每次的批处理后进行重新调整,并极大地降低训练速度。现在,拥有TF后端的Keras支持原始的channels-first原则。在以前,Tensorflow可以通过一个指定标记,通过使用Winograd算法来进行卷积,进而加快算法速度,但现在这种方法已经没有太大的帮助了。为了好玩,可以查看一下早期版本的“repo”的一些初步知识。

通过在不同的框架中完成end-to-end的方案,可以用几种不同的方法来对这些框架进行比较。由于每个框架都使用相同的模型体系结构和数据,所以在框架中准确性是极其相似的(实际上,这是我们测试代码的一种方法,以确保相同的模型可以进行跨框架的使用)而且,这些Notebook的开发目的是为了比较各个框架,并非是在速度上一较高下。

当然,很容易利用速度和推理时间等指标对不同的框架进行比较,但这不是为了显示任何关于框架的总体性能,因为这忽略了对一些重要的因素进行比较,如:帮助和支持,预训练模型的可用性、自定义层和架构,数据加载器,调试,不同的平台支持,分布式训练等等。我们比较的指标只是为了对不同的框架上创建的相同网络进行比较,以及在一些具体例子上体现出的性能。

深度学习框架的自动翻译机

在社区中有许多流行的深度学习框架,这可以帮助人工智能开发人员和数据科学家利用不同深度学习。与之相关的一个工作是开放神经网络交换(ONNX),这是在框架之间转移深度学习模型的开源代码的一个标准。当基于一个框架进行开发而基于另一个框架进行模型转换是,ONNX是非常有用的。类似地,MMdnn是一组工具,帮助用户在不同的框架之间进行直接转换并可视化模型的体系结构。

像ONNX和MMdnn这样的工具,类似于深度学习框架的自动机器翻译机。相比之下,我们今天发布的repo1.0版本就像深度学习框架的罗塞塔石碑,展示了不同框架下模型的构建过程。所有的努力,让深度学习开发者和研究人员在一个有多种编程语言的环境中生存。

我们这次repo对应的1.0版本的开源代码可以在Github上找到,网址是https://github.com/ilkarman/DeepLearningFrameworks

原文地址:

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

相关推荐