今天刚看到的,简单说一些第一印象(以目前的github repo为准)。整体的设计感觉和Caffe心有灵犀,同时解决了Caffe早期设计当中的一些问题(比如说default stream)。
1. 很高质量的GPU代码
2. 非常好的RNN设计
3. 设计很干净,没有太多的abstraction,这一点比TensorFlow好很多。
4. 高速RDMA的部分貌似没有开源(可能是因为RDMA对于cluster design有一定要求): Paddle/RDMANetwork.h at master · baidu/Paddle · GitHub
5. 设计思路比较像第一代的DL框架,不过考虑到paddle已经有年头了,这样设计还是有历史原因的。
5.1 config是hard-code的protobuf message,这对扩展性可能会有影响。
5.2 可以看到很多有意思的类似历史遗留的设计:采用了STREAM_DEFAULT macro,然后通过TLS的方式定向到非default stream: Paddle/hl_base.h at 4fe7d833cf0dd952bfa8af8d5d7772bbcd552c58 · baidu/Paddle · GitHub (所以Paddle off-the-shelf不支持mac?)
5.3 在梯度计算上采用了传统的粗粒度forward/backward设计(类似Caffe)。可能有人会说“所以paddle没有auto gradient generation”,这是不对的,autograd的存在与否和op的粒度粗细无关。事实上,TensorFlow在意识到细粒度operator超级慢的速度以后,也在逐渐转回粗粒度的operator上。
目前只看到这里。总之是一个非常solid的框架,百度的开发功底还是不错的。
1. 很高质量的GPU代码
2. 非常好的RNN设计
3. 设计很干净,没有太多的abstraction,这一点比TensorFlow好很多。
4. 高速RDMA的部分貌似没有开源(可能是因为RDMA对于cluster design有一定要求): Paddle/RDMANetwork.h at master · baidu/Paddle · GitHub
5. 设计思路比较像第一代的DL框架,不过考虑到paddle已经有年头了,这样设计还是有历史原因的。
5.1 config是hard-code的protobuf message,这对扩展性可能会有影响。
5.2 可以看到很多有意思的类似历史遗留的设计:采用了STREAM_DEFAULT macro,然后通过TLS的方式定向到非default stream: Paddle/hl_base.h at 4fe7d833cf0dd952bfa8af8d5d7772bbcd552c58 · baidu/Paddle · GitHub (所以Paddle off-the-shelf不支持mac?)
5.3 在梯度计算上采用了传统的粗粒度forward/backward设计(类似Caffe)。可能有人会说“所以paddle没有auto gradient generation”,这是不对的,autograd的存在与否和op的粒度粗细无关。事实上,TensorFlow在意识到细粒度operator超级慢的速度以后,也在逐渐转回粗粒度的operator上。
目前只看到这里。总之是一个非常solid的框架,百度的开发功底还是不错的。
安装
关于paddle的安装官方提供了两种方法:
由于安装并没有遇到困难,所以就不在此详述,参考官方进行安装即可。
我们可以从官方下载源码,进行paddle的hello world实验。
需要强调的是paddle源码更新升级比较快,极有可能出现源码与此讲解或者官方文档冲突的情况。甚至自己的源码demo都会因为其他部门的变化而变得不可执行。这点需要注意
首先从方法论的角度结合Amazon电子产品评论数据(此问题等同于情感标注问题,根据评论者的态度分为正样本和负样本,即二分类问题)来看paddle的处理流程。任何一个paddle的处理流程都包括如下5个基础部分。
1.数据格式准备:
- 获得要处理的样本格式。在Amazon评论数据中,格式为类别标签+Table间隔+评论内容,每一行为一条内容。
2.数据向模型传送:
- 根据需要建立的网络模型,讲数据格式转化为模型能够识别的数据格式,主要是利用PyDataProvider。
3.网络结构:
- paddle的网络结构以layer(如果不明白layer的含义请先学习神经网络和deep learning的基本内容)为基本单位,当然paddle还提供了由常见的由基本layer组合的network(如常见的CNN网络的基本结构:Input => conv => pooling)
- 针对Amazon数据我们简单建立四种模型来训练:逻辑回归模型,词向量模型,卷积模型,时序模型。
- 优化算法,具体的可以不用了解那么多。但是请一定理解BP(反向传导)和sgd(随机梯度下降发)算法。
4.训练模型:
- 当建立网络模型后,只需简单的命令行就可以进行模型的训练。
5.预测
- 当模型训练完毕后,即可读入训练好的模型进行测试或者预测。
数据格式准备
打开paddle的源码,进入/demo/quick_start 目录。创建get_data.sh,并执行。获取已经处理好的数据‘
#!/bin/sh
wget http://m1-idl-gpu2-bak31.m1.baidu.com:8088/data/amazon.tar
tar -xf amazon.tar
rm -rf amazon.tar
- 下载完毕后,amazon下面的文件主要包括:
- dict.txt:单词编码字典
- elec-100k-train-z.txt:训练的标注样本
- elec-test-z.txt: 测试的标注样本
- test.list:保存测试样本列表,本例为elec-test-z.txt的路径
- train.list:保存训练样本列表,本例为elec-100k-train-z.txt的路径
- 由于旧数据和新更代码的不一致,我们需要将下载好的/demo/quick_start/amazon目录中的文件全部拷贝到/demo/quick_start/data中。
- 并修改/demo/quick_start/data目录下的train.list以及test.list文件。
- 将train.list中的./amazon/elec-100k-train-z.txt改为./data/elec-100k-train-z.txt;将test.list中的./amazon/elec-test-z.txt改为./data/elec-test-z.txt。
数据向模型传送
传送数据的主要代码在/demo/quick_start的dataprovider.py中,代码利用了Python的@(装饰者模式)方法。代码如下:
import os
import sys
from paddle.trainer.PyDataProviderWrapper import *
UNK_IDX = 0
@init_hook_wrapper
def hook(obj, dictionary,