mt7620a固件大合集n路由器固件3.5M的固件也能用,8M的固件也能用,3.5M的功能少,我主要要无线中继

966,690 五月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
解秘:百度PaddlePaddle深度学习框架和搜索引擎基础架构
解秘:百度PaddlePaddle深度学习框架和搜索引擎基础架构
日. 估计阅读时间:
不到一分钟
Author Contacted
相关厂商内容
相关赞助商
全球技术领导力峰会日-7月1日,上海&宝华万豪酒店,
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。【重磅】百度开源分布式深度学习平台,挑战TensorFlow (教程)
1 新智元编译1&#xA0;来源:Github,Hacker News,paddlepaddle.org&#xA0;译者:胡祥杰【新智元导读】今天百度开源深度学习平台Paddle。业内人士纷纷点赞:Paddle代码简洁、设计干净,没有太多的abstraction,速度比Tensorflow、Theano快,显存占用小,可多机多卡并行,支持CPU和GPU、文档比较全……Hacker News有评论,在不支持TensorFlow的中国,百度的Paddle或有机会获胜。百度一直说自己深耕深度学习,其技术水平如何,本次开源或可提供一些线索。百度深度学习 PaddlePaddle&#xA0;(Parallel Distributed Deep Learning)是一个云端托管的分布式深度学习平台,对于序列输入、稀疏输入和大规模数据的模型训练有着良好的支持,支持GPU运算,支持数据并行和模型并行,仅需少量代码就能训练深度学习模型,大大降低了用户使用深度学习技术的成本。根据百度官方网站的介绍,Paddle 有以下优势:Github 上介绍,PaddlePaddle有以下特点:灵活PaddlePaddle支持大量的神经网络架构和优化算法。很容易安装复杂的模型,比如拥有注意力(attention)机制或者复杂记忆连接的神经机器翻译模型。高效为了利用异构计算资源的能力,PaddlePaddle中的每一级都会进行优化,其中包括计算、内存、架构和通信。以下 是几个例子:通过SSE/AVX 内联函数、BLAS数据库(例如MKL,ATLAS,cuBLAS)或者定制化的CPU/GPU 核优化数字。高度优化的递归网络,在没有padding 的情况下,也能处理不同长度的序列。对拥有高维稀疏数据的模型进行局部优化和分布式训练。可扩展有了PaddlePaddle,使用多个CPU和GPU以及机器来加速训练可以变得很轻松。 PaddlePaddle 能通过优化通信,获得高吞吐量和性能。与产品的连接&#xA0;PaddlePaddle的部署也很简单。在百度,PaddlePaddle 已经被用于产品和服务中,拥有大量用户。应用场景包括广告点击率(CTR)预测、大规模图像分类、光学字符识别、搜索排名、计算机病毒检测、推荐等等。PaddlePaddle 在百度有着巨大的影响。PaddlePaddle地址:Github: 官方:(中文)评价 :贾扬清在知乎上的技术点评Facebook 深度学习研究员贾扬清在知乎上评价说:今天刚看到的,简单说一些第一印象(以目前的github repo为准)。整体的设计感觉和Caffe心有灵犀,同时解决了Caffe早期设计当中的一些问题(比如说default stream)。1. 很高质量的GPU代码2. 非常好的RNN设计3. 设计很干净,没有太多的abstraction,这一点比TensorFlow好很多。4. 高速RDMA的部分貌似没有开源(可能是因为RDMA对于cluster design有一定要求):5. 设计思路比较像第一代的DL框架,不过考虑到paddle已经有年头了,这样设计还是有历史原因的。 &#xA0; &#xA0;5.1 config是hard-code的protobuf message,这对扩展性可能会有影响。&#xA0; &#xA0; 5.2 可以看到很多有意思的类似历史遗留的设计:采用了STREAM_DEFAULT macro,然后通过TLS的方式定向到非default stream:Paddle/hl_base.h at 4fe7d833cf0dd952bfa8af8d5d7772bbcd552c58 &#xB7; baidu/Paddle &#xB7; GitHub&#xA0;(所以Paddle off-the-shelf不支持mac?)&#xA0; &#xA0; 5.3 在梯度计算上采用了传统的粗粒度forward/backward设计(类似Caffe)。可能有人会说“所以paddle没有auto gradient generation”,这是不对的,autograd的存在与否和op的粒度粗细无关。事实上,TensorFlow在意识到细粒度operator超级慢的速度以后,也在逐渐转回粗粒度的operator上。目前只看到这里。总之是一个非常solid的框架,百度的开发功底还是不错的。影响力评价 :&#xA0; Hack News的评论cs702: 又一个深度学习框架,这次来自百度。鉴于TensorFlow在AI研究者和实践者中的统治力逐渐增强,加上拥有大量使用基础的既有框架,比如Theano,Torch和Caffe,我并不认为这一新的框架在美国或者其他西方的市场会获得大范围的采用。在我看来,TensorFlow的势力在当下很难战胜。但是,Paddle在中国可能会获得大范围的采用,因为那是百度的母国市场。Vonnik:使用TensorFlow的大部分都是来自Udacity 课程的学生。所以,“Tensor Flow崛起” 这这种说法并不正确,这些人中95%都是没用什么经验的,更不用说在实际产品中应用了。从技术层面上来说,TensorFlow并没有比其他的框架好很多。它有一个很漂亮的网站,有几个教学视频,但是它性能并不是很好,比如,在大型产品的环境中。深度学习平台实际上变化得非常快:TensorFlow、CNTK、DSSTNE等等,都是过去10个月间出现的。所以说,Paddle 还是有机会的,尤其是在中国,因为那里的人不能使用谷歌云——那是TensorFlow最佳的训练平台。HackerNews上,曾有一个关于最受欢迎的深度学习工具的投票,时间范围是7月15日到8月15日,当时,TensorFlow获得了第一。总的来说, Paadle是百度使用了多年的深度学习平台,并且已经做出了一些实际的产品,较为成熟。在性能和各项指标上,比如:代码简洁、设计很干净,没有太多的abstraction、&#xA0;速度比tensorflow,theano快,显存占用小、可多机多卡并行,支持cpu和gpu、文档比较全等等,Paddle也获得了较高的肯定,是一个不错的深度学习工具,在国内有较大的应用潜力。附:PaddlePaddle快速入门教程 http://www.paddlepaddle.org/doc_cn/我们以文本分类问题作为背景,介绍PaddlePaddle使用流程和常用的网络基础单元的配置方法。安装(Install)首先请参考安装教程安装PaddlePaddle。使用概述(Overview)文本分类问题:对于给定的一条文本, 我们从提前给定的类别集合中选择其所属类 别。比如通过用户对电子商务网站评论,评估产品的质量:这个显示器很棒! (好评)用了两个月之后这个显示器屏幕碎了。(差评)每一个任务流程都可以分为如下5个基础部分。数据格式准备每行保存一条样本,类别Id 和文本信息用Tab间隔, 文本中的单词用空格分隔(如果不切词,则字与字之间用空格分隔),例如:类别Id‘\t’&#xA0;这&#xA0;个&#xA0;显&#xA0;示&#xA0;器&#xA0;很&#xA0;棒&#xA0;!数据向模型传送PaddlePaddle可以读取Python写的传输数据脚本,所有字符都将转换为连续整数表示的Id传给模型网络结构(由易到难展示4种不同的网络配置)逻辑回归模型词向量模型卷积模型时序模型优化算法训练模型预测数据格式准备(Data Preparation)在本问题中,我们使用Amazon电子产品评论数据, 将评论分为好评(正样本)和差评(负样本)两类。demo/quick_start里提供了数据下载脚本 和预处理脚本。cd demo/quick_start
./data/get_data.sh
pip install -r requirements.txt
./preprocess.sh数据向模型传送(Transfer Data to Model)Python数据加载脚本(Data Provider Script)下面dataprovider_bow.py文件给出了完整例子,主要包括两部分:initalizer: 定义文本信息、类别Id的数据类型。process: yield文本信息和类别Id,和initalizer里定义顺序一致。from paddle.trainer.PyDataProvider2 import *# id of the word not in dictionaryUNK_IDX = 0# initializer is called by the framework during initialization.# It allows the user to describe the data types and setup the# necessary data structure for later use.# `settings` is an object. initializer need to properly fill settings.input_types.# initializer can also store other data structures needed to be used at process().# In this example, dictionary is stored in settings.# `dictionay` and `kwargs` are arguments passed from trainer_config.lr.pydef initializer(settings, dictionary, **kwargs): &#xA0; &#xA0;# Put the word dictionary into settings
&#xA0; &#xA0;settings.word_dict = dictionary &#xA0; &#xA0;# setting.input_types specifies what the data types the data provider
&#xA0; &#xA0;# generates.
&#xA0; &#xA0;settings.input_types = [ &#xA0; &#xA0; &#xA0; &#xA0;# The first input is a sparse_binary_vector,
&#xA0; &#xA0; &#xA0; &#xA0;# which means each dimension of the vector is either 0 or 1. It is the
&#xA0; &#xA0; &#xA0; &#xA0;# bag-of-words (BOW) representation of the texts.
&#xA0; &#xA0; &#xA0; &#xA0;sparse_binary_vector(len(dictionary)), &#xA0; &#xA0; &#xA0; &#xA0;# The second input is an integer. It represents the category id of the
&#xA0; &#xA0; &#xA0; &#xA0;# sample. 2 means there are two labels in the dataset.
&#xA0; &#xA0; &#xA0; &#xA0;# (1 for positive and 0 for negative)
&#xA0; &#xA0; &#xA0; &#xA0;integer_value(2)]# Delaring a data provider. It has an initializer &data_initialzer&.# It will cache the generated data of the first pass in memory, so that# during later pass, no on-the-fly data generation will be needed.# `setting` is the same object used by initializer()# `file_name` is the name of a file listed train_list or test_list file given# to define_py_data_sources2(). See trainer_config.lr.py.@provider(init_hook=initializer, cache=CacheType.CACHE_PASS_IN_MEM)def process(settings, file_name): &#xA0; &#xA0;# Open the input data file.
&#xA0; &#xA0;with open(file_name, &r&) as f: &#xA0; &#xA0; &#xA0; &#xA0;# Read each line.
&#xA0; &#xA0; &#xA0; &#xA0;for line in f: &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# Each line contains the label and text of the comment, separated by \t.
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;label, comment = line.strip().split(&\t&) &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# Split the words into a list.
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;words = comment.split() &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# convert the words into a list of ids by looking them up in word_dict.
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;word_vector = [settings.word_dict.get(w, UNK_IDX) for w in words] &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# Return the features for the current comment. The first is a list
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# of ids representing a 0-1 binary sparse vector of the text,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;# the second is the integer id of the label.
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;yield word_vector, int(label)配置中的数据加载定义(Data Provider in Configure)在模型配置中利用define_py_data_sources2加载数据:from paddle.trainer_config_helpers import *file = &data/dict.txt&word_dict = dict()with open(dict_file, &r&) as f: &#xA0; &#xA0;for i, line in enumerate(f):
&#xA0; &#xA0; &#xA0; &#xA0;w = line.strip().split()[0]
&#xA0; &#xA0; &#xA0; &#xA0;word_dict[w] = i# define the data sources for the model.# We need to use different process for training and prediction.# For training, the input data includes both word IDs and labels.# For prediction, the input data only includs word Ids.define_py_data_sources2(train_list=&data/train.list&,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;test_list=&data/test.list&,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;module=&dataprovider_bow&,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;obj=&process&,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;args={&dictionary&: word_dict})data/train.list,data/test.list: 指定训练、测试数据module=”dataprovider”: 数据处理Python文件名obj=”process”: 指定生成数据的函数args={“dictionary”: word_dict}: 额外的参数,这里指定词典更详细用例请参考文档Python Use Case, 数据格式和详细文档请参考&#xA0;PyDataProviderWrapper。网络结构(Network Architecture)本节我们将专注于网络结构的介绍。我们将以基本的逻辑回归网络作为起点,并逐渐展示更加深入的功能。更详细的网络配置 连接请参考Layer文档。 所有配置在demo/quick_start目录,首先列举逻辑回归网络。逻辑回归模型(Logistic Regression)流程如下:获取利用one-hot vector表示的每个单词,维度是词典大小word = data_layer(name=&word&, &#xA0;size=word_dim)获取该条样本类别Id,维度是类别个数。label = data_layer(name=&label&, size=label_dim)利用逻辑回归模型对该向量进行分类,同时会计算分类准确率# Define a fully connected layer with logistic activation (also called softmax activation).output = fc_layer(input=word,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;size=label_dim,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0;act_type=SoftmaxActivation())# Define cross-entropy classification loss and error.classification_cost(input=output, label=label)input: 除过data层,每个层都有一个或多个input,多个input以list方式输入size: 该层神经元个数act_type: 激活函数类型效果总结:我们将在后面介绍训练和预测的流程的脚本。在此为方便对比不同网络结构, 我们随时总结了各个网络的复杂度和效果。网络名称参数数量错误率逻辑回归252 KB8.652%词向量模型(Word Vector)embeding模型需要稍微改变数据提供的脚本,即dataprovider_emb.py,词向量模型、 卷积模型、时序模型均使用该脚文本输入类型定义为整数类型integer_value设置文本输入类型seq_type为SequenceType.SEQUENCEdef initializer(settings, dictionary, **kwargs):
&#xA0; &#xA0;settings.word_dict = dictionary
&#xA0; &#xA0;settings.input_types = [ &#xA0; &#xA0; &#xA0; &#xA0;# Define the type of the first input as sequence of integer.
&#xA0; &#xA0; &#xA0; &#xA0;integer_value(len(dictionary), seq_type=SequenceType.SEQUENCE), &#xA0; &#xA0; &#xA0; &#xA0;# Define the second input for label id
&#xA0; &#xA0; &#xA0; &#xA0;integer_value(2)]@provider(init_hook=initializer)def process(settings, file_name): &#xA0; &#xA0;...
&#xA0; &#xA0;# omitted, it is same as the data provider for LR model该模型依然是使用逻辑回归分类网络的框架, 只是将句子利用连续向量表示替换稀疏 向量表示, 即对第3步进行替换。句子表示的计算更新为2步:利用单词Id查找对应的该单词的连续表示向量(维度为word_dim), 输入N个单词,输出为N个word_dim维度向量emb = embedding_layer(input=word, size=word_dim)将该句话包含的所有单词向量求平均得到句子的表示avg = pooling_layer(input=emb, pooling_type=AvgPooling())其它部分和逻辑回归网络结构一致。 效果总结:网络名称参数数量错误率词向量模型15 MB8.484%卷积模型(Convolution)卷积网络是一种特殊的从词向量表示到句子表示的方法, 也就是将词向量模型额步 骤3-2进行进一步演化, 变为3个新的子步骤。文本卷积分为三个步骤:获取每个单词左右各k个近邻, 拼接成一个新的向量表示;对该表示进行非线性变换 (例如Sigmoid变换), 成为维度为hidden_dim的新的向量;在每个维度上取出在该句话新的向量集合上该维度的最大值作为最后的句子表示向量。 这3个子步骤可配置为:text_conv = sequence_conv_pool(input=emb,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; context_start=k,
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; &#xA0; context_len=2 * k + 1)效果总结:网络名称参数数量错误率卷积模型16 MB5.628%时序模型(Time Sequence)时序模型即为RNN模型, 包括简单的RNN模型、GRU模型、LSTM模型等。GRU模型配置:gru = simple_gru(input=emb, size=gru_size)LSTM模型配置:lstm = simple_lstm(input=emb, size=lstm_size)针对本问题,我们采用单层LSTM模型,并使用了Dropout,效果总结:网络名称参数数量错误率时序模型16 MB4.812%优化算法(Optimization Algorithm)优化算法包括 Momentum, RMSProp,AdaDelta,AdaGrad,ADAM,Adamax等,这里采用Adam优化方法,加了L2正则和梯度截断。settings(batch_size=128,
&#xA0; &#xA0; &#xA0; &#xA0; learning_rate=2e-3,
&#xA0; &#xA0; &#xA0; &#xA0; learning_method=AdamOptimizer(),
&#xA0; &#xA0; &#xA0; &#xA0; regularization=L2Regularization(8e-4),
&#xA0; &#xA0; &#xA0; &#xA0; gradient_clipping_threshold=25)训练模型(Training Model)在完成了数据和网络结构搭建之后, 我们进入到训练部分。训练脚本:我们将训练的命令行保存在了&#xA0;train.sh文件中。训练时所需设置的主要参数如下:paddle train \--config=trainer_config.py \--log_period=20 \--save_dir=./output \--num_passes=15 \--use_gpu=false这里没有介绍多机分布式训练,可以参考分布式训练的demo学习如何进行多机训练。预测(Prediction)可以使用训练好的模型评估带有label的验证集,也可以预测没有label的测试集。测试脚本如下,将会测试配置文件中test.list指定的数据。paddle train \--use_gpu=false \--job=test \--init_model_path=./output/pass-0000x可以参考Python API预测&#xA0;教程,或其他demo的Python预测过程。也可以通过如下方式预测。预测脚本(predict.sh):model=&output/pass-00003&paddle train \
&#xA0; &#xA0;--config=trainer_config.lstm.py \
&#xA0; &#xA0;--use_gpu=false \
&#xA0; &#xA0;--job=test \
&#xA0; &#xA0;--init_model_path=$model \
&#xA0; &#xA0;--config_args=is_predict=1 \
&#xA0; &#xA0;--predict_output_dir=. \mv rank-00000 result.txt与训练网络配置不同的是:无需label相关的层,指定outputs输出概率层(softmax输出), 指定batch_size=1,数据传输无需label数据,预测数据指定test_list的位置。is_predict = get_config_arg(&is_predict&, bool, False)trn = &data/train.list& if not is_predict else Nonetst = &data/test.list& if not is_predict else &data/pred.list&obj = &process& if not is_predict else &process_pre&batch_size = 128 if not is_predict else 1if is_predict:
&#xA0; &#xA0;maxid = maxid_layer(output)
&#xA0; &#xA0;outputs([maxid,output])else:
&#xA0; &#xA0;label = data_layer(name=&label&, size=2)
&#xA0; &#xA0;cls = classification_cost(input=output, label=label)
&#xA0; &#xA0;outputs(cls)总体效果总结(Summary)这些流程中的数据下载、网络配置、训练脚本在/demo/quick_start目录,我们在此总 结上述网络结构在Amazon-Elec测试集(25k)上的效果:网络名称参数数量错误率配置文件逻辑回归模型252KB8.652%trainer_config.lr.py词向量模型15MB8.484%trainer_config.emb.py卷积模型16MB5.628%n.py时序模型16MB4.812%trainer_config.lstm.py附录(Appendix)命令行参数(Command Line Argument)–config:网络配置–save_dir:模型存储路径–log_period:每隔多少batch打印一次日志–num_passes:训练轮次,一个pass表示过一遍所有训练样本–config_args:命令指定的参数会传入网络配置中。–init_model_path:指定初始化模型路径,可用在测试或训练时指定初始化模型。默认一个pass保存一次模型,也可以通过saving_period_by_batches设置每隔多少batch保存一次模型。 可以通过show_parameter_stats_period设置打印参数信息等。 其他参数请参考令行参数文档。输出日志(Log)TrainerInternal.cpp:160] &#xA0;Batch=20 samples=2560 AvgCost=0.628761 CurrentCost=0.628761 Eval: classification_error_evaluator=0.304297 &#xA0;CurrentEval: classification_error_evaluator=0.304297模型训练会看到这样的日志,详细的参数解释如下面表格:名称解释Batch=20表示过了20个batchsamples=2560表示过了2560个样本AvgCost每个pass的第0个batch到当前batch所有样本的平均costCurrentCost当前log_period个batch所有样本的平均costEval: classification_error_evaluator每个pass的第0个batch到当前batch所有样本的平均分类错误率CurrentEval: classification_error_evaluator当前log_period个batch所有样本的平均分类错误率【号外】由中国自动化学会和新智元联合主办的AI全球年度盛典『AI WORLD 2016世界人工智能大会』即将盛大开幕。大会官网:/更多详情,点击“阅读原文”,查看大会官网
新智元微信公众账号最新文章:
相关推荐:
本网站所有内容均采集自网络,如有侵权麻烦邮箱联系删除。百度Paddle会和Python一样,成为最流行的深度学习引擎吗?
发表于 12:24|
来源中国软件资讯网|
作者中国软件资讯网
摘要:PaddlePaddle的负责人徐伟认为,没有一家公司能够完全主导这个领域,要单一公司的深度学习框架完全主导该领域,就等同于用同一种程序语言开发所有的软件,未来深度学习的生态系统会因使用场景有最佳的框架使用。
&PaddlePaddle会和Python一样流行吗?
深度学习引擎最近经历了开源热。2013年Caffe开源,很快成为了深度学习在图像处理中的主要框架,但那时候的开源框架还不多。随着越来越多的开发者开始关注人工智能,AI 巨头们纷纷选择了开源的道路:2015年9月Facebook开源了用于在Torch上更快速地训练神经网络的模块,11月Google开源 TensorFlow,2016年1月微软开源CNTK。最近,百度也宣布开源深度学习引擎 PaddlePaddle。
在这场深度学习的框架之争中,究竟哪家能够胜出?PaddlePaddle的负责人徐伟认为,没有一家公司能够完全主导这个领域,要单一公司的深度学习框架完全主导该领域,就等同于用同一种程序语言开发所有的软件,未来深度学习的生态系统会因使用场景有最佳的框架使用。
话虽如此,对于程序员来说,如果选择了更为流行的编程语言,就会有更多可使用的库,也能更轻松的做出好的产品。而紧跟程序语言的发展历史,我们发现最终最为流行的,总是最容易上手的。
Python是非常好的例子,在编程语言排行榜上,2014年Python只有第六名。但随着大量年轻程序员的涌入,他们更愿意选择简单、易学、文档好的Python作为优先的学习对象,很快C、C++程序员很多也开始使用Python编程了。
而今天发生在深度学习框架上的竞争,似乎也在重演编程语言的历史。
去年TensorFlow发布的时候,对于它的质疑声不绝于耳。首先是对单机版TensorFlow的质疑,认为它在和Caffe、Torch和 Theano相比并没有优势。而在Google开源了分布式版本后,人们说它比Caffe慢,比Torch臃肿,而且不能进行太大调整。但如今在HackerNews上关于最受欢迎深度学习工具的投票,TensorFlow获得第一,得票率是第二名的接近2.6倍。
程序员Vonnik解释了这个现象:使用TensorFlow的大部分都是来自Udacity课程的学生,他们大部分都没什么经验。但正是这些学生和初学者,而非那些经验丰富的资深人士,把Python变成了全球最流行的语言,也把TensorFlow推到了排名第一的位置。
从Python和TensorFlow的历史来看,我们有理由认为,最为简单、易用的深度学习框架,将会在未来的竞争胜出。
百度 PaddlePaddle
在和几款最常用的深度学习框架TensorFlow、Torch、Caffe比较之前,我们先重点介绍新出现的PaddlePaddle。
Paddle其实已经有多年历史了。早在 2013 年,百度就察觉到传统的基于单GPU的训练平台,已经无法满足深度神经网络在搜索、广告、文本、语音、图像等领域的训练需求,于是在徐伟的带领下开始搭建Paddle&&一个多机并行的CPU/GPU混布的异构计算平台。Paddle从最早的开发到如今的开源,就一直以大规模数据处理和工业化的要求不断改进。我们可以看到PaddlePaddle有很多优异的特性。
Github上介绍,PaddlePaddle有以下特点:
PaddlePaddle支持大量的神经网络架构和优化算法,支持任意复杂RNNs结构,高效处理batch,无需数据填充。简单书写配置文件即可实现复杂模型,比如拥有注意力(Attention)机制、外围记忆层(External Memory)或者用于神经机器翻译模型的深度时序快进网络。
为了利用异构计算资源的能力,PaddlePaddle中的每一级都会进行优化,其中包括计算、内存、架构和通信。以下是几个例子:
1.使用SSE/AVX内联函数、BLAS数据库(例如MKL、ATLAS、cuBLAS)和定制化的CPU/GPU Kernal来优化数学运算。
2.高度优化RNNs网络,在没有Padding的情况下,也能处理不同长度的序列。
3.优化的本地和分布式训练,同时支持高纬稀疏模型。
有了PaddlePaddle,使用多个CPU和GPU以及机器来加速训练可以变得很轻松。 PaddlePaddle能通过优化通信,获得高吞吐量和性能。
& 与产品的连接
PaddlePaddle的部署也很简单。在百度,PaddlePaddle已经被用于产品和服务中,拥有大量用户。应用场景包括预估外卖的出餐时间、预判网盘故障时间点、精准推荐用户所需信息、海量图像识别分类、字符识别(OCR)、病毒和垃圾信息检测、机器翻译和自动驾驶等等。
在PaddlePaddle简单、可扩展的逻辑下,徐伟评价说:&这将使工程师们能够快速、轻松地将深度学习技术应用到他们的产品当中,我们想让更多的人使用人工智能,人工智能对于我们的未来生活是非常重要的。&
深度学习框架对比
PaddlePaddle最主要的类比对象,来自UC伯克利的贾扬清开发的Caffe和Google的 TensorFlow。
这是一张来自Spark Summit 2016的图,PaddlePaddle在开源前就在顶级的行业会议中进行了展示。
PaddlePaddle、Caffe和TensorFlow都可以支持分布式训练,但相比之下PaddlePaddle 有很突出的优势。
PaddlePaddle和Caffe在设计上有一些类似的地方,但是相比Caffe聚焦在视觉领域,PaddlePaddle可以在各种不同的场景中应用。而相比TensorFlow,PaddlePaddle的上手难度更低,也没有太多的Abstraction,速度也会更快。
而在RNN的性能表现上,PaddlePaddle的速度也要优于TensorFlow。
1)Caffe具有出色的CNN实现功能的开发语言,在计算机视觉领域,Caffe仍然是最流行的工具包。Caffe的开发语言支持C++和Cuda,速度很快,但是由于一些历史性的遗留架构问题,它的灵活性不够强。而且对递归网络和语言建模的支持很差。Caffe支持所有主流开发系统,上手难度属于中等水平。
2)TensorFlow是一个理想的RNN API实现,它使用了向量运算的符号图方法,使得开发的速度可以很快。TensorFlow支持的比较好的系统只有各种Linux系统和OSX,不过其对语言的支持比较全面,包含了Python、C++和Cuda等,开发者文档写得没有Caffe那么全面,所以上手比较难,在性能方面,也不如Caffe及PaddlePaddle。
3)Torch没有跟随Python的潮流,反而选择了C语言实现,用Lua语言进行封装。Torch对卷积网络的支持非常好,运行在C++、C#和Jave等工业语言的速度较快,也不需要额外的编译。但是它的上手难度也很高,对初学者缺乏规范的例子,而且需要先迈过Lua的门槛,这对初学者是很大的障碍。
4)而此次百度的PaddlePaddle性能优先并兼顾灵活,通过使用GPU异构计算来提升每台机器的数据处理能力,获得了业内&相当简洁、设计干净、稳定,速度较快,显存占用较小&等好评。
而在关键的进入门槛上,相比Google TensorFlow和Facebook Torch,PaddlePaddle的上手难度低得多,且拥有非常优秀的业界特征,包括NLP和推荐等应用场景、对RNN很好的支持、高质量代码、以及分布式训练等,已经足以满足大多数AI场景的需求。且PaddlePaddle更加务实,可解决实际问题。
据徐伟介绍,PaddlePaddle将在本月底发布最新版本,全面支持Mac操作系统、以及Cuda8.0和GCC5.4,同时进一步优化了安装过程,可以帮助更多开放者更好地&上手&。
所以我们可以初步下一个结论,在中国的开发环境下,Google TensorFlow和Facebook Torch的上手难度都比较高,TensorFlow最好的训练环境Google Cloud也难以在中国获得支持。而Caffe虽然已经有了多年的积累,但是毕竟目前只是在视觉领域有比较好的发展,而且相比百度能提供的产业链支持,在资源投入上可能会有比较大的局限。相比之下,坐拥中国的本土市场,上手难度低得多的PaddlePaddle,将会有更好的技术和生态的环境。也许不久的将来,PaddlePaddle就会和Python在编程语言中所做的事情一样,成为最流行的深度学习引擎。
声明:CSDN登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 mt7620a固件大合集 的文章

 

随机推荐