人工智能教程002:主流的人工智能开源框架

人工智能也称为深度学习。目前开源的主流深度学习的框架有:

1、TensorFlow

官方网址:https://www.tensorflow.org

       TensorFlow是谷歌开源的深度学习框架。是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写C++或CUDA代码。它和Theano一样都支持自动求导,用户不需要再通过反向传播求解梯度。其核心代码和Caffe一样是用C++编写的,使用C++简化了线上部署的复杂度,并让手机这种内存和CPU资源都紧张的设备可以运行复杂模型(Python则会比较消耗资源,并且执行效率不高)。除了核心代码的C++接口,TensorFlow还有官方的Python、Go和Java接口。

2、Caffe
官方网址:caffe.berkeleyvision.org/ 
GitHub:github.com/BVLC/caffe

       Caffe全称为Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在TensorFlow出现之前一直是深度学习领域GitHub star最多的项目),目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。Caffe的创始人是加州大学伯克利的Ph.D.贾扬清,他同时也是TensorFlow的作者之一,曾工作于MSRA、NEC和Google Brain,目前就职于Facebook FAIR实验室。Caffe的主要优势包括如下几点。

    容易上手,网络结构都是以配置文件形式定义,不需要用代码设计网络。
    训练速度快,能够训练state-of-the-art的模型与大规模的数据。
    组件模块化,可以方便地拓展到新的模型和学习任务上。
    Caffe的一大优势是拥有大量的训练好的经典模型(AlexNet、VGG、Inception)乃至其他state-of-the-art(ResNet等)的模型,收藏在它的Model Zoo(github.com/BVLC/ caffe/wiki/Model-Zoo)。因为知名度较高,Caffe被广泛地应用于前沿的工业界和学术界,许多提供源码的深度学习的论文都是使用Caffe来实现其模型的。在计算机视觉领域Caffe应用尤其多,可以用来做人脸识别、图片分类、位置检测、目标追踪等。虽然Caffe主要是面向学术圈和研究者的,但它的程序运行非常稳定,代码质量比较高,所以也很适合对稳定性要求严格的生产环境,可以算是第一个主流的工业级深度学习框架。因为Caffe的底层是基于C++的,因此可以在各种硬件环境编译并具有良好的移植性,支持Linux、Mac和Windows系统,也可以编译部署到移动设备系统如Android和iOS上。和其他主流深度学习库类似,Caffe也提供了Python语言接口pycaffe,在接触新任务,设计新网络时可以使用其Python接口简化操作。

3、Theano
官方网址:http://www.deeplearning.net/software/theano/ 
GitHub:github.com/Theano/Theano

    Theano诞生于2008年,由蒙特利尔大学Lisa Lab团队开发并维护,是一个高性能的符号计算及深度学习库。因其出现时间早,可以算是这类库的始祖之一,也一度被认为是深度学习研究和应用的重要标准之一。Theano的核心是一个数学表达式的编译器,专门为处理大规模神经网络训练的计算而设计。

    集成NumPy,可以直接使用NumPy的ndarray,API接口学习成本低。
    计算稳定性好,比如可以精准地计算输出值很小的函数(像log(1+x))。
    动态地生成C或者CUDA代码,用以编译成高效的机器代码。
    因为Theano非常流行,有许多人为它编写了高质量的文档和教程,用户可以方便地查找Theano的各种FAQ,比如如何保存模型、如何运行模型等。不过Theano更多地被当作一个研究工具,而不是当作产品来使用。虽然Theano支持Linux、Mac和Windows,但是没有底层C++的接口,因此模型的部署非常不方便,依赖于各种Python库,并且不支持各种移动设备,所以几乎没有在工业生产环境的应用。Theano在调试时输出的错误信息非常难以看懂,因此DEBUG时非常痛苦。同时,Theano在生产环境使用训练好的模型进行预测时性能比较差,因为预测通常使用服务器CPU(生产环境服务器一般没有GPU,而且GPU预测单条样本延迟高反而不如CPU),但是Theano在CPU上的执行性能比较差。

    Theano在单GPU上执行效率不错,性能和其他框架类似。但是运算时需要将用户的Python代码转换成CUDA代码,再编译为二进制可执行文件,编译复杂模型的时间非常久。此外,Theano在导入时也比较慢,而且一旦设定了选择某块GPU,就无法切换到其他设备。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano自己的gpuarray库上支持多GPU训练,速度暂时还比不上CUDA的版本,并且Theano目前还没有分布式的实现。不过,Theano在训练简单网络(比如很浅的MLP)时性能可能比TensorFlow好,因为全部代码都是运行时编译,不需要像TensorFlow那样每次feed mini-batch数据时都得通过低效的Python循环来实现。

    Theano是一个完全基于Python(C++/CUDA代码也是打包为Python字符串)的符号计算库。用户定义的各种运算,Theano可以自动求导,省去了完全手工写神经网络反向传播算法的麻烦,也不需要像Caffe一样为Layer写C++或CUDA代码。Theano对卷积神经网络的支持很好,同时它的符号计算API支持循环控制(内部名scan),让RNN的实现非常简单并且高性能,其全面的功能也让Theano可以支持大部分state-of-the-art的网络。Theano派生出了大量基于它的深度学习库,包括一系列的上层封装,其中有大名鼎鼎的Keras,Keras对神经网络抽象得非常合适,以至于可以随意切换执行计算的后端(目前同时支持Theano和TensorFlow)。Keras比较适合在探索阶段快速地尝试各种网络结构,组件都是可插拔的模块,只需要将一个个组件(比如卷积层、激活函数等)连接起来,但是设计新模块或者新的Layer就不太方便了.

