提交 5a7e3d99 编写于 作者: T Travis CI

Deploy to GitHub Pages: 6117af64

上级 9b38ebf0
......@@ -158,17 +158,23 @@ PaddlePaddle的参数使用名字 :code:`name` 作为参数的ID,相同名字
这里 :code:`hidden_a` 和 :code:`hidden_b` 使用了同样的parameter和bias。并且softmax层的两个输入也使用了同样的参数 :code:`softmax_param`。
7. \*-cp27mu-linux_x86_64.whl is not a supported wheel on this platform.
7. paddlepaddle\*.whl is not a supported wheel on this platform.
------------------------------------------------------------------------
出现这个问题的主要原因是,系统编译wheel包的时候,使用的 :code:`wheel` 包是最新的,
而系统中的 :code:`pip` 包比较老。具体的解决方法是,更新 :code:`pip` 包并重新编译PaddlePaddle。
出现这个问题的主要原因是,没有找到和当前系统匹配的paddlepaddle安装包。最新的paddlepaddle python安装包支持Linux x86_64和MacOS 10.12操作系统,并安装了python 2.7和pip 9.0.1。
更新 :code:`pip` 包的方法是\:
.. code-block:: bash
pip install --upgrade pip
如果还不行,可以执行 :code:`python -c "import pip; print(pip.pep425tags.get_supported())"` 获取当前系统支持的python包的后缀,
并对比是否和正在安装的后缀一致。
如果系统支持的是 :code:`linux_x86_64` 而安装包是 :code:`manylinux1_x86_64` ,需要升级pip版本到最新;
如果系统支持 :code:`manylinux1_x86_64` 而安装包(本地)是 :code:`linux_x86_64` ,可以重命名这个whl包为 :code:`manylinux1_x86_64` 再安装。
8. python相关的单元测试都过不了
--------------------------------
......@@ -310,7 +316,7 @@ Paddle二进制在运行时捕获了浮点数异常,只要出现浮点数异
* 模型一直不收敛,发散到了一个数值特别大的地方。
* 训练数据有问题,导致参数收敛到了一些奇异的情况。或者输入数据尺度过大,有些特征的取值达到数百万,这时进行矩阵乘法运算就可能导致浮点数溢出。
主要的解决办法是减小学习或者对数据进行归一化处理。
主要的解决办法是减小学习或者对数据进行归一化处理。
15. 编译安装后执行 import paddle.v2 as paddle 报ImportError: No module named v2
------------------------------------------------------------------------
......@@ -373,3 +379,15 @@ PaddlePaddle保存的模型参数文件内容由16字节头信息和网络参数
parameters = paddle.parameters.create(my_cost)
parameters.set('emb', load_parameter(emb_param_file, 30000, 256))
18. 集群多节点训练,日志中保存均为网络通信类错误
------------------------------
集群多节点训练,日志报错为网络通信类错误,比如 :code:`Connection reset by peer` 等。
此类报错通常是由于某一个节点的错误导致这个节点的训练进程退出,从而引发其他节点无法连接导致,可以参考下面的步骤排查:
* 从 :code:`train.log` , :code:`server.log` 找到最早报错的地方,查看是否是其他错误引发的报错(比如FPE,内存不足,磁盘空间不足等)。
* 如果发现最早的报错就是网络通信的问题,很有可能是非独占方式执行导致的端口冲突,可以联系OP,看当前MPI集群是否支持resource=full参数提交,如果支持增加此参数提交,并更换job 端口。
* 如果当前MPI集群并不支持任务独占模式,可以联系OP是否可以更换集群或升级当前集群。
\ No newline at end of file
......@@ -186,44 +186,45 @@
<div itemprop="articleBody">
<div class="section" id="faq">
<h1><a class="toc-backref" href="#id11">FAQ</a><a class="headerlink" href="#faq" title="永久链接至标题"></a></h1>
<h1><a class="toc-backref" href="#id12">FAQ</a><a class="headerlink" href="#faq" title="永久链接至标题"></a></h1>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#faq" id="id11">FAQ</a><ul>
<li><a class="reference internal" href="#id1" id="id12">1. 如何减少内存占用</a><ul>
<li><a class="reference internal" href="#dataprovider" id="id13">减少DataProvider缓冲池内存</a></li>
<li><a class="reference internal" href="#id2" id="id14">神经元激活内存</a></li>
<li><a class="reference internal" href="#id3" id="id15">参数内存</a></li>
<li><a class="reference internal" href="#faq" id="id12">FAQ</a><ul>
<li><a class="reference internal" href="#id1" id="id13">1. 如何减少内存占用</a><ul>
<li><a class="reference internal" href="#dataprovider" id="id14">减少DataProvider缓冲池内存</a></li>
<li><a class="reference internal" href="#id2" id="id15">神经元激活内存</a></li>
<li><a class="reference internal" href="#id3" id="id16">参数内存</a></li>
</ul>
</li>
<li><a class="reference internal" href="#paddlepaddle" id="id16">2. 如何加速PaddlePaddle的训练速度</a><ul>
<li><a class="reference internal" href="#id4" id="id17">减少数据载入的耗时</a></li>
<li><a class="reference internal" href="#id5" id="id18">加速训练速度</a></li>
<li><a class="reference internal" href="#id6" id="id19">利用更多的计算资源</a></li>
<li><a class="reference internal" href="#paddlepaddle" id="id17">2. 如何加速PaddlePaddle的训练速度</a><ul>
<li><a class="reference internal" href="#id4" id="id18">减少数据载入的耗时</a></li>
<li><a class="reference internal" href="#id5" id="id19">加速训练速度</a></li>
<li><a class="reference internal" href="#id6" id="id20">利用更多的计算资源</a></li>
</ul>
</li>
<li><a class="reference internal" href="#illegal-instruction" id="id20">3. 遇到“非法指令”或者是“illegal instruction”</a></li>
<li><a class="reference internal" href="#sgd" id="id21">4. 如何选择SGD算法的学习率</a></li>
<li><a class="reference internal" href="#id7" id="id22">5. 如何初始化参数</a></li>
<li><a class="reference internal" href="#id8" id="id23">6. 如何共享参数</a></li>
<li><a class="reference internal" href="#cp27mu-linux-x86-64-whl-is-not-a-supported-wheel-on-this-platform" id="id24">7. *-cp27mu-linux_x86_64.whl is not a supported wheel on this platform.</a></li>
<li><a class="reference internal" href="#python" id="id25">8. python相关的单元测试都过不了</a></li>
<li><a class="reference internal" href="#docker-gpu-cuda-driver-version-is-insufficient" id="id26">9. 运行Docker GPU镜像出现 &#8220;CUDA driver version is insufficient&#8221;</a></li>
<li><a class="reference internal" href="#cmake-pythonlibspythoninterp" id="id27">10. CMake源码编译, 找到的PythonLibs和PythonInterp版本不一致</a></li>
<li><a class="reference internal" href="#cmake-paddle0-0-0" id="id28">11. CMake源码编译,Paddle版本号为0.0.0</a></li>
<li><a class="reference internal" href="#a-protocol-message-was-rejected-because-it-was-too-big" id="id29">12. A protocol message was rejected because it was too big</a></li>
<li><a class="reference internal" href="#gpu" id="id30">13. 如何指定GPU设备</a></li>
<li><a class="reference internal" href="#floating-point-exception" id="id31">14. 训练过程中出现 <code class="code docutils literal"><span class="pre">Floating</span> <span class="pre">point</span> <span class="pre">exception</span></code>, 训练因此退出怎么办?</a></li>
<li><a class="reference internal" href="#import-paddle-v2-as-paddle-importerror-no-module-named-v2" id="id32">15. 编译安装后执行 import paddle.v2 as paddle 报ImportError: No module named v2</a></li>
<li><a class="reference internal" href="#id9" id="id33">16. PaddlePaddle存储的参数格式是什么,如何和明文进行相互转化</a></li>
<li><a class="reference internal" href="#id10" id="id34">17. 如何加载预训练参数</a></li>
<li><a class="reference internal" href="#illegal-instruction" id="id21">3. 遇到“非法指令”或者是“illegal instruction”</a></li>
<li><a class="reference internal" href="#sgd" id="id22">4. 如何选择SGD算法的学习率</a></li>
<li><a class="reference internal" href="#id7" id="id23">5. 如何初始化参数</a></li>
<li><a class="reference internal" href="#id8" id="id24">6. 如何共享参数</a></li>
<li><a class="reference internal" href="#paddlepaddle-whl-is-not-a-supported-wheel-on-this-platform" id="id25">7. paddlepaddle*.whl is not a supported wheel on this platform.</a></li>
<li><a class="reference internal" href="#python" id="id26">8. python相关的单元测试都过不了</a></li>
<li><a class="reference internal" href="#docker-gpu-cuda-driver-version-is-insufficient" id="id27">9. 运行Docker GPU镜像出现 &#8220;CUDA driver version is insufficient&#8221;</a></li>
<li><a class="reference internal" href="#cmake-pythonlibspythoninterp" id="id28">10. CMake源码编译, 找到的PythonLibs和PythonInterp版本不一致</a></li>
<li><a class="reference internal" href="#cmake-paddle0-0-0" id="id29">11. CMake源码编译,Paddle版本号为0.0.0</a></li>
<li><a class="reference internal" href="#a-protocol-message-was-rejected-because-it-was-too-big" id="id30">12. A protocol message was rejected because it was too big</a></li>
<li><a class="reference internal" href="#gpu" id="id31">13. 如何指定GPU设备</a></li>
<li><a class="reference internal" href="#floating-point-exception" id="id32">14. 训练过程中出现 <code class="code docutils literal"><span class="pre">Floating</span> <span class="pre">point</span> <span class="pre">exception</span></code>, 训练因此退出怎么办?</a></li>
<li><a class="reference internal" href="#import-paddle-v2-as-paddle-importerror-no-module-named-v2" id="id33">15. 编译安装后执行 import paddle.v2 as paddle 报ImportError: No module named v2</a></li>
<li><a class="reference internal" href="#id9" id="id34">16. PaddlePaddle存储的参数格式是什么,如何和明文进行相互转化</a></li>
<li><a class="reference internal" href="#id10" id="id35">17. 如何加载预训练参数</a></li>
<li><a class="reference internal" href="#id11" id="id36">18. 集群多节点训练,日志中保存均为网络通信类错误</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id12">1. 如何减少内存占用</a><a class="headerlink" href="#id1" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id13">1. 如何减少内存占用</a><a class="headerlink" href="#id1" title="永久链接至标题"></a></h2>
<p>神经网络的训练本身是一个非常消耗内存和显存的工作,经常会消耗数10GB的内存和数GB的显存。
PaddlePaddle的内存占用主要分为如下几个方面:</p>
<ul class="simple">
......@@ -234,7 +235,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</ul>
<p>其中,其他内存杂项是指PaddlePaddle本身所用的一些内存,包括字符串分配,临时变量等等,暂不考虑在内。</p>
<div class="section" id="dataprovider">
<h3><a class="toc-backref" href="#id13">减少DataProvider缓冲池内存</a><a class="headerlink" href="#dataprovider" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id14">减少DataProvider缓冲池内存</a><a class="headerlink" href="#dataprovider" title="永久链接至标题"></a></h3>
<p>PyDataProvider使用的是异步加载,同时在内存里直接随即选取数据来做Shuffle。即</p>
<img src="../_images/graphviz-9be6aad37f57c60f4b971dde0ef44ce27179cf9a.png" alt="digraph {
rankdir=LR;
......@@ -254,7 +255,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
<p>这样做可以极大的减少内存占用,并且可能会加速训练过程,详细文档参考 <a class="reference internal" href="../api/v1/data_provider/pydataprovider2_cn.html#api-pydataprovider2"><span class="std std-ref">PyDataProvider2的使用</span></a></p>
</div>
<div class="section" id="id2">
<h3><a class="toc-backref" href="#id14">神经元激活内存</a><a class="headerlink" href="#id2" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id15">神经元激活内存</a><a class="headerlink" href="#id2" title="永久链接至标题"></a></h3>
<p>神经网络在训练的时候,会对每一个激活暂存一些数据,如神经元激活值等。
在反向传递的时候,这些数据会被用来更新参数。这些数据使用的内存主要和两个参数有关系,
一是batch size,另一个是每条序列(Sequence)长度。所以,其实也是和每个mini-batch中包含
......@@ -267,7 +268,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</ul>
</div>
<div class="section" id="id3">
<h3><a class="toc-backref" href="#id15">参数内存</a><a class="headerlink" href="#id3" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id16">参数内存</a><a class="headerlink" href="#id3" title="永久链接至标题"></a></h3>
<p>PaddlePaddle支持非常多的优化算法(Optimizer),不同的优化算法需要使用不同大小的内存。
例如使用 <code class="code docutils literal"><span class="pre">adadelta</span></code> 算法,则需要使用等于权重参数规模大约5倍的内存。举例,如果参数保存下来的模型目录
文件为 <code class="code docutils literal"><span class="pre">100M</span></code>, 那么该优化算法至少需要 <code class="code docutils literal"><span class="pre">500M</span></code> 的内存。</p>
......@@ -275,7 +276,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</div>
</div>
<div class="section" id="paddlepaddle">
<h2><a class="toc-backref" href="#id16">2. 如何加速PaddlePaddle的训练速度</a><a class="headerlink" href="#paddlepaddle" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id17">2. 如何加速PaddlePaddle的训练速度</a><a class="headerlink" href="#paddlepaddle" title="永久链接至标题"></a></h2>
<p>加速PaddlePaddle训练可以考虑从以下几个方面:</p>
<ul class="simple">
<li>减少数据载入的耗时</li>
......@@ -283,7 +284,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
<li>利用分布式训练驾驭更多的计算资源</li>
</ul>
<div class="section" id="id4">
<h3><a class="toc-backref" href="#id17">减少数据载入的耗时</a><a class="headerlink" href="#id4" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id18">减少数据载入的耗时</a><a class="headerlink" href="#id4" title="永久链接至标题"></a></h3>
<p>使用<code class="code docutils literal"><span class="pre">pydataprovider</span></code>时,可以减少缓存池的大小,同时设置内存缓存功能,即可以极大的加速数据载入流程。
<code class="code docutils literal"><span class="pre">DataProvider</span></code> 缓存池的减小,和之前减小通过减小缓存池来减小内存占用的原理一致。</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="nd">@provider</span><span class="p">(</span><span class="n">min_pool_size</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
......@@ -297,7 +298,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
<p>同时 <code class="code docutils literal"><span class="pre">&#64;provider</span></code> 接口有一个 <code class="code docutils literal"><span class="pre">cache</span></code> 参数来控制缓存方法,将其设置成 <code class="code docutils literal"><span class="pre">CacheType.CACHE_PASS_IN_MEM</span></code> 的话,会将第一个 <code class="code docutils literal"><span class="pre">pass</span></code> (过完所有训练数据即为一个pass)生成的数据缓存在内存里,在之后的 <code class="code docutils literal"><span class="pre">pass</span></code> 中,不会再从 <code class="code docutils literal"><span class="pre">python</span></code> 端读取数据,而是直接从内存的缓存里读取数据。这也会极大减少数据读入的耗时。</p>
</div>
<div class="section" id="id5">
<h3><a class="toc-backref" href="#id18">加速训练速度</a><a class="headerlink" href="#id5" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id19">加速训练速度</a><a class="headerlink" href="#id5" title="永久链接至标题"></a></h3>
<p>PaddlePaddle支持Sparse的训练,sparse训练需要训练特征是 <code class="code docutils literal"><span class="pre">sparse_binary_vector</span></code><code class="code docutils literal"><span class="pre">sparse_vector</span></code> 、或者 <code class="code docutils literal"><span class="pre">integer_value</span></code> 的任一一种。同时,与这个训练数据交互的Layer,需要将其Parameter设置成 sparse 更新模式,即设置 <code class="code docutils literal"><span class="pre">sparse_update=True</span></code></p>
<p>这里使用简单的 <code class="code docutils literal"><span class="pre">word2vec</span></code> 训练语言模型距离,具体使用方法为:</p>
<p>使用一个词前两个词和后两个词,来预测这个中间的词。这个任务的DataProvider为:</p>
......@@ -330,7 +331,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</div>
</div>
<div class="section" id="id6">
<h3><a class="toc-backref" href="#id19">利用更多的计算资源</a><a class="headerlink" href="#id6" title="永久链接至标题"></a></h3>
<h3><a class="toc-backref" href="#id20">利用更多的计算资源</a><a class="headerlink" href="#id6" title="永久链接至标题"></a></h3>
<p>利用更多的计算资源可以分为一下几个方式来进行:</p>
<ul class="simple">
<li>单机CPU训练<ul>
......@@ -350,17 +351,17 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</div>
</div>
<div class="section" id="illegal-instruction">
<h2><a class="toc-backref" href="#id20">3. 遇到“非法指令”或者是“illegal instruction”</a><a class="headerlink" href="#illegal-instruction" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id21">3. 遇到“非法指令”或者是“illegal instruction”</a><a class="headerlink" href="#illegal-instruction" title="永久链接至标题"></a></h2>
<p>PaddlePaddle使用avx SIMD指令提高cpu执行效率,因此错误的使用二进制发行版可能会导致这种错误,请选择正确的版本。</p>
</div>
<div class="section" id="sgd">
<h2><a class="toc-backref" href="#id21">4. 如何选择SGD算法的学习率</a><a class="headerlink" href="#sgd" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id22">4. 如何选择SGD算法的学习率</a><a class="headerlink" href="#sgd" title="永久链接至标题"></a></h2>
<p>在采用sgd/async_sgd进行训练时,一个重要的问题是选择正确的learning_rate。如果learning_rate太大,那么训练有可能不收敛,如果learning_rate太小,那么收敛可能很慢,导致训练时间过长。</p>
<p>通常做法是从一个比较大的learning_rate开始试,如果不收敛,那减少学习率10倍继续试验,直到训练收敛为止。那么如何判断训练不收敛呢?可以估计出如果模型采用不变的输出最小的cost0是多少。</p>
<p>如果训练过程的的cost明显高于这个常数输出的cost,那么我们可以判断为训练不收敛。举一个例子,假如我们是三分类问题,采用multi-class-cross-entropy作为cost,数据中0,1,2三类的比例为 <code class="code docutils literal"><span class="pre">0.2,</span> <span class="pre">0.5,</span> <span class="pre">0.3</span></code> , 那么常数输出所能达到的最小cost是 <code class="code docutils literal"><span class="pre">-(0.2*log(0.2)+0.5*log(0.5)+0.3*log(0.3))=1.03</span></code> 。如果训练一个pass(或者更早)后,cost还大于这个数,那么可以认为训练不收敛,应该降低学习率。</p>
</div>
<div class="section" id="id7">
<h2><a class="toc-backref" href="#id22">5. 如何初始化参数</a><a class="headerlink" href="#id7" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id23">5. 如何初始化参数</a><a class="headerlink" href="#id7" title="永久链接至标题"></a></h2>
<p>默认情况下,PaddlePaddle使用均值0,标准差为 <span class="math">\(\frac{1}{\sqrt{d}}\)</span> 来初始化参数。其中 <span class="math">\(d\)</span> 为参数矩阵的宽度。这种初始化方式在一般情况下不会产生很差的结果。如果用户想要自定义初始化方式,PaddlePaddle目前提供两种参数初始化的方式:</p>
<ul class="simple">
<li>高斯分布。将 <code class="code docutils literal"><span class="pre">param_attr</span></code> 设置成 <code class="code docutils literal"><span class="pre">param_attr=ParamAttr(initial_mean=0.0,</span> <span class="pre">initial_std=1.0)</span></code></li>
......@@ -374,7 +375,7 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
<p>上述代码将bias全部初始化为1.0, 同时将参数初始化为 <code class="code docutils literal"><span class="pre">[1.0,</span> <span class="pre">-1.0]</span></code> 的均匀分布。</p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id23">6. 如何共享参数</a><a class="headerlink" href="#id8" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id24">6. 如何共享参数</a><a class="headerlink" href="#id8" title="永久链接至标题"></a></h2>
<p>PaddlePaddle的参数使用名字 <code class="code docutils literal"><span class="pre">name</span></code> 作为参数的ID,相同名字的参数,会共享参数。设置参数的名字,可以使用 <code class="code docutils literal"><span class="pre">ParamAttr(name=&quot;YOUR_PARAM_NAME&quot;)</span></code> 来设置。更方便的设置方式,是使得要共享的参数使用同样的 <code class="code docutils literal"><span class="pre">ParamAttr</span></code> 对象。</p>
<p>简单的全连接网络,参数共享的配置示例为:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">paddle.trainer_config_helpers</span> <span class="k">import</span> <span class="o">*</span>
......@@ -410,17 +411,20 @@ PaddlePaddle的内存占用主要分为如下几个方面:</p>
</div>
<p>这里 <code class="code docutils literal"><span class="pre">hidden_a</span></code><code class="code docutils literal"><span class="pre">hidden_b</span></code> 使用了同样的parameter和bias。并且softmax层的两个输入也使用了同样的参数 <code class="code docutils literal"><span class="pre">softmax_param</span></code></p>
</div>
<div class="section" id="cp27mu-linux-x86-64-whl-is-not-a-supported-wheel-on-this-platform">
<h2><a class="toc-backref" href="#id24">7. *-cp27mu-linux_x86_64.whl is not a supported wheel on this platform.</a><a class="headerlink" href="#cp27mu-linux-x86-64-whl-is-not-a-supported-wheel-on-this-platform" title="永久链接至标题"></a></h2>
<p>出现这个问题的主要原因是,系统编译wheel包的时候,使用的 <code class="code docutils literal"><span class="pre">wheel</span></code> 包是最新的,
而系统中的 <code class="code docutils literal"><span class="pre">pip</span></code> 包比较老。具体的解决方法是,更新 <code class="code docutils literal"><span class="pre">pip</span></code> 包并重新编译PaddlePaddle。
更新 <code class="code docutils literal"><span class="pre">pip</span></code> 包的方法是:</p>
<div class="section" id="paddlepaddle-whl-is-not-a-supported-wheel-on-this-platform">
<h2><a class="toc-backref" href="#id25">7. paddlepaddle*.whl is not a supported wheel on this platform.</a><a class="headerlink" href="#paddlepaddle-whl-is-not-a-supported-wheel-on-this-platform" title="永久链接至标题"></a></h2>
<p>出现这个问题的主要原因是,没有找到和当前系统匹配的paddlepaddle安装包。最新的paddlepaddle python安装包支持Linux x86_64和MacOS 10.12操作系统,并安装了python 2.7和pip 9.0.1。</p>
<p>更新 <code class="code docutils literal"><span class="pre">pip</span></code> 包的方法是:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>pip install --upgrade pip
</pre></div>
</div>
<p>如果还不行,可以执行 <code class="code docutils literal"><span class="pre">python</span> <span class="pre">-c</span> <span class="pre">&quot;import</span> <span class="pre">pip;</span> <span class="pre">print(pip.pep425tags.get_supported())&quot;</span></code> 获取当前系统支持的python包的后缀,
并对比是否和正在安装的后缀一致。</p>
<p>如果系统支持的是 <code class="code docutils literal"><span class="pre">linux_x86_64</span></code> 而安装包是 <code class="code docutils literal"><span class="pre">manylinux1_x86_64</span></code> ,需要升级pip版本到最新;
如果系统支持 <code class="code docutils literal"><span class="pre">manylinux1_x86_64</span></code> 而安装包(本地)是 <code class="code docutils literal"><span class="pre">linux_x86_64</span></code> ,可以重命名这个whl包为 <code class="code docutils literal"><span class="pre">manylinux1_x86_64</span></code> 再安装。</p>
</div>
<div class="section" id="python">
<h2><a class="toc-backref" href="#id25">8. python相关的单元测试都过不了</a><a class="headerlink" href="#python" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id26">8. python相关的单元测试都过不了</a><a class="headerlink" href="#python" title="永久链接至标题"></a></h2>
<p>如果出现以下python相关的单元测试都过不了的情况:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="m">24</span> - test_PyDataProvider <span class="o">(</span>Failed<span class="o">)</span>
<span class="m">26</span> - test_RecurrentGradientMachine <span class="o">(</span>Failed<span class="o">)</span>
......@@ -451,7 +455,7 @@ Please uninstall paddle package before start unittest. Try to <span class="s1">&
</ul>
</div>
<div class="section" id="docker-gpu-cuda-driver-version-is-insufficient">
<h2><a class="toc-backref" href="#id26">9. 运行Docker GPU镜像出现 &#8220;CUDA driver version is insufficient&#8221;</a><a class="headerlink" href="#docker-gpu-cuda-driver-version-is-insufficient" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id27">9. 运行Docker GPU镜像出现 &#8220;CUDA driver version is insufficient&#8221;</a><a class="headerlink" href="#docker-gpu-cuda-driver-version-is-insufficient" title="永久链接至标题"></a></h2>
<p>用户在使用PaddlePaddle GPU的Docker镜像的时候,常常出现 <cite>Cuda Error: CUDA driver version is insufficient for CUDA runtime version</cite>, 原因在于没有把机器上CUDA相关的驱动和库映射到容器内部。
具体的解决方法是:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">export</span> <span class="nv">CUDA_SO</span><span class="o">=</span><span class="s2">&quot;</span><span class="k">$(</span><span class="se">\l</span>s usr/lib64/libcuda* <span class="p">|</span> xargs -I<span class="o">{}</span> <span class="nb">echo</span> <span class="s1">&#39;-v {}:{}&#39;</span><span class="k">)</span><span class="s2"> </span><span class="k">$(</span><span class="se">\l</span>s /usr/lib64/libnvidia* <span class="p">|</span> xargs -I<span class="o">{}</span> <span class="nb">echo</span> <span class="s1">&#39;-v {}:{}&#39;</span><span class="k">)</span><span class="s2">&quot;</span>
......@@ -462,7 +466,7 @@ $ docker run <span class="si">${</span><span class="nv">CUDA_SO</span><span clas
<p>更多关于Docker的安装与使用, 请参考 <a class="reference external" href="http://www.paddlepaddle.org/doc_cn/build_and_install/install/docker_install.html">PaddlePaddle Docker 文档</a></p>
</div>
<div class="section" id="cmake-pythonlibspythoninterp">
<h2><a class="toc-backref" href="#id27">10. CMake源码编译, 找到的PythonLibs和PythonInterp版本不一致</a><a class="headerlink" href="#cmake-pythonlibspythoninterp" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id28">10. CMake源码编译, 找到的PythonLibs和PythonInterp版本不一致</a><a class="headerlink" href="#cmake-pythonlibspythoninterp" title="永久链接至标题"></a></h2>
<p>这是目前CMake寻找Python的逻辑存在缺陷,如果系统安装了多个Python版本,CMake找到的Python库和Python解释器版本可能有不一致现象,导致编译PaddlePaddle失败。正确的解决方法是,
用户强制指定特定的Python版本,具体操作如下:</p>
<blockquote>
......@@ -473,7 +477,7 @@ $ docker run <span class="si">${</span><span class="nv">CUDA_SO</span><span clas
<p>用户需要指定本机上Python的路径:<code class="docutils literal"><span class="pre">&lt;exc_path&gt;</span></code>, <code class="docutils literal"><span class="pre">&lt;lib_path&gt;</span></code>, <code class="docutils literal"><span class="pre">&lt;inc_path&gt;</span></code></p>
</div>
<div class="section" id="cmake-paddle0-0-0">
<h2><a class="toc-backref" href="#id28">11. CMake源码编译,Paddle版本号为0.0.0</a><a class="headerlink" href="#cmake-paddle0-0-0" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id29">11. CMake源码编译,Paddle版本号为0.0.0</a><a class="headerlink" href="#cmake-paddle0-0-0" title="永久链接至标题"></a></h2>
<p>如果运行 <code class="code docutils literal"><span class="pre">paddle</span> <span class="pre">version</span></code>, 出现 <code class="code docutils literal"><span class="pre">PaddlePaddle</span> <span class="pre">0.0.0</span></code>;或者运行 <code class="code docutils literal"><span class="pre">cmake</span> <span class="pre">..</span></code>,出现</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span>CMake Warning at cmake/version.cmake:20 <span class="o">(</span>message<span class="o">)</span>:
Cannot add paddle version from git tag
......@@ -482,7 +486,7 @@ $ docker run <span class="si">${</span><span class="nv">CUDA_SO</span><span clas
<p>那么用户需要拉取所有的远程分支到本机,命令为 <code class="code docutils literal"><span class="pre">git</span> <span class="pre">fetch</span> <span class="pre">upstream</span></code>,然后重新cmake即可。</p>
</div>
<div class="section" id="a-protocol-message-was-rejected-because-it-was-too-big">
<h2><a class="toc-backref" href="#id29">12. A protocol message was rejected because it was too big</a><a class="headerlink" href="#a-protocol-message-was-rejected-because-it-was-too-big" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id30">12. A protocol message was rejected because it was too big</a><a class="headerlink" href="#a-protocol-message-was-rejected-because-it-was-too-big" title="永久链接至标题"></a></h2>
<p>如果在训练NLP相关模型时,出现以下错误:</p>
<div class="highlight-bash"><div class="highlight"><pre><span></span><span class="o">[</span>libprotobuf ERROR google/protobuf/io/coded_stream.cc:171<span class="o">]</span> A protocol message was rejected because it was too big <span class="o">(</span>more than <span class="m">67108864</span> bytes<span class="o">)</span>. To increase the limit <span class="o">(</span>or to disable these warnings<span class="o">)</span>, see CodedInputStream::SetTotalBytesLimit<span class="o">()</span> in google/protobuf/io/coded_stream.h.
F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> TrainerConfigHelper.cpp:59<span class="o">]</span> Check failed: m-&gt;conf.ParseFromString<span class="o">(</span>configProtoStr<span class="o">)</span>
......@@ -513,7 +517,7 @@ F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> Traine
<p>完整源码可参考 <a class="reference external" href="https://github.com/PaddlePaddle/Paddle/tree/develop/demo/seqToseq">seqToseq</a> 示例。</p>
</div>
<div class="section" id="gpu">
<h2><a class="toc-backref" href="#id30">13. 如何指定GPU设备</a><a class="headerlink" href="#gpu" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id31">13. 如何指定GPU设备</a><a class="headerlink" href="#gpu" title="永久链接至标题"></a></h2>
<p>例如机器上有4块GPU,编号从0开始,指定使用2、3号GPU:</p>
<ul class="simple">
<li>方式1:通过 <a class="reference external" href="http://www.acceleware.com/blog/cudavisibledevices-masking-gpus">CUDA_VISIBLE_DEVICES</a> 环境变量来指定特定的GPU。</li>
......@@ -529,7 +533,7 @@ F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> Traine
</div>
</div>
<div class="section" id="floating-point-exception">
<h2><a class="toc-backref" href="#id31">14. 训练过程中出现 <code class="code docutils literal"><span class="pre">Floating</span> <span class="pre">point</span> <span class="pre">exception</span></code>, 训练因此退出怎么办?</a><a class="headerlink" href="#floating-point-exception" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id32">14. 训练过程中出现 <code class="code docutils literal"><span class="pre">Floating</span> <span class="pre">point</span> <span class="pre">exception</span></code>, 训练因此退出怎么办?</a><a class="headerlink" href="#floating-point-exception" title="永久链接至标题"></a></h2>
<p>Paddle二进制在运行时捕获了浮点数异常,只要出现浮点数异常(即训练过程中出现NaN或者Inf),立刻退出。浮点异常通常的原因是浮点数溢出、除零等问题。
主要原因包括两个方面:</p>
<ul class="simple">
......@@ -537,17 +541,17 @@ F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> Traine
<li>模型一直不收敛,发散到了一个数值特别大的地方。</li>
<li>训练数据有问题,导致参数收敛到了一些奇异的情况。或者输入数据尺度过大,有些特征的取值达到数百万,这时进行矩阵乘法运算就可能导致浮点数溢出。</li>
</ul>
<p>主要的解决办法是减小学习或者对数据进行归一化处理。</p>
<p>主要的解决办法是减小学习或者对数据进行归一化处理。</p>
</div>
<div class="section" id="import-paddle-v2-as-paddle-importerror-no-module-named-v2">
<h2><a class="toc-backref" href="#id32">15. 编译安装后执行 import paddle.v2 as paddle 报ImportError: No module named v2</a><a class="headerlink" href="#import-paddle-v2-as-paddle-importerror-no-module-named-v2" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id33">15. 编译安装后执行 import paddle.v2 as paddle 报ImportError: No module named v2</a><a class="headerlink" href="#import-paddle-v2-as-paddle-importerror-no-module-named-v2" title="永久链接至标题"></a></h2>
<p>先查看一下是否曾经安装过paddle v1版本,有的话需要先卸载:</p>
<p>pip uninstall py_paddle paddle</p>
<p>然后安装paddle的python环境, 在build目录下执行</p>
<p>pip install python/dist/paddle*.whl &amp;&amp; pip install ../paddle/dist/py_paddle*.whl</p>
</div>
<div class="section" id="id9">
<h2><a class="toc-backref" href="#id33">16. PaddlePaddle存储的参数格式是什么,如何和明文进行相互转化</a><a class="headerlink" href="#id9" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id34">16. PaddlePaddle存储的参数格式是什么,如何和明文进行相互转化</a><a class="headerlink" href="#id9" title="永久链接至标题"></a></h2>
<p>PaddlePaddle保存的模型参数文件内容由16字节头信息和网络参数两部分组成。头信息中,1~4字节表示PaddlePaddle版本信息,请直接填充0;5~8字节表示每个参数占用的字节数,当保存的网络参数为float类型时为4,double类型时为8;9~16字节表示保存的参数总个数。</p>
<p>将PaddlePaddle保存的模型参数还原回明文时,可以使用相应数据类型的 <code class="code docutils literal"><span class="pre">numpy.array</span></code> 加载具体网络参数,此时可以跳过PaddlePaddle模型参数文件的头信息。若在PaddlePaddle编译时,未指定按照double精度编译,默认情况下按照float精度计算,保存的参数也是float类型。这时在使用 <code class="code docutils literal"><span class="pre">numpy.array</span></code> 时,一般设置 <code class="code docutils literal"><span class="pre">dtype=float32</span></code> 。示例如下:</p>
<div class="highlight-python"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">read_parameter</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="n">width</span><span class="p">):</span>
......@@ -570,7 +574,7 @@ F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> Traine
</div>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id34">17. 如何加载预训练参数</a><a class="headerlink" href="#id10" title="永久链接至标题"></a></h2>
<h2><a class="toc-backref" href="#id35">17. 如何加载预训练参数</a><a class="headerlink" href="#id10" title="永久链接至标题"></a></h2>
<ul class="simple">
<li>对加载预训练参数的层,设置其参数属性 <code class="code docutils literal"><span class="pre">is_static=True</span></code>,使该层的参数在训练过程中保持不变。以embedding层为例,代码如下:</li>
</ul>
......@@ -591,6 +595,16 @@ F1205 <span class="m">14</span>:59:50.295174 <span class="m">14703</span> Traine
</pre></div>
</div>
</div>
<div class="section" id="id11">
<h2><a class="toc-backref" href="#id36">18. 集群多节点训练,日志中保存均为网络通信类错误</a><a class="headerlink" href="#id11" title="永久链接至标题"></a></h2>
<p>集群多节点训练,日志报错为网络通信类错误,比如 <code class="code docutils literal"><span class="pre">Connection</span> <span class="pre">reset</span> <span class="pre">by</span> <span class="pre">peer</span></code> 等。
此类报错通常是由于某一个节点的错误导致这个节点的训练进程退出,从而引发其他节点无法连接导致,可以参考下面的步骤排查:</p>
<ul class="simple">
<li><code class="code docutils literal"><span class="pre">train.log</span></code><code class="code docutils literal"><span class="pre">server.log</span></code> 找到最早报错的地方,查看是否是其他错误引发的报错(比如FPE,内存不足,磁盘空间不足等)。</li>
<li>如果发现最早的报错就是网络通信的问题,很有可能是非独占方式执行导致的端口冲突,可以联系OP,看当前MPI集群是否支持resource=full参数提交,如果支持增加此参数提交,并更换job 端口。</li>
<li>如果当前MPI集群并不支持任务独占模式,可以联系OP是否可以更换集群或升级当前集群。</li>
</ul>
</div>
</div>
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册