diff --git a/authors b/authors
index ab4d3118ff1f7e94677c89073c4ea05bf991165e..daac4ec5d8173cba95df9f9b3c69c02b5256f5b2 100644
--- a/authors
+++ b/authors
@@ -29,13 +29,16 @@ Luo, Tao
Lyu, Qin
Mao, Hongyue
Qian, Xiaojun
+Qiao, Longfei
Qi, Jun
Qin, Duohao
Shen, Guolong
Shi, Guangchuan
Song, Xiang
+Wang, Helin
Wang, Jiang
Wang, Yanfei
+Wang, Yi
Wang, Yong
Weng, Renliang
Xu, Tianbing
diff --git a/demo/mnist/api_train_v2.py b/demo/mnist/api_train_v2.py
index cc893ef0f5748906225570a06da0d8e8bef63460..6b95a88042a13a280bcb80f753b3887fcef37296 100644
--- a/demo/mnist/api_train_v2.py
+++ b/demo/mnist/api_train_v2.py
@@ -122,13 +122,14 @@ def main():
test_creator = paddle.dataset.mnist.test()
test_data = []
for item in test_creator():
- test_data.append(item[0])
+ test_data.append((item[0], ))
if len(test_data) == 100:
break
# output is a softmax layer. It returns probabilities.
# Shape should be (100, 10)
- probs = paddle.infer(output=predict, parameters=parameters, input=test_data)
+ probs = paddle.infer(
+ output_layer=predict, parameters=parameters, input=test_data)
print probs.shape
diff --git a/demo/sentiment/train_v2.py b/demo/sentiment/train_v2.py
index fd7243cbe69977dcabc9ecf1d060e62f313b8cfd..1c856556bd0cb32f60eba322469b3621c37e1349 100644
--- a/demo/sentiment/train_v2.py
+++ b/demo/sentiment/train_v2.py
@@ -13,8 +13,6 @@
# limitations under the License.
import sys
-import paddle.trainer_config_helpers.attrs as attrs
-from paddle.trainer_config_helpers.poolings import MaxPooling
import paddle.v2 as paddle
@@ -51,16 +49,14 @@ def stacked_lstm_net(input_dim,
emb_dim: dimension of word embedding.
hid_dim: dimension of hidden layer.
stacked_num: number of stacked lstm-hidden layer.
- is_predict: is predicting or not.
- Some layers is not needed in network when predicting.
"""
assert stacked_num % 2 == 1
- layer_attr = attrs.ExtraLayerAttribute(drop_rate=0.5)
- fc_para_attr = attrs.ParameterAttribute(learning_rate=1e-3)
- lstm_para_attr = attrs.ParameterAttribute(initial_std=0., learning_rate=1.)
+ layer_attr = paddle.attr.Extra(drop_rate=0.5)
+ fc_para_attr = paddle.attr.Param(learning_rate=1e-3)
+ lstm_para_attr = paddle.attr.Param(initial_std=0., learning_rate=1.)
para_attr = [fc_para_attr, lstm_para_attr]
- bias_attr = attrs.ParameterAttribute(initial_std=0., l2_rate=0.)
+ bias_attr = paddle.attr.Param(initial_std=0., l2_rate=0.)
relu = paddle.activation.Relu()
linear = paddle.activation.Linear()
@@ -90,8 +86,10 @@ def stacked_lstm_net(input_dim,
layer_attr=layer_attr)
inputs = [fc, lstm]
- fc_last = paddle.layer.pooling(input=inputs[0], pooling_type=MaxPooling())
- lstm_last = paddle.layer.pooling(input=inputs[1], pooling_type=MaxPooling())
+ fc_last = paddle.layer.pooling(
+ input=inputs[0], pooling_type=paddle.pooling.Max())
+ lstm_last = paddle.layer.pooling(
+ input=inputs[1], pooling_type=paddle.pooling.Max())
output = paddle.layer.fc(input=[fc_last, lstm_last],
size=class_dim,
act=paddle.activation.Softmax(),
@@ -105,14 +103,23 @@ def stacked_lstm_net(input_dim,
if __name__ == '__main__':
# init
- paddle.init(use_gpu=False, trainer_count=4)
+ paddle.init(use_gpu=False)
- # network config
+ #data
print 'load dictionary...'
word_dict = paddle.dataset.imdb.word_dict()
dict_dim = len(word_dict)
class_dim = 2
+ train_reader = paddle.batch(
+ paddle.reader.shuffle(
+ lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000),
+ batch_size=100)
+ test_reader = paddle.batch(
+ lambda: paddle.dataset.imdb.test(word_dict), batch_size=100)
+
+ feeding = {'word': 0, 'label': 1}
+ # network config
# Please choose the way to build the network
# by uncommenting the corresponding line.
cost = convolution_net(dict_dim, class_dim=class_dim)
@@ -137,12 +144,7 @@ if __name__ == '__main__':
sys.stdout.write('.')
sys.stdout.flush()
if isinstance(event, paddle.event.EndPass):
- result = trainer.test(
- reader=paddle.batch(
- lambda: paddle.dataset.imdb.test(word_dict),
- batch_size=128),
- feeding={'word': 0,
- 'label': 1})
+ result = trainer.test(reader=test_reader, feeding=feeding)
print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
# create trainer
@@ -151,11 +153,7 @@ if __name__ == '__main__':
update_equation=adam_optimizer)
trainer.train(
- reader=paddle.batch(
- paddle.reader.shuffle(
- lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000),
- batch_size=100),
+ reader=train_reader,
event_handler=event_handler,
- feeding={'word': 0,
- 'label': 1},
- num_passes=10)
+ feeding=feeding,
+ num_passes=2)
diff --git a/demo/seqToseq/api_train_v2.py b/demo/seqToseq/api_train_v2.py
index 6efd254e7a48703a69c9f09dd35d41ba7ac5689a..5d138a8c4f91976d90b19441781248f7b67c854a 100644
--- a/demo/seqToseq/api_train_v2.py
+++ b/demo/seqToseq/api_train_v2.py
@@ -1,3 +1,4 @@
+import sys
import paddle.v2 as paddle
@@ -104,7 +105,9 @@ def main():
parameters = paddle.parameters.create(cost)
# define optimize method and trainer
- optimizer = paddle.optimizer.Adam(learning_rate=1e-4)
+ optimizer = paddle.optimizer.Adam(
+ learning_rate=5e-5,
+ regularization=paddle.optimizer.L2Regularization(rate=1e-3))
trainer = paddle.trainer.SGD(cost=cost,
parameters=parameters,
update_equation=optimizer)
@@ -125,8 +128,11 @@ def main():
def event_handler(event):
if isinstance(event, paddle.event.EndIteration):
if event.batch_id % 10 == 0:
- print "Pass %d, Batch %d, Cost %f, %s" % (
+ print "\nPass %d, Batch %d, Cost %f, %s" % (
event.pass_id, event.batch_id, event.cost, event.metrics)
+ else:
+ sys.stdout.write('.')
+ sys.stdout.flush()
# start to train
trainer.train(
diff --git a/doc/getstarted/build_and_install/docker_install_cn.rst b/doc/getstarted/build_and_install/docker_install_cn.rst
index 6b132d2a4d31ab85347bd41d0243ffee858ac909..78f518cfe49d81470af018685620baf83f082fbb 100644
--- a/doc/getstarted/build_and_install/docker_install_cn.rst
+++ b/doc/getstarted/build_and_install/docker_install_cn.rst
@@ -1,158 +1,134 @@
-安装PaddlePaddle的Docker镜像
-============================
+PaddlePaddle的Docker容器使用方式
+================================
-PaddlePaddle项目提供官方 `Docker `_ 镜像。Docker镜像是我们目前唯一官方支持的部署和运行方式。
+PaddlePaddle目前唯一官方支持的运行的方式是Docker容器。因为Docker能在所有主要操作系统(包括Linux,Mac OS X和Windows)上运行。 请注意,您需要更改 `Dockers设置 `_ 才能充分利用Mac OS X和Windows上的硬件资源。
-下述内容将分为如下几个类别描述。
-* PaddlePaddle提供的Docker镜像版本
-* 下载和运行Docker镜像
-* 注意事项
+通过Docker容器开发PaddlePaddle
+------------------------------
-PaddlePaddle提供的Docker镜像版本
---------------------------------
+开发人员可以在Docker中开发PaddlePaddle。这样开发人员可以以一致的方式在不同的平台上工作 - Linux,Mac OS X和Windows。
-我们提供了12个 `Docker image `_ ,他们的image name都是 :code:`paddledev/paddle` ,tag分别为
+1. 将开发环境构建为Docker镜像
+
+ .. code-block:: bash
-+-----------------+------------------+------------------------+-----------------------+
-| | normal | devel | demo |
-+=================+==================+========================+=======================+
-| CPU | cpu-latest | cpu-devel-latest | cpu-demo-latest |
-+-----------------+------------------+------------------------+-----------------------+
-| GPU | gpu-latest | gpu-devel-latest | gpu-demo-latest |
-+-----------------+------------------+------------------------+-----------------------+
-| CPU WITHOUT AVX | cpu-noavx-latest | cpu-noavx-devel-latest | cpu-noavx-demo-latest |
-+-----------------+------------------+------------------------+-----------------------+
-| GPU WITHOUT AVX | gpu-noavx-latest | gpu-noavx-devel-latest | gpu-noavx-demo-latest |
-+-----------------+------------------+------------------------+-----------------------+
+ git clone --recursive https://github.com/PaddlePaddle/Paddle
+ cd Paddle
+ docker build -t paddle:dev -f paddle/scripts/docker/Dockerfile .
-其中,横向包括三个版本,normal,devel和demo。
-* Normal: 正常的Docker image,只包括paddle的二进制
-* Devel: 包括Paddle的二进制、编译环境和源代码
-* Demo: 包括Paddle运行demo所需要的依赖
+ 请注意,默认情况下,:code:`docker build` 不会将源码导入到镜像中并编译它。如果我们想这样做,需要设置一个参数:
-纵向包括四个版本,他们是。
+ .. code-block:: bash
-* CPU: CPU版本。需要支持AVX指令集的CPU
-* GPU: GPU版本。需要支持AVX指令集的CPU
-* CPU WITHOUT AVX: CPU版本,不支持AVX指令集的CPU也可以运行
-* GPU WITHOUT AVX: GPU版本,不需要AVX指令集的CPU也可以运行。
+ docker build -t paddle:dev -f paddle/scripts/docker/Dockerfile --build-arg BUILD_AND_INSTALL=ON .
-用户可以选择对应版本的docker image。使用如下脚本可以确定本机的CPU是否支持 :code:`AVX` 指令集\:
-.. code-block:: bash
+2. 运行开发环境
- if cat /proc/cpuinfo | grep -q avx ; then echo "Support AVX"; else echo "Not support AVX"; fi
+ 当我们编译好了 :code:`paddle:dev`, 我们可以在docker容器里做开发,源代码可以通过挂载本地文件来被载入Docker的开发环境里面:
+
+ .. code-block:: bash
-如果输出 :code:`Support AVX`,则可以选择上表中的AVX版本PaddlePaddle。否则需要选择非AVX的PaddlePaddle。选择普通CPU版本的devel版本的image,则可以使用 :code:`paddledev/paddle:cpu-devel-latest` 来引用这个image。
+ docker run -d -p 2202:22 -v $PWD:/paddle paddle:dev
-PaddlePaddle提供的镜像并不包含任何命令运行,想要运行PaddlePaddle,您需要进入镜像运行PaddlePaddle
-程序或者自定义一个含有启动脚本的image。具体请参考注意事项中的 :code:`使用ssh访问PaddlePaddle镜像`
+ 以上代码会启动一个带有PaddlePaddle开发环境的docker容器,源代码会被挂载到 :code:`/paddle` 。
-下载和运行Docker镜像
---------------------
+ 请注意, :code:`paddle:dev` 的默认入口是 :code:`sshd` 。以上的 :code:`docker run` 命令其实会启动一个在2202端口监听的SSHD服务器。这样,我们就能SSH进入我们的开发容器了:
+
+ .. code-block:: bash
-为了运行PaddlePaddle的docker镜像,您需要在机器中安装好Docker。安装Docker需要您的机器
-至少具有3.10以上的linux kernel。安装方法请参考
-`Docker的官方文档 `_ 。如果您使用
-mac osx或者是windows机器,请参考
-`mac osx的安装文档 `_ 和
-`windows 的安装文档 `_ 。
+ ssh root@localhost -p 2202
-您可以使用 :code:`docker pull` 命令预先下载镜像,也可以直接执行
-:code:`docker run` 命令运行镜像。执行方法如下:
+3. 在Docker开发环境中编译与安装PaddlPaddle代码
-.. code-block:: bash
-
- $ docker run -it paddledev/paddle:cpu-latest
+ 当在容器里面的时候,可以用脚本 :code:`paddle/scripts/docker/build.sh` 来编译、安装与测试PaddlePaddle:
+
+ .. code-block:: bash
+
+ /paddle/paddle/scripts/docker/build.sh
-即可启动和进入PaddlePaddle的container。如果运行GPU版本的PaddlePaddle,则需要先将
-cuda相关的Driver和设备映射进container中,脚本类似于
+ 以上指令会在 :code:`/paddle/build` 中编译PaddlePaddle。通过以下指令可以运行单元测试:
+
+ .. code-block:: bash
-.. code-block:: bash
+ cd /paddle/build
+ ctest
- $ export CUDA_SO="$(\ls /usr/lib64/libcuda* | xargs -I{} echo '-v {}:{}') $(\ls /usr/lib64/libnvidia* | xargs -I{} echo '-v {}:{}')"
- $ export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')
- $ docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:gpu-latest
-进入Docker container后,运行 :code:`paddle version` 即可打印出PaddlePaddle的版本和构建
-信息。安装完成的PaddlePaddle主体包括三个部分, :code:`paddle` 脚本, python的
-:code:`paddle` 包和 :code:`py_paddle` 包。其中\:
+纯CPU和GPU的docker镜像
+----------------------
-* :code:`paddle` 脚本和 :code:`paddle` 的python包是PaddlePaddle的训练主要程序。使用
- :code:`paddle` 脚本可以启动PaddlePaddle的训练进程和pserver。而 :code:`paddle` 脚本
- 中的二进制使用了 :code:`paddle` 的python包来做配置文件解析等工作。
-* python包 :code:`py_paddle` 是一个swig封装的PaddlePaddle包,用来做预测和简单的定制化
- 训练。
+对于每一个PaddlePaddle版本,我们都会发布两个Docker镜像:纯CPU的和GPU的。我们通过设置 `dockerhub.com `_ 自动运行以下两个命令:
-注意事项
---------
+.. code-block:: bash
-性能问题
-++++++++
+ docker build -t paddle:cpu -f paddle/scripts/docker/Dockerfile .
+ docker build -t paddle:gpu -f paddle/scripts/docker/Dockerfile.gpu .
-由于Docker是基于容器的轻量化虚拟方案,所以在CPU的运算性能上并不会有严重的影响。
-而GPU的驱动和设备全部映射到了容器内,所以GPU在运算性能上也不会有严重的影响。
+以交互容器方式运行纯CPU的镜像:
-但是如果使用了高性能的网卡,例如RDMA网卡(RoCE 40GbE 或者 IB 56GbE),或者高性能的
-以太网卡 (10GbE)。推荐使用将本地网卡,即 "--net=host" 来进行训练。而不使用docker
-的网桥来进行网络通信。
+.. code-block:: bash
-远程访问问题和二次开发
-++++++++++++++++++++++
+ docker run -it --rm paddledev/paddle:cpu-latest /bin/bash
-由于PaddlePaddle的Docker镜像并不包含任何预定义的运行命令。所以如果想要在后台启用ssh
-远程访问,则需要进行一定的二次开发,将ssh装入系统内并开启远程访问。二次开发可以
-使用Dockerfile构建一个全新的docker image。需要参考
-`Dockerfile的文档 `_ 和
-`Dockerfile的最佳实践 `_
-两个文档。
+或者,可以以后台进程方式运行容器:
-简单的含有ssh的Dockerfile如下:
+.. code-block:: bash
-.. code-block:: bash
+ docker run -d -p 2202:22 paddledev/paddle:cpu-latest
- FROM paddledev/paddle:cpu-latest
+然后用密码 :code:`root` SSH进入容器:
- MAINTAINER PaddlePaddle dev team
+.. code-block:: bash
- RUN apt-get update
- RUN apt-get install -y openssh-server
- RUN mkdir /var/run/sshd
- RUN echo 'root:root' | chpasswd
+ ssh -p 2202 root@localhost
- RUN sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
- RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
+SSH方式的一个优点是我们可以从多个终端进入容器。比如,一个终端运行vi,另一个终端运行Python。另一个好处是我们可以把PaddlePaddle容器运行在远程服务器上,并在笔记本上通过SSH与其连接。
- EXPOSE 22
- CMD ["/usr/sbin/sshd", "-D"]
+以上方法在GPU镜像里也能用-只是请不要忘记按装CUDA驱动,以及告诉Docker:
+.. code-block:: bash
-使用该Dockerfile构建出镜像,然后运行这个container即可。相关命令为\:
+ export CUDA_SO="$(\ls /usr/lib64/libcuda* | xargs -I{} echo '-v {}:{}') $(\ls /usr/lib64/libnvidia* | xargs -I{} echo '-v {}:{}')"
+ export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')
+ docker run ${CUDA_SO} ${DEVICES} -it paddledev/paddle:gpu-latest
-.. code-block:: bash
- # cd到含有Dockerfile的路径中
- $ docker build . -t paddle_ssh
- # 运行这个container,将宿主机的8022端口映射到container的22端口上
- $ docker run -d -p 8022:22 --name paddle_ssh_machine paddle_ssh
+非AVX镜像
+---------
-执行如下命令即可以关闭这个container,并且删除container中的数据\:
+纯CPU镜像以及GPU镜像都会用到AVX指令集,但是2008年之前生产的旧电脑不支持AVX。以下指令能检查Linux电脑是否支持AVX:
-.. code-block:: bash
-
- # 关闭container
- $ docker stop paddle_ssh_machine
- # 删除container
- $ docker rm paddle_ssh_machine
-如果想要在外部机器访问这个container,即可以使用ssh访问宿主机的8022端口。用户名为
-root,密码也是root。命令为\:
+.. code-block:: bash
-.. code-block:: bash
+ if cat /proc/cpuinfo | grep -i avx; then echo Yes; else echo No; fi
- $ ssh -p 8022 root@YOUR_HOST_MACHINE
+如果输出是No,我们就需要手动编译一个非AVX版本的镜像:
-至此,您就可以远程的使用PaddlePaddle啦。
+.. code-block:: bash
+
+ cd ~
+ git clone https://github.com/PaddlePaddle/Paddle.git
+ cd Paddle
+ docker build --build-arg WITH_AVX=OFF -t paddle:cpu-noavx -f paddle/scripts/docker/Dockerfile .
+ docker build --build-arg WITH_AVX=OFF -t paddle:gpu-noavx -f paddle/scripts/docker/Dockerfile.gpu .
+
+
+文档
+----
+
+Paddle的Docker镜像带有一个通过 `woboq code browser
+`_ 生成的HTML版本的C++源代码,便于用户浏览C++源码。
+
+只要在Docker里启动PaddlePaddle的时候给它一个名字,就可以再运行另一个Nginx Docker镜像来服务HTML代码:
+
+.. code-block:: bash
+
+ docker run -d --name paddle-cpu-doc paddle:cpu
+ docker run -d --volumes-from paddle-cpu-doc -p 8088:80 nginx
+
+接着我们就能够打开浏览器在 http://localhost:8088/paddle/ 浏览代码。
diff --git a/python/paddle/v2/inference.py b/python/paddle/v2/inference.py
index 35949622abb7a704b0b23d4f9457738a1177a795..ec3c67d89548f68d705a9b5de80e28597e9829da 100644
--- a/python/paddle/v2/inference.py
+++ b/python/paddle/v2/inference.py
@@ -9,8 +9,8 @@ __all__ = ['infer']
class Inference(object):
- def __init__(self, output, parameters):
- topo = topology.Topology(output)
+ def __init__(self, output_layer, parameters):
+ topo = topology.Topology(output_layer)
gm = api.GradientMachine.createFromConfigProto(
topo.proto(), api.CREATE_MODE_TESTING, [api.PARAMETER_VALUE])
for param in gm.getParameters():
@@ -21,33 +21,16 @@ class Inference(object):
self.__gradient_machine__ = gm
self.__data_types__ = topo.data_type()
- def iter_infer(self, input=None, batch_size=None, reader=None,
- feeding=None):
+ def iter_infer(self, input, feeding=None):
feeder = DataFeeder(self.__data_types__, feeding)
- if reader is None:
- assert input is not None and isinstance(input, collections.Iterable)
- if not isinstance(input, collections.Iterable):
- raise TypeError("When reader is None, input should be whole "
- "inference data and should be iterable")
-
- if batch_size is None:
- if not hasattr(input, '__len__'):
- raise ValueError("Should set batch size when input data "
- "don't contain length.")
- batch_size = len(input)
-
- def __reader_impl__():
- for each_sample in input:
- if len(feeder) == 1:
- yield [each_sample]
- else:
- yield each_sample
-
- reader = minibatch.batch(__reader_impl__, batch_size=batch_size)
- else:
- if input is not None:
- raise ValueError("User should set either input or reader, "
- "should not set them both.")
+ batch_size = len(input)
+
+ def __reader_impl__():
+ for each_sample in input:
+ yield each_sample
+
+ reader = minibatch.batch(__reader_impl__, batch_size=batch_size)
+
self.__gradient_machine__.start()
for data_batch in reader():
yield self.__gradient_machine__.forwardTest(feeder(data_batch))
@@ -71,13 +54,7 @@ class Inference(object):
return retv
-def infer(output,
- parameters,
- input=None,
- batch_size=None,
- reader=None,
- feeding=None,
- field='value'):
+def infer(output_layer, parameters, input, feeding=None, field='value'):
"""
Infer a neural network by given neural network output and parameters. The
user should pass either a batch of input data or reader method.
@@ -90,19 +67,13 @@ def infer(output,
batch_size=32)
print result
- :param output: output of the neural network that would be inferred
- :type output: paddle.v2.config_base.Layer
+ :param output_layer: output of the neural network that would be inferred
+ :type output_layer: paddle.v2.config_base.Layer
:param parameters: parameters of the neural network.
:type parameters: paddle.v2.parameters.Parameters
:param input: input data batch. Should be a python iterable object, and each
element is the data batch.
:type input: collections.Iterable
- :param batch_size: the batch size when perform inference. Default is the
- length of input.
- :type batch_size: int
- :param reader: input data reader creator in batch. If this field is set, the
- `input` and `batch_size` will be ignored.
- :type reader: callable
:param feeding: Reader dictionary. Default could generate from input
value.
:param field: The prediction field. It should in [`value`, `ids`]. `value`
@@ -113,10 +84,5 @@ def infer(output,
:rtype: numpy.ndarray
"""
- inferer = Inference(output=output, parameters=parameters)
- return inferer.infer(
- field=field,
- input=input,
- batch_size=batch_size,
- reader=reader,
- feeding=feeding)
+ inferer = Inference(output_layer=output_layer, parameters=parameters)
+ return inferer.infer(field=field, input=input, feeding=feeding)