4、Torch
官方网址:http://torch.ch/ 
GitHub:github.com/torch/torch7

       Torch给自己的定位是LuaJIT上的一个高效的科学计算库,支持大量的机器学习算法,同时以GPU上的计算优先。Torch的历史非常悠久,但真正得到发扬光大是在Facebook开源了其深度学习的组件之后,此后包括Google、Twitter、NYU、IDIAP、Purdue等组织都大量使用Torch。Torch的目标是让设计科学计算算法变得便捷,它包含了大量的机器学习、计算机视觉、信号处理、并行运算、图像、视频、音频、网络处理的库,同时和Caffe类似,Torch拥有大量的训练好的深度学习模型。它可以支持设计非常复杂的神经网络的拓扑图结构,再并行化到CPU和GPU上,在Torch上设计新的Layer是相对简单的。它和TensorFlow一样使用了底层C++加上层脚本语言调用的方式,只不过Torch使用的是Lua。Lua的性能是非常优秀的(该语言经常被用来开发游戏),常见的代码可以通过透明的JIT优化达到C的性能的80%;在便利性上,Lua的语法也非常简单易读,拥有漂亮和统一的结构,易于掌握,比写C/C++简洁很多;同时,Lua拥有一个非常直接的调用C程序的接口,可以简便地使用大量基于C的库,因为底层核心是C写的,因此也可以方便地移植到各种环境。Lua支持Linux、Mac,还支持各种嵌入式系统(iOS、Android、FPGA等),只不过运行时还是必须有LuaJIT的环境,所以工业生产环境的使用相对较少,没有Caffe和TensorFlow那么多。

不过,Lua相比Python还不是那么主流,对大多数用户有学习成本。

5、Lasagne
官网网址:http://lasagne.readthedocs.io/ 
GitHub:github.com/Lasagne/Lasagne

Lasagne是一个基于Theano的轻量级的神经网络库。它支持前馈神经网络,比如卷积网络、循环神经网络、LSTM等,以及它们的组合;支持许多优化方法,比如Nesterov momentum、RMSprop、ADAM等;它是Theano的上层封装,但又不像Keras那样进行了重度的封装,Keras隐藏了Theano中所有的方法和对象,而Lasagne则是借用了Theano中很多的类,算是介于基础的Theano和高度抽象的Keras之间的一个轻度封装,简化了操作同时支持比较底层的操作。Lasagne设计的六个原则是简洁、透明、模块化、实用、聚焦和专注。

6、Keras
官方网址:keras.io 
GitHub:github.com/fchollet/keras

    Keras是一个崇尚极简、高度模块化的神经网络库,使用Python实现,并可以同时运行在TensorFlow和Theano上。它旨在让用户进行最快速的原型实验,让想法变为结果的这个过程最短。Theano和TensorFlow的计算图支持更通用的计算,而Keras则专精于深度学习。在Keras中,只需要几行代码就能实现一个MLP,或者十几行代码实现一个AlexNet,这在其他深度学习框架中基本是不可能完成的任务。Keras最大的问题可能是目前无法直接使用多GPU,所以对大规模的数据处理速度没有其他支持多GPU和分布式的框架快。Keras的编程模型设计和Torch很像,但是相比Torch,Keras构建在Python上,有一套完整的科学计算工具链,而Torch的编程语言Lua并没有这样一条科学计算工具链。无论从社区人数,还是活跃度来看,Keras目前的增长速度都已经远远超过了Torch。

