提交 c0a8eab2 编写于 作者: G gangliao 提交者: GitHub

Merge pull request #577 from backyes/refine_doc

[Refine doc] refine ubuntu installation and FAQ docs.
使用deb包在Ubuntu上安装PaddlePaddle Ubuntu部署PaddlePaddle
=================================== ===================================
PaddlePaddle目前支持使用deb包安装。Paddle的 :code:`deb` 安装包在ubuntu 14.04中正确,但理论上支持其他的 debian 发行版 PaddlePaddle提供了ubuntu 14.04 deb安装包
安装
------
PaddlePaddle的ubuntu安装包分为四个版本,他们是 cpu、gpu、cpu-noavx、gpu-noavx 四个版本。其中 noavx 用于不支持AVX指令集的cpu。安装包的下载地址是\: https://github.com/baidu/Paddle/releases/ 安装包的下载地址是\: https://github.com/PaddlePaddle/Paddle/releases
它包含四个版本\:
用户需要先将PaddlePaddle安装包下载到本地,然后执行如下 :code:`gdebi` 命令即可完成安装 * cpu版本: 支持主流x86处理器平台, 使用了avx指令集
.. code-block:: shell * cpu-noavx版本:支持主流x86处理器平台,没有使用avx指令集。
* gpu版本:支持主流x86处理器平台,支持nvidia cuda平台,使用了avx指令集。
gdebi paddle-*-cpu*.deb * gpu-noavx版本:支持主流x86处理器平台,支持nvidia cuda平台,没有使用avx指令集。
如果 :code:`gdebi` 没有安装,则需要使用 :code:`sudo apt-get install gdebi`, 来安装 :code:`gdebi` 。 下载完相关安装包后,执行:
.. code-block:: shell
或者使用下面一条命令安装. sudo apt-get install gdebi
gdebi paddle-*-cpu.deb
或者:
.. code-block:: shell .. code-block:: shell
dpkg -i paddle-*-cpu*.deb dpkg -i paddle-*-cpu.deb
apt-get install -f apt-get install -f
在 :code:`dpkg -i` 的时候如果报一些依赖未找到的错误是正常的, 在 :code:`dpkg -i` 的时候如果报一些依赖未找到的错误是正常的,
在 :code:`apt-get install -f` 里会继续安装 PaddlePaddle。 在 :code:`apt-get install -f` 里会继续安装 PaddlePaddle。
需要注意的是,如果使用GPU版本的PaddlePaddle,请安装CUDA 7.5 和CUDNN 5到本地环境中, 安装完成后,可以使用命令 :code:`paddle version` 查看安装后的paddle 版本:
并设置好对应的环境变量(LD_LIBRARY_PATH等等)。
安装完成后,可以使用命令 :code:`paddle version` 查看安装后的paddle 版本。可能的输出为
.. literalinclude:: paddle_version.txt .. literalinclude:: paddle_version.txt
...@@ -39,45 +46,16 @@ PaddlePaddle的ubuntu安装包分为四个版本,他们是 cpu、gpu、cpu-noa ...@@ -39,45 +46,16 @@ PaddlePaddle的ubuntu安装包分为四个版本,他们是 cpu、gpu、cpu-noa
libcudart.so/libcudnn.so找不到 libcudart.so/libcudnn.so找不到
++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++
安装完成PaddlePaddle后,运行 :code:`paddle train` 报错\: 安装完成后,运行 :code:`paddle train` 报错\:
.. code-block:: shell
0831 12:36:04.151525 1085 hl_dso_loader.cc:70] Check failed: nullptr != *dso_handle For Gpu version of PaddlePaddle, it couldn't find CUDA library: libcudart.so Please make sure you already specify its path.Note: for training data on Cpu using Gpu version of PaddlePaddle,you must specify libcudart.so via LD_LIBRARY_PATH.
PaddlePaddle使用运行时动态连接CUDA的so,如果在 LD_LIBRARY_PATH里面找不到这些动态
库的话,会报寻找不到这些动态库。
解决方法很简单,就是将这些动态库加到环境变量里面。比较可能的命令如下。
.. code-block:: text .. code-block:: shell
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH 0831 12:36:04.151525 1085 hl_dso_loader.cc:70] Check failed: nullptr != *dso_handle For Gpu version of PaddlePaddle, it couldn't find CUDA library: libcudart.so Please make sure you already specify its path.Note: for training data on Cpu using Gpu version of PaddlePaddle,you must specify libcudart.so via LD_LIBRARY_PATH.
CUDA Driver找不到 原因是未设置cuda运行时环境变量。 如果使用GPU版本的PaddlePaddle,请安装CUDA 7.5 和CUDNN 5到本地环境中,并设置:
+++++++++++++++++
运行 :code:`paddle train` 报错\: .. code-block:: shell
.. code-block:: text
F0831 12:39:16.699000 1090 hl_cuda_device.cc:530] Check failed: cudaSuccess == cudaStat (0 vs. 35) Cuda Error: CUDA driver version is insufficient for CUDA runtime version
PaddlePaddle运行时如果没有寻找到cuda的driver,变会报这个错误。解决办法是将cuda
driver添加到LD_LIBRARY_PATH中。比较可能的命令如下。
.. code-block:: text
export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH
config文件找不到
++++++++++++++++
运行 :code:`paddle train` 得到结果\:
.. code-block:: text
F0831 20:53:07.525789 1302 TrainerMain.cpp:94] Check failed: config != nullptr no valid config export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda/bin:$PATH
PaddlePaddle在运行时找不到对应的config文件,说明命令行参数 :code:`config` 没有设置。
而这个一般说明PaddlePaddle已经安装完毕了。
\ No newline at end of file
...@@ -4,22 +4,18 @@ PaddlePaddle常见问题 ...@@ -4,22 +4,18 @@ PaddlePaddle常见问题
.. contents:: .. contents::
1. 如何减少PaddlePaddle的内存占用 1. 如何减少内存占用
--------------------------------- ---------------------------------
神经网络的训练本身是一个非常消耗内存和显存的工作。经常会消耗数十G的内存和数G的显存。 神经网络的训练本身是一个非常消耗内存和显存的工作,经常会消耗数10GB的内存和数GB的显存。
PaddlePaddle的内存占用主要分为如下几个方面\: PaddlePaddle的内存占用主要分为如下几个方面\:
* DataProvider缓冲池内存 (只针对内存) * DataProvider缓冲池内存(只针对内存)
* 神经元激活内存 (针对内存和显存) * 神经元激活内存(针对内存和显存)
* 参数内存 (针对内存和显存) * 参数内存 (针对内存和显存)
* 其他内存杂项 * 其他内存杂项
这其中,其他内存杂项是指PaddlePaddle本身所用的一些内存,包括字符串分配,临时变量等等, 其中,其他内存杂项是指PaddlePaddle本身所用的一些内存,包括字符串分配,临时变量等等,暂不考虑在内。
这些内存就不考虑如何缩减了。
其他的内存的减少方法依次为
减少DataProvider缓冲池内存 减少DataProvider缓冲池内存
++++++++++++++++++++++++++ ++++++++++++++++++++++++++
...@@ -39,28 +35,28 @@ PyDataProvider使用的是异步加载,同时在内存里直接随即选取数 ...@@ -39,28 +35,28 @@ PyDataProvider使用的是异步加载,同时在内存里直接随即选取数
.. literalinclude:: reduce_min_pool_size.py .. literalinclude:: reduce_min_pool_size.py
这样做可以极大的减少内存占用,并且可能会加速训练过程详细文档参考 `这里 这样做可以极大的减少内存占用,并且可能会加速训练过程详细文档参考 `这里
<../ui/data_provider/pydataprovider2.html#provider>`_ 。 <../ui/data_provider/pydataprovider2.html#provider>`_ 。
神经元激活内存 神经元激活内存
++++++++++++++ ++++++++++++++
神经网络在训练的时候,会对每一个激活暂存一些数据,包括激活,參差等等。 神经网络在训练的时候,会对每一个激活暂存一些数据,如神经元激活值等。
在反向传递的时候,这些数据会被用来更新参数。这些数据使用的内存主要和两个参数有关系, 在反向传递的时候,这些数据会被用来更新参数。这些数据使用的内存主要和两个参数有关系,
一是batch size,另一个是每条序列(Sequence)长度。所以,其实也是和每个mini-batch中包含 一是batch size,另一个是每条序列(Sequence)长度。所以,其实也是和每个mini-batch中包含
的时间步信息成正比。 的时间步信息成正比。
所以,做法可以有两种。他们是 所以做法可以有两种:
* 减小batch size。 即在网络配置中 :code:`settings(batch_size=1000)` 设置成一个小一些的值。但是batch size本身是神经网络的超参数,减小batch size可能会对训练结果产生影响。 * 减小batch size。 即在网络配置中 :code:`settings(batch_size=1000)` 设置成一个小一些的值。但是batch size本身是神经网络的超参数,减小batch size可能会对训练结果产生影响。
* 减小序列的长度,或者直接扔掉非常长的序列。比如,一个数据集大部分序列长度是100-200, * 减小序列的长度,或者直接扔掉非常长的序列。比如,一个数据集大部分序列长度是100-200,
但是突然有一个10000长的序列,就很容易导致内存超限特别是在LSTM等RNN中。 但是突然有一个10000长的序列,就很容易导致内存超限特别是在LSTM等RNN中。
参数内存 参数内存
++++++++ ++++++++
PaddlePaddle支持非常多的优化算法(Optimizer),不同的优化算法需要使用不同大小的内存。 PaddlePaddle支持非常多的优化算法(Optimizer),不同的优化算法需要使用不同大小的内存。
例如如果使用 :code:`adadelta` 算法,则需要使用参数规模大约5倍的内存。 如果参数保存下来的 例如使用 :code:`adadelta` 算法,则需要使用等于权重参数规模大约5倍的内存。举例,如果参数保存下来的模型目录
文件为 :code:`100M`, 那么该优化算法至少需要 :code:`500M` 的内存。 文件为 :code:`100M`, 那么该优化算法至少需要 :code:`500M` 的内存。
可以考虑使用一些优化算法,例如 :code:`momentum`。 可以考虑使用一些优化算法,例如 :code:`momentum`。
...@@ -68,11 +64,11 @@ PaddlePaddle支持非常多的优化算法(Optimizer),不同的优化算法需 ...@@ -68,11 +64,11 @@ PaddlePaddle支持非常多的优化算法(Optimizer),不同的优化算法需
2. 如何加速PaddlePaddle的训练速度 2. 如何加速PaddlePaddle的训练速度
--------------------------------- ---------------------------------
PaddlePaddle是神经网络训练平台,加速PaddlePaddle训练有如下几个方面\: 加速PaddlePaddle训练可以考虑从以下几个方面\:
* 减少数据载入的耗时 * 减少数据载入的耗时
* 加速训练速度 * 加速训练速度
* 利用更多的计算资源 * 利用分布式训练驾驭更多的计算资源
减少数据载入的耗时 减少数据载入的耗时
++++++++++++++++++ ++++++++++++++++++
...@@ -108,25 +104,20 @@ PaddlePaddle支持Sparse的训练,sparse训练需要训练特征是 :code:`spa ...@@ -108,25 +104,20 @@ PaddlePaddle支持Sparse的训练,sparse训练需要训练特征是 :code:`spa
利用更多的计算资源可以分为一下几个方式来进行\: 利用更多的计算资源可以分为一下几个方式来进行\:
* 单机CPU训练 * 单机CPU训练
* 使用多线程训练。设置命令行参数 :code:`trainer_count`,即可以设置参与训练的线程数量。使用方法为 :code:`paddle train --trainer_count=4` * 使用多线程训练。设置命令行参数 :code:`trainer_count`。
* 单机GPU训练 * 单机GPU训练
* 使用显卡训练。设置命令行参数 :code:`use_gpu`。 使用方法为 :code:`paddle train --use_gpu=true` * 使用显卡训练。设置命令行参数 :code:`use_gpu`。
* 使用多块显卡训练。设置命令行参数 :code:`use_gpu` 和 :code:`trainer_count`。使用 :code:`--use_gpu=True` 开启GPU训练,使用 :code:`trainer_count` 指定显卡数量。使用方法为 :code:`paddle train --use_gpu=true --trainer_count=4` * 使用多块显卡训练。设置命令行参数 :code:`use_gpu` 和 :code:`trainer_count` 。
* 多机训练 * 多机训练
* 使用多机训练的方法也比较简单,需要先在每个节点启动 :code:`paddle pserver`,在使用 :code:`paddle train --pservers=192.168.100.1,192.168.100.2` 来指定每个pserver的ip地址 * 具体的多机训练方法参考 `多机训练文档 <../ui/data_provider/pydataprovider2.html#provider>`_ 。
* 具体的多机训练方法参考 `多机训练 <TBD>`_ 文档。
3. 遇到“非法指令”或者是“illegal instruction” 3. 遇到“非法指令”或者是“illegal instruction”
-------------------------------------------- --------------------------------------------
paddle在进行计算的时候为了提升计算性能,使用了avx指令。部分老的cpu型号无法支持这样的指令。通常来说执行下grep avx /proc/cpuinfo看看是否有输出即可知道是否支持。(另:用此方法部分虚拟机可能检测到支持avx指令但是实际运行会挂掉,请当成是不支持,看下面的解决方案) PaddlePaddle使用avx SIMD指令提高cpu执行效率,因此错误的使用二进制发行版可能会导致这种错误,请选择正确的版本。
解决办法是\:
* 使用 NO_AVX的 `安装包 <../build_and_install/index.html>`_ 或者 `Docker image <../build_and_install/install/docker_install.html>`_
* 或者,使用 :code:`-DWITH_AVX=OFF` 重新编译PaddlePaddle。
4. 如何选择SGD算法的学习率 4. 如何选择SGD算法的学习率
-------------------------- --------------------------
...@@ -158,7 +149,7 @@ paddle在进行计算的时候为了提升计算性能,使用了avx指令。 ...@@ -158,7 +149,7 @@ paddle在进行计算的时候为了提升计算性能,使用了avx指令。
6. 如何共享参数 6. 如何共享参数
--------------- ---------------
PaddlePaddle的参数使用名字 :code:`name` 作为参数的ID,相同名字的参数,会共享参数。设置参数的名字,可以使用 :code:`ParamAttr(name="YOUR_PARAM_NAME")` 来设置。更方便的设置方式,是要共享的参数使用同样的 :code:`ParamAttr` 对象。 PaddlePaddle的参数使用名字 :code:`name` 作为参数的ID,相同名字的参数,会共享参数。设置参数的名字,可以使用 :code:`ParamAttr(name="YOUR_PARAM_NAME")` 来设置。更方便的设置方式,是使得要共享的参数使用同样的 :code:`ParamAttr` 对象。
简单的全连接网络,参数共享的配置示例为\: 简单的全连接网络,参数共享的配置示例为\:
...@@ -208,9 +199,6 @@ PaddlePaddle的参数使用名字 :code:`name` 作为参数的ID,相同名字 ...@@ -208,9 +199,6 @@ PaddlePaddle的参数使用名字 :code:`name` 作为参数的ID,相同名字
paddle package is already in your PYTHONPATH. But unittest need a clean environment. paddle package is already in your PYTHONPATH. But unittest need a clean environment.
Please uninstall paddle package before start unittest. Try to 'pip uninstall paddle'. Please uninstall paddle package before start unittest. Try to 'pip uninstall paddle'.
解决办法是:卸载paddle包 :code:`pip uninstall paddle`。 解决办法是:
原因是:单元测试使用了一个旧版本的python包,而没有测试到代码中实际修改的python包。即单元测试需要一个干净的环境:
* 如果paddle包已经在python的site-packages里面了,那么单元测试时使用的paddle包,就是site-packages里面的python包,而不是源码目录里 :code:`/python` 目录下的python包。 * 卸载PaddlePaddle包 :code:`pip uninstall paddle`, 清理掉老旧的PaddlePaddle安装包,使得单元测试有一个干净的环境。如果PaddlePaddle包已经在python的site-packages里面,单元测试会引用site-packages里面的python包,而不是源码目录里 :code:`/python` 目录下的python包。同时,即便设置 :code:`PYTHONPATH` 到 :code:`/python` 也没用,因为python的搜索路径是优先已经安装的python包。
* 即便设置了 :code:`PYTHONPATH` 到 :code:`/python` 也没用,因为python的搜索路径是优先已经安装的python包。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册