22PaddlePaddle 基本使用概念
33#########################
44
5- PaddlePaddle是一个神经网络学习框架。其单机进程为 :code: ` paddle train `。 单机的所有设备使用,均在单机进程内调度完成。 而多机辅助进程 :code: ` paddle pserver ` 负责联合多个单机进程进行通信,进而充分利用集群的计算资源。 PaddlePaddle同时以 :code: ` swig api ` 的形式,提供训练结果模型预测的方法和自定义训练流程 。
5+ PaddlePaddle是一个深度学习框架,支持单机模式和多机模式 。
66
7- 下面我们会分别介绍主要进程 :code: `paddle train ` 中的一些概念。这些概念会对如何使用PaddlePaddle有一定的帮助。 了解这些概念的前提是,读者已经了解 `基本的神经网络/机器学习原理和概念 <nn.html >`_ 。同时,如果想要了解PaddlePaddle实现中的一些概念,请参考 `PaddlePaddle 编程中的基本概念 <program_concepts.html >`_ 。
7+ 单机模式用命令 ``paddle train `` 可以启动一个trainer进程,单机训练通常只包括一个trainer进程。如果数据规模比较大,希望加速训练,可以启动分布式作业。一个分布式作业里包括若干trainer进程和若干Parameter Server(或称pserver)进程。用命令 ``paddle pserver `` 可以启动 pserver 进程,pserver进程用于协调多个trainer进程之间的通信。
8+
9+ 本文首先介绍trainer进程中的一些使用概念,然后介绍pserver进程中概念。
810
911.. contents ::
1012
11- PaddlePaddle 的进程模型
12- =======================
13+ 系统框图
14+ ========
1315
14- PaddlePaddle进程内嵌了一个 :code: ` python ` 解释器。 这个 :code: ` python ` 解释器负责解析用户定义的神经网络配置,和解析用户数据,并将用户数据传入给 PaddlePaddle 。
16+ 下图描述了用户使用框图,PaddlePaddle的trainer进程里内嵌了Python解释器,trainer进程可以利用这个解释器执行Python脚本,Python脚本里定义了模型配置、训练算法、以及数据读取函数。其中,数据读取程序往往定义在一个单独Python脚本文件里,被称为数据提供器(DataProvider),通常是一个Python函数。模型配置、训练算法通常定义在另一单独Python文件中, 称为训练配置文件。下面将分别介绍这两部分 。
1517
1618.. graphviz ::
1719
@@ -30,164 +32,124 @@ PaddlePaddle进程内嵌了一个 :code:`python` 解释器。 这个 :code:`pyth
3032 py -> data_provider [dir="back"];
3133 }
3234
33- 所以,PaddlePaddle单机训练进程,:code: `paddle train ` , 对于用户的主要接口语言为 python。 主要需要用户配置的两个文件为 :code: `DataProvider ` 和训练文件 :code: `TrainerConfig ` 。
34-
35- .. _glossary_DataProvider :
36-
37- DataProvider
38- ============
35+ 数据提供器
36+ ==========
3937
40- DataProvider是 :code: ` paddle train ` 的数据提供器。 它负责将用户的原始数据转换成 PaddlePaddle 可以识别的数据类型。每当 PaddlePaddle 需要新的数据训练时,都会调用 DataProvider 返回数据。 当所有数据读取完一轮后,DataProvider 便返回空数据通知 PaddlePaddle。PaddlePaddle负责在下一轮训练开始前,将DataProvider重置 。
38+ DataProvider是PaddlePaddle系统的数据提供器,将用户的原始数据转换成系统可以识别的数据类型。每当系统需要新的数据训练时, trainer进程会调用DataProvider函数返回数据。 当所有数据读取完一轮后,DataProvider返回空数据,通知系统一轮数据读取结束,并且系统每一轮训练开始时会重置DataProvider。需要注意的是,DataProvider是被系统调用,而不是新数据驱动系统,一些随机化噪声添加都应该在DataProvider中完成 。
4139
42- 需要注意的是,DataProvider在PaddlePaddle中是被训练逻辑调用的关系, 而不是新的数据驱动训练。并且所有的 :code: `shuffle ` , 和一些随机化的噪声添加,都应该在 DataProvider 阶段完成。
43-
44- 为了方便用户使用自己的数据格式, PaddlePaddle 提供了 `PyDataProvider `_ 来处理数据。 并且在这个Provider中,PaddlePaddle的 C++ 部分接管了如何shuffle,处理 batch,GPU/CPU通信,双缓冲,异步读取等问题。 用户可以参考 `PyDataProvider `_ 的相关文档,继续深入了解 DataProvider 的使用。
45-
46- .. _glossary_trainer_config :
47-
48- 训练文件
49- ========
40+ 在不同的应用里,训练数据的格式往往各不相同。因此,为了用户能够灵活的处理数据,我们提供了Python处理数据的接口,称为 `PyDataProvider `_ 。在 ``PyDataProvider `` 中,系统C++模块接管了shuffle、处理batch、GPU和CPU通信、双缓冲、异步读取等问题,一些情况下(如:``min_pool_size=0 ``)需要Python接口里处理shuffle,可以参考 `PyDataProvider `_ 的相关文档继续深入了解。
5041
51- 训练文件是PaddlePaddle中配置神经网络结构、学习优化算法、数据传入方式的地方。 训练文件是一个python文件,使用命令行参数 :code: `--config ` 传给 paddle 的主程序。 例如\:
5242
53- .. code-block :: bash
43+ 训练配置文件
44+ ============
5445
55- paddle train --config=trainer_config.py
46+ 训练配置文件主要包括数据源、优化算法、网络结构配置三部分。 其中数据源配置与DataProvider的关系是:DataProvider里定义数据读取函数,训练配置文件的数据源配置中指定DataProvider文件名字、生成数据函数接口,请不要混淆。
5647
57- 一个典型简单的训练文件可能为
48+ 一个简单的训练配置文件为:
5849
5950.. literalinclude :: trainer_config.py
6051 :linenos:
6152
62- 下面我们详细的介绍一下训练文件中各个模块的概念 。
53+ 文件开头 `` from paddle.trainer_config_helpers import * `` ,是因为PaddlePaddle配置文件与C++模块通信的最基础协议是protobuf,为了避免用户直接写复杂的protobuf string,我们为用户定以Python接口来配置网络,该Python代码可以生成protobuf包,这就是`trainer_config_helpers`_的作用。因此,在文件的开始,需要import这些函数。 这个包里面包含了模型配置需要的各个模块 。
6354
55+ 下面分别介绍数据源配置、优化算法配置、网络结构配置这三部分该概念。
6456
65- trainer_config_helpers
66- ----------------------
57+ 数据源配置
58+ ----------
6759
68- PaddlePaddle的配置文件与PaddlePaddle C++端通信的最基础协议是 :code: ` protobuf ` 。而为了避免用户直接写比较难写的 protobuf string,我们书写了一个helpers来生成这个protobuf包。所以在文件的开始,import这些helpers函数 。
60+ 使用 ` PyDataProvider `_ 的函数 `` define_py_data_sources2 `` 配置数据源。`` define_py_data_sources2 `` 里通过train_list和test_list指定是训练文件列表和测试文件列表。 如果传入字符串的话,是指一个数据列表文件。这个数据列表文件中包含的是每一个训练或者测试文件的路径。如果传入一个list的话,则会默认生成一个list文件,再传入给train.list或者test.list 。
6961
70- 需要注意的是,这个 :code: ` paddle.trainer_config_helpers ` 包是标准的python包,这意味着用户可以选择自己喜欢的 :code: ` ide ` 或者编辑器来编写Paddle的配置文件,这个python包注释文档比较完善,并且考虑了IDE的代码提示与类型注释 。
62+ `` module `` 和 `` obj `` 指定了DataProvider的文件名和返回数据的函数名。更详细的使用,请参考 ` PyDataProvider `_ 。
7163
72- data_sources
64+ 优化算法配置
7365------------
7466
75- data_sources是配置神经网络的数据源。这里使用的函数是 :code: `define_py_data_sources2 ` ,这个函数是定义了使用 `PyDataProvider `_ 作为数据源。 而后缀 :code: `2 ` 是Paddle历史遗留问题,因为Paddle之前使用的 PyDataProvider 性能较差,所以完全重构了一个新的 `PyDataProvider `_ 。
76-
77- data_sources里面的 train_list 和 test_list 指定的是训练文件列表和测试文件列表。 如果传入一个字符串的话,是指一个训练列表文件。这个训练列表文件中包含的是每一个训练或者测试文件的路径。如果传入一个list的话,则会默认生成一个 list 文件,再传入给 train.list 或者 test.list 。
78-
79- 而 :code: `module ` 和 :code: `obj ` 指定了 DataProvider 的模块名和函数名。
67+ 通过 `settings `_ 接口设置神经网络所使用的训练参数和 `优化算法 `_ ,包括学习率、batch_size、优化算法、正则方法等,具体的使用方法请参考 `settings `_ 文档。
8068
81- 更具体的使用,请参考 `PyDataProvider `_ 。
82-
83- settings
84- --------
85-
86- `settings `_ 是神经网络训练算法相关的设置项。包括学习率,batch_size,优化算法,正则方法等等。具体的使用方法请参考 `settings `_ 文档。
69+ 网络结构配置
70+ ------------
8771
88- 网络配置
89- --------
72+ 神经网络配置主要包括网络连接、激活函数、损失函数、评估器。
9073
91- 上述网络配置中余下的部分均是神经网络配置。第一行是定义一个名字叫 "pixel" 的 :code: `data_layer ` 。每一个layer返回的都是一个 :code: `LayerOutput ` 对象。 这里第一层的输出对象是 :code: `img ` 。然后这个对象传输给了另一个 layer 函数,
92- :code: `simple_img_conv_pool ` 。:code: `simple_img_conv_pool ` 是一个组合层,
93- 包括了图像的卷积 (convolution) 和池化(pooling),
94- 并继续接了一个全连接层( :code: `fc_layer ` ),然后再接了一个Softmax的全连接层。
74+ - 网络连接: 主要由Layer组成,每个Layer返回的都是一个 ``LayerOutput `` 对象,Layer里面可以定义参数属性、激活类型等。
9575
96- 最终,网络配置输出了 :code: `classification_cost ` 。标记网络输出的函数为
97- :code: `outputs ` 。网络的输出是神经网络的优化目标,神经网络训练的时候,实际上就是
98- 要最小化这个输出。
76+ 为了更灵活的配置,PaddlePaddle提供了基于 Projection 或者 Operator 的配置,这两个需要与 ``mixed_layer `` 配合使用。这里简单介绍Layer、Projection、Operator的概念:
9977
100- 在神经网络进行预测的时候,实际上网络的输出也是通过 :code: `outputs ` 标记。
78+ - Layer: 神经网络的某一层,可以有可学习的参数,一般是封装了许多复杂操作的集合。
79+ - Projection:需要与 ``mixed_layer `` 配合使用,含可学习参数。
80+ - Operator: 需要与 ``mixed_layer `` 配合使用,不含可学习参数,输入全是其他Layer的输出。
10181
82+
83+ 这个配置文件网络由 ``data_layer `` 、 ``simple_img_conv_pool `` 、 ``fc_layer `` 组成。
10284
103- Layer、Projection、Operator
104- ===========================
85+ - `data_layer `_ : 通常每个配置文件都会包括 ``data_layer `` ,定义输入数据大小。
86+ - `simple_img_conv_pool `_ :是一个组合层,包括了图像的卷积 (convolution)和池化(pooling)。
87+ - `fc_layer `_ :全连接层,激活函数为Softmax,这里也可叫分类层。
10588
106- PaddlePaddle的网络基本上是基于Layer来配置的。所谓的Layer即是神经网络的某一层,
107- 而神经网络的某一层,一般是封装了许多复杂操作的操作集合。比如最简单的
108- :code: `fc_layer ` ,也包括矩阵乘法,多输入的求和,和activation。
89+
90+ - 损失函数和评估器:损失函数即为网络的优化目标,评估器可以评价模型结果。
10991
110- .. code-block :: python
92+ PaddlePaddle包括很多损失函数和评估起,详细可以参考 `损失函数层 `_ 和 `评估器 `_ 。这里 ``classification_cost `` 默认使用多类交叉熵损失函数和分类错误率统计评估器。
93+
94+ - ``outputs ``: 标记网络输出的函数为 ``outputs `` 。
11195
112- data = data_layer(name = ' data' , size = 200 )
113- out = fc_layer(input = data, size = 200 , act = TanhActivation())
96+ 训练阶段,网络的输出为神经网络的优化目标;预测阶段,网络的输出也可通过 ``outputs `` 标记。
11497
115- 而对于更灵活配置需求,可能这样基于Layer的配置是不灵活的。于是 PaddlePaddle 提供
116- 了基于 Projection 或者 Operator 的配置。使用Projection和Operator需要与
117- :code: `mixed_layer ` 配合使用。 :code: `mixed_layer ` 是将layer中的元素累加求和,
118- 并且做一个 :code: `activation ` , 而这个layer具体如何计算,是交由内部的Projection
119- 和 Operator 定义。Projection是指含有可学习参数的操作,而Operator不含有可学习的
120- 参数,输入全是其他Layer的输出。
12198
99+ 这里对 ``mixed_layer `` 稍做详细说明, 该Layer将多个输入(Projection 或 Operator)累加求和,具体计算是通过内部的 Projection 和 Operator 完成,然后加 Bias 和 activation 操作,
122100
123- 例如,和 :code: ` fc_layer ` 同样功能的 :code: ` mixed_layer ` 。
101+ 例如,和 `` fc_layer `` 同样功能的 `` mixed_layer `` 是:
124102
125103.. code-block :: python
104+
105+ data = data_layer(name = ' data' , size = 200 )
106+ with mixed_layer(size = 200 ) as out:
107+ out += full_matrix_projection(input = data)
126108
127- data = data_layer(name = ' data' , size = 200 )
128- with mixed_layer(size = 200 ) as out:
129- out += full_matrix_projection(input = data)
109+ PaddlePaddle 可以使用 ``mixed layer `` 配置出非常复杂的网络,甚至可以直接配置一个完整的LSTM。用户可以参考 `mixed_layer `_ 的相关文档进行配置。
130110
131- PaddlePaddle可以使用的mixed layer 配置出非常复杂的网络,甚至可以直接配置一个完整的LSTM。
132- 用户可以参考 `mixed_layer `_ 的相关文档进行配置。
133111
134- 如何利用单机的所有GPU或所有CPU核心
135- ==================================
112+ 分布式训练
113+ ==========
136114
137- PaddlePaddle的单机进程 :code: `paddle train ` 可以充分利用一台计算机上所有的GPU资
138- 源或者CPU。
139-
140- 如果要使用机器上多块GPU,使用如下命令即可\:
141-
142- .. code-block :: bash
143-
144- paddle train --use_gpu=true --trainer_count=4 # use 4 gpu card, 0, 1, 2, 3
145-
146- 如果要使用机器上多块CPU, 使用如下命令即可\:
147-
148- .. code-block :: bash
149-
150- paddle train --trainer_config=4 # use 4 cpu cores.
151-
152- 对于其他设置GPU的选择情况,例如选择第0、2号GPU显卡,则可以使用 :code: `CUDA_VISIBLE_DEVICES ` 环境变量来选择部分的显卡。 具体可以参考连接`masking-gpus`_ 。 可以使用的命令为
153-
154- .. code-block :: bash
155-
156- env CUDA_VISIBLE_DEVICES=0,2 paddle train --use_gpu=true --trainer_config=2
157-
158- 如何利用多台机器的计算资源训练神经网络
159- ======================================
160-
161- PaddlePaddle多机使用的经典方法是通过 :code: `Parameter Server ` 来对多机的 :code: `paddle train ` 进行同步。 而多机训练神经网络,首先要讲数据切分到不同的机器上。 切分数据文件的方式在PaddlePaddle的开源实现中并没有提供工具包。 但是切分数据并不是一件非常复杂的事情,也不是神经网络实现的重点。
162-
163- 多机训练过程中,经典的拓扑结构如下\:
115+ PaddlePaddle多机采用经典的 Parameter Server 架构对多个节点的 trainer 进行同步。多机训练的经典拓扑结构如下\:
164116
165117.. graphviz :: pserver_topology.dot
166118
167- 图中每个灰色方块是一台机器,在每个机器中,先去启动一个 :code: ` paddle pserver ` 进程,并确定整体的端口号。 可能的参数是\:
119+ 图中每个灰色方块是一台机器,在每个机器中,先使用命令 `` paddle pserver `` 启动一个pserver进程,并指定端口号, 可能的参数是\:
168120
169121.. code-block :: bash
170122
171- paddle pserver --port=5000 --num_gradient_servers=4 --nics=' eth0'
123+ paddle pserver --port=5000 --num_gradient_servers=4 --tcp_rdma=' tcp' --nics=' eth0'
124+
125+ * ``--port=5000 `` : 指定 pserver 进程端口是 5000 。
126+ * ``--gradient_servers=4 `` : 有四个训练进程(PaddlePaddle 将 trainer 也称作 GradientServer ,因为其为负责提供Gradient) 。
127+ * ``--tcp_rdma='tcp' --nics=`eth0` ``: 指定以太网类型为TCP网络,指定网络接口名字为eth0。
172128
173- 这里说明系统的 :code: ` paddle pserver` 的起始端口是 :code: ` 5000 ` ,并且有四个训练进程( :code: ` gradient_servers `,Paddle同时将 :code: ` paddle train ` 进程称作 :code: ` GradientServer ` 。因为其为负责提供Gradient的进程)。 而对于训练进程的话,则需要在 :code: ` paddle pserver ` 启动之后,再在各个节点上运行如下命令 \:
129+ 启动之后 pserver 进程之后,需要启动 trainer 训练进程,在各个机器上运行如下命令 \:
174130
175131.. code-block :: bash
176132
177133 paddle train --port=5000 --pservers=192.168.100.101,192.168.100.102,192.168.100.103,192.168.100.104 --config=...
178134
179- 对于简单的多机协同使用上述方式即可。同时 ,pserver/train 通常在高级情况下,还有两个参数需要设置,他们是
135+ 对于简单的多机协同训练使用上述方式即可。另外 ,pserver/train 通常在高级情况下,还需要设置下面两个参数 \:
180136
181- * --ports_num\: 一个 pserver进程共绑定多少个端口用来做稠密更新。 默认是1
182- * --ports_num_for_sparse\: 一个pserver进程共绑定多少端口用来做稀疏更新,默认是0
137+ * --ports_num\: 一个 pserver 进程共绑定多少个端口用来做稠密更新, 默认是1。
138+ * --ports_num_for_sparse\: 一个pserver进程共绑定多少端口用来做稀疏更新,默认是0。
183139
184- 使用手工指定端口数量,是因为Paddle的网络通信中,使用了 :code: ` int32 ` 作为消息长度,比较容易在大模型下溢出。所以,在 :code: ` paddle pserver` 进程中可以启动多个子线程去接受 trainer 的数据,这样单个子线程的长度就不会溢出了。但是这个值不可以调的过大,因为增加这个值,还是对性能,尤其是内存占用有一定的开销的, 另外稀疏更新的端口如果太大的话,很容易某一个参数服务器没有分配到任何参数 。
140+ 使用手工指定端口数量,是因为Paddle的网络通信中,使用了 int32 作为消息长度,比较容易在大模型下溢出。所以,在 pserver 进程中可以启动多个子线程去接受 trainer 的数据,这样单个子线程的长度就不会溢出了。但是这个值不可以调的过大,因为增加这个值,对性能尤其是内存占用有一定的开销, 另外稀疏更新的端口如果太大的话,很容易导致某一个参数服务器没有分配到任何参数 。
185141
186142详细的说明可以参考,使用 `集群训练Paddle `_ 。
187143
188144
189145.. _PyDataProvider : ../ui/data_provider/pydataprovider2.html
190- .. _settings : ../../doc/ui/api/trainer_config_helpers/optimizers.html#settings
191- .. _mixed_layer : ../../doc/ui/api/trainer_config_helpers/layers.html#mixed-layer
192- .. _masking-gpu : http://www.acceleware.com/blog/cudavisibledevices-masking-gpus
146+ .. _settings : ../../doc/ui/api/trainer_config_helpers/optimizers.html#settings
147+ .. _优化算法 : ../../doc/ui/api/trainer_config_helpers/optimizers.html#optimizers
148+ .. _trainer_config_helper : ../../doc/ui/api/trainer_config_helpers/index.html
149+ .. _data_layer : ../../doc/ui/api/trainer_config_helpers/layers.html#data-layer
150+ .. _simple_img_conv_pool : ../../doc/ui/api/trainer_config_helpers/networks.html#simple-img-conv-pool
151+ .. _fc_layer : ../../doc/ui/api/trainer_config_helpers/layers.html#fc-layer
152+ .. _损失函数层 : ../../doc/ui/api/trainer_config_helpers/layers.html#cost-layers
153+ .. _评估器 : ../../doc/ui/api/trainer_config_helpers/evaluators.html
154+ .. _mixed_layer : ../../doc/ui/api/trainer_config_helpers/layers.html#mixed-layer
193155.. _集群训练Paddle : ../cluster/index.html
0 commit comments