7、MXNet
官网网址:mxnet.io 
GitHub:github.com/dmlc/mxnet

MXNet是DMLC(Distributed Machine Learning Community)开发的一款开源的、轻量级、可移植的、灵活的深度学习库,它让用户可以混合使用符号编程模式和指令式编程模式来最大化效率和灵活性,目前已经是AWS官方推荐的深度学习框架。MXNet的很多作者都是中国人,其最大的贡献组织为百度,同时很多作者来自cxxnet、minerva和purine2等深度学习项目,可谓博采众家之长。它是各个框架中率先支持多GPU和分布式的,同时其分布式性能也非常高。MXNet的核心是一个动态的依赖调度器,支持自动将计算任务并行化到多个GPU或分布式集群(支持AWS、Azure、Yarn等)。它上层的计算图优化算法可以让符号计算执行得非常快,而且节约内存,开启mirror模式会更加省内存,甚至可以在某些小内存GPU上训练其他框架因显存不够而训练不了的深度学习模型,也可以在移动设备(Android、iOS)上运行基于深度学习的图像识别等任务。此外,MXNet的一个很大的优点是支持非常多的语言封装,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可谓非常全面,基本主流的脚本语言全部都支持了。


8、DIGITS
官方网址:developer.nvidia.com/digits 
GitHub: github.com/NVIDIA/DIGITS

DIGITS(Deep Learning GPU Training System)不是一个标准的深度学习库,它可以算是一个Caffe的高级封装(或者Caffe的Web版培训系统)。因为封装得非常重,以至于你不需要(也不能)在DIGITS中写代码,即可实现一个深度学习的图片识别模型。在Caffe中,定义模型结构、预处理数据、进行训练并监控训练过程是相对比较烦琐的,DIGITS把所有这些操作都简化为在浏览器中执行。它可以算作Caffe在图片分类上的一个漂亮的用户可视化界面(GUI),计算机视觉的研究者或者工程师可以非常方便地设计深度学习模型、测试准确率,以及调试各种超参数。同时使用它也可以生成数据和训练结果的可视化统计报表,甚至是网络的可视化结构图。训练好的Caffe模型可以被DIGITS直接使用,上传图片到服务器或者输入url即可对图片进行分类。

9、CNTK
官方网址:cntk.ai 
GitHub:github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微软研究院(MSR)开源的深度学习框架。它最早由start the deep learning craze的演讲人创建,目前已经发展成一个通用的、跨平台的深度学习系统,在语音识别领域的使用尤其广泛。CNTK通过一个有向图将神经网络描述为一系列的运算操作,这个有向图中子节点代表输入或网络参数,其他节点代表各种矩阵运算。CNTK支持各种前馈网络,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自动求解梯度。CNTK有丰富的细粒度的神经网络组件,使得用户不需要写底层的C++或CUDA,就能通过组合这些组件设计新的复杂的Layer。CNTK拥有产品级的代码质量,支持多机、多GPU的分布式训练。

CNTK在CPU、单GPU、多GPU,以及GPU集群上都有非常优异的表现。CNTK与Caffe一样也基于C++并且跨平台,大部分情况下,它的部署非常简单。PC上支持Linux、Mac和Windows,但是它目前不支持ARM架构,限制了其在移动设备上的发挥。图2-7所示为CNTK目前的总体架构图。

10、Deeplearning4J
官方网址:http://deeplearning4j.org/ 
GitHub: github.com/deeplearning4j/deeplearning4j

    Deeplearning4J(简称DL4J)是一个基于Java和Scala的开源的分布式深度学习库,由Skymind于2014年6月发布,其核心目标是创建一个即插即用的解决方案原型。埃森哲、雪弗兰、博斯咨询和IBM等都是DL4J的客户。DL4J拥有一个多用途的n-dimensional array的类,可以方便地对数据进行各种操作;拥有多种后端计算核心,用以支持CPU及GPU加速,在图像识别等训练任务上的性能与Caffe相当。

11、Chainer
官方网址:chainer.org 
GitHub:github.com/pfnet/chainer

    Chainer是由日本公司Preferred Networks于2015年6月发布的深度学习框架。Chainer对自己的特性描述如下。

Powerful:支持CUDA计算,只需要几行代码就可以使用GPU加速,同时只需少许改动就可以运行在多GPU上。
Flexible:支持多种前馈神经网络,包括卷积网络、循环网络、递归网络,支持运行中动态定义的网络(Define-by-Run)。
Intuitive:前馈计算可以引入Python的各种控制流,同时反向传播时不受干扰,简化了调试错误的难度。
绝大多数的深度学习框架是基于“Define-and-Run”的,也就是说,需要首先定义一个网络,再向网络中feed数据(mini-batch)。因为网络是预先静态定义的,所有的控制逻辑都需要以data的形式插入网络中,包括像Caffe那样定义好网络结构文件,或者像Theano、Torch、TensorFlow等使用编程语言定义网络。而Chainer则相反,网络是在实际运行中定义的,Chainer存储历史运行的计算结果,而不是网络的结构逻辑,这样就可以方便地使用Python中的控制流,所以无须其他工作就可以直接在网络中使用条件控制和循环。

12、Leaf
官方网址:autumnai.com/leaf/book 
GitHub:github.com/autumnai/leaf

Leaf是一个基于Rust语言的直观的跨平台的深度学习乃至机器智能框架,它拥有一个清晰的架构,除了同属Autumn AI的底层计算库Collenchyma,Leaf没有其他依赖库。它易于维护和使用,并且拥有非常高的性能。Leaf自身宣传的特点是为Hackers定制的,这里的Hackers是指希望用最短的时间和最少的精力实现机器学习算法的技术极客。它的可移植性非常好,可以运行在CPU、GPU和FPGA等设备上,可以支持有任何操作系统的PC、服务器,甚至是没有操作系统的嵌入式设备,并且同时支持OpenCL和CUDA。Leaf是Autumn AI计划的一个重要组件,后者的目标是让人工智能算法的效率提高100倍。凭借其优秀的设计,Leaf可以用来创建各种独立的模块,比如深度强化学习、可视化监控、网络部署、自动化预处理和大规模产品部署等。

Leaf拥有最简单的API,希望可以最简化用户需要掌握的技术栈。虽然才刚诞生不久,Leaf就已经跻身最快的深度学习框架之一了。图2-9所示为Leaf官网公布的各个框架在单GPU上训练VGG网络的计算时间(越小越好)的对比(这是和早期的TensorFlow对比,最新版的TensorFlow性能已经非常好了)。

13、DSSTNE
GitHub:github.com/amznlabs/amazon-dsstne 

DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亚马逊开源的稀疏神经网络框架,在训练非常稀疏的数据时具有很大的优势。DSSTNE目前只支持全连接的神经网络,不支持卷积网络等。和Caffe类似,它也是通过写一个JSON类型的文件定义模型结构,但是支持非常大的Layer(输入和输出节点都非常多);在DSSTNE官方公布的测试中,DSSTNE在MovieLens的稀疏数据上,在单M40 GPU上取得了比TensorFlow快14.8倍的性能提升(注意是和老版的TensorFlow比较)。一方面是因为DSSTNE对稀疏数据的优化;另一方面是TensorFlow在数据传输到GPU上时花费了大量时间,而DSSTNE则优化了数据在GPU内的保留;同时DSSTNE还拥有自动模型并行功能,而TensorFlow中则需要手动优化,没有自动支持。

最后,虽然排名较低,但是还是介绍一下百度的深度学习框架:PaddlePaddle。毕竟是国产的。

官网:http://ai.baidu.com/paddlepaddle

PaddlePaddle,百度旗下深度学习开源平台。Paddle(Parallel Distributed Deep Learning,并行分布式深度学习)。
2016年9月27日,百度宣布其全新的深度学习开源平台PaddlePaddle在开源社区Github及百度大脑平台开放,供广大开发者下载使用。
百度成为继Google、Facebook、IBM后另一个将人工智能技术开源的科技巨头,同时也是国内首个开源深度学习平台的科技公司。
PaddlePaddle的前身是百度于2013年自主研发的深度学习平台,且一直为百度内部工程师研发使用。全球各大科技巨头开源的深度学习平台都极具各自技术特点,对于百度,由于其自身在搜索、图像识别、语音语义识别理解、情感分析、机器翻译、用户画像推荐等多领域的业务和技术方向,PaddlePaddle则表现更加全面,是一个相对全功能的深度学习框架。

猜你喜欢

转载自my.oschina.net/weidongpei/blog/1814335