From 8c4172431faca600026e4a02deb930abc3fe0100 Mon Sep 17 00:00:00 2001 From: dingjiaweiww <327396238@qq.com> Date: Wed, 9 Sep 2020 17:32:30 +0800 Subject: [PATCH] update 1.8 faq (#2570) --- doc/fluid/faq/index_cn.rst | 26 +- doc/fluid/faq/inference_cn.md | 57 --- doc/fluid/faq/install_cn.md | 727 ++++------------------------------ doc/fluid/faq/others_cn.md | 20 + doc/fluid/faq/train_cn.md | 342 ++++++++-------- 5 files changed, 294 insertions(+), 878 deletions(-) delete mode 100644 doc/fluid/faq/inference_cn.md create mode 100644 doc/fluid/faq/others_cn.md diff --git a/doc/fluid/faq/index_cn.rst b/doc/fluid/faq/index_cn.rst index f44fc1474..d0c01ead4 100644 --- a/doc/fluid/faq/index_cn.rst +++ b/doc/fluid/faq/index_cn.rst @@ -1,10 +1,30 @@ ############## FAQ ############## +如果您在使用Paddle框架开发过程中遇到了使用咨询类的问题,希望快速得到官方的答疑和指导,可以先来FAQ中查阅 +FAQ模块根据用户的常见问题给出经验性的指导意见以及一些开发tips,能让您快速解决棘手问题并快速验证自己的想法。 + +FAQ以常见问答对的形式收录了用户在使用Paddle框架时的高频使用咨询类问题,包括 `安装类 <../faq/install_cn.html>`_ 、 `模型框架类 <../faq/train_cn.html>`_ 、 `其他常见问题 <../faq/others_cn.html>`_ 。 其中 `模型框架类 <../faq/train_cn.html>`_ 包含了 `数据处理 <../faq/train_cn.html#id1>`_ 、 `模型搭建 <../faq/train_cn.html#id4>`_、 `模型训练 <../faq/train_cn.html#id6>`_、 `应用预测 <../faq/train_cn.html#id14>`_、 `参数调整 <../faq/train_cn.html#id15>`_ 几类问题。 + +如果FAQ无法解决您的问题,您也可以在PaddlePaddle的 `Github Issue `_ 中进行提问,我们会有专门的技术人员为您解答。 + +FAQ问题集: +====================== + +.. toctree:: + :maxdepth: 1 + + + install_cn.md +.. toctree:: + :maxdepth: 2 + + + train_cn.md .. toctree:: :maxdepth: 1 - install_cn.rst - train_cn.rst - inference_cn.rst + + others_cn.md + diff --git a/doc/fluid/faq/inference_cn.md b/doc/fluid/faq/inference_cn.md deleted file mode 100644 index 4bff59cb4..000000000 --- a/doc/fluid/faq/inference_cn.md +++ /dev/null @@ -1,57 +0,0 @@ -# 预测引擎 - - - -## 常见问题 - -##### Q: 模型保存成功,但加载失败 - -+ 问题描述 - -VGG模型,训练时候使用`fluid.io.save_inference_model`保存模型,预测的时候使用`fluid.io.load_inference_model`加载模型文件。保存的是我自己训练的 VGG 模型。保存没问题,加载的时候报错`paddle.fluid.core.EnforceNotMet: Cannot read more from file` ? - -+ 问题解答 - -错误提示可能的原因如下,请检查。 - -1、 模型文件有损坏或缺失。 - -2、 模型参数和模型结构不匹配。 - -## 同时多模型问题 - -##### Q: 加载两个模型失败 - -+ 问题描述 - -infer时,当先后加载检测和分类两个网络时,分类网络的参数为什么未被load进去? - -+ 问题解答 - -尝试两个模型在不同的scope里面infer,使用`with fluid.scope_guard(new_scope)`,另外定义模型前加上`with fluid.unique_name.guard()`解决。 - -##### Q: 同时使用两个模型报错 - -+ 问题描述 - -两个模型都load之后,用第一个模型的时候会报错? - -+ 问题解答 - -由于用`load_inference_model`的时候会修改一些用户不可见的环境变量,所以执行后一个`load_inference_model`的时候会把前一个模型的环境变量覆盖,导致前一个模型不能用,或者说再用的时候就需要再加载一次。此时需要用如下代码保护一下,[参考详情](https://github.com/PaddlePaddle/Paddle/issues/16661)。 - -``` -xxx_scope = fluid.core.Scope() -with fluid.scope_guard(xxx_scope): - [...] = fluid.load_inference_model(...) -``` - -##### Q: 多线程预测失败 - -+ 问题描述 - -c++调用paddlepaddle多线程预测出core? - -+ 问题解答 - -Paddle predict 库里没有多线程的实现,当上游服务并发时,需要用户起多个预测服务,[参考示例](http://paddlepaddle.org/documentation/docs/zh/1.3/advanced_usage/deploy/inference/native_infer.html)。 diff --git a/doc/fluid/faq/install_cn.md b/doc/fluid/faq/install_cn.md index 2ee368b7b..31a4e8810 100644 --- a/doc/fluid/faq/install_cn.md +++ b/doc/fluid/faq/install_cn.md @@ -1,724 +1,153 @@ -# 安装与编译 +# 安装类FAQ +##### 问题:Windows环境下,使用pip install时速度慢,如何解决? ++ 解决方案: +在pip后面加上参数`-i`指定pip源,使用国内源获取安装包。 -## 下载速度慢 ++ 操作步骤: -##### Q: pip install过于缓慢 +1. Python2情况下,使用如下命令安装PaddlePaddle。 -+ 问题描述: + `pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple/` -使用pip或pip3.5/pip3.6/pip3.7 install paddlepaddle时出现下载过慢的情况 +2. Python3情况下,使用如下命令安装PaddlePaddle。 -+ 问题解答: + `pip3 install paddlepaddle -i https://mirror.baidu.com/pypi/simple/` -可以在使用pip的时候在后面加上-i参数,指定pip源,使用国内源加速: +您还可以通过如下三个地址获取pip安装包,只需修改 `-i` 后网址即可: -Python2: +https://pypi.tuna.tsinghua.edu.cn/simple +https://mirrors.aliyun.com/pypi/simple/ +https://pypi.douban.com/simple/ -`pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple/` +------ -Python3: +##### 问题:使用pip install时报错,`PermissionError: [WinError 5]` ,如何解决? -`pip3 install paddlepaddle -i https://mirror.baidu.com/pypi/simple/` ++ 问题描述: -这里也可以将 -i 后的参数换成:https://pypi.tuna.tsinghua.edu.cn/simple、https://mirrors.aliyun.com/pypi/simple/、https://pypi.douban.com/simple/ +使用pip install时报错,`PermissionError: [WinError 5]` , -##### Q: github下载耗时 +`C:\\program fiels\\python35\\Lib\\site-packages\\graphviz`。 -+ 问题描述 ++ 报错分析: -使用`git clone https://github.com/PaddlePaddle/models.git`命令下载models目录耗时数个小时 +用户权限问题导致,由于用户的Python安装到系统文件内(如”Program Files/“),任何的操作都需要管理员权限。 -+ 问题解答 ++ 解决方法: -有两种加速方法(需要管理员权限root/administration): +选择“以管理员身份运行”运行CMD,重新执行安装过程, 使用命令sudo pip install paddlepaddle -1. 编辑hosts 文件 +------ - Linux/Mac:`vim/etc/hosts` +##### 问题: 使用pip install时报错,`ERROR: No matching distribution found for paddlepaddle` ,如何解决? - Windows:双击 `C:\Windows\System32\drivers\etc\hosts` ++ 问题描述: -2. 添加下面两行内容到hosts文件中 +使用pip install时报错,`ERROR: Could not find a version that satisfies the requirement paddlepaddle (from versions: none)` - `151.101.72.249 github.global.ssl.fastly.net` +``ERROR: No matching distribution found for paddlepaddle` +![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-febb18fb78004dc17f18d60a009dc6a8bd907251) - `192.30.253.112 github.com` ++ 报错分析: +Python版本不匹配导致。用户使用的是32位Python,但是对应的32位pip没有PaddlePaddle源。 -## 环境问题 ++ 解决方法: -##### Q: 报错:libmkldnn.so not found +请用户使用64位的Python进行PaddlePaddle安装。 -+ 问题描述 +------ -paddle运行时报libmkldnn.so not found。 +##### 问题: 在GPU上执行程序报错,`Error:Segmentation fault`,如何解决? -+ 问题解答 ++ 问题描述: -请设置为 export LD_LIBRARY_PATH=/home/disk1/yitengfei/paddle_release_home/python/lib/python2.7/site-packages/paddle/libs/:$LD_LIBRARY_PATH。 注:具体请按照自己的文件路径填写。 +在GPU版本为`paddlepaddle_gpu-1.8.4.post87-cp27-cp27mu-manylinux1_x86_64.whl`的环境上执行一个程序,出现`Error:Segmentation fault`。如果将`place`修改“cpu”,则程序可正常运行。 -##### Q: CPU版本可运行,GPU版本运行失败 ++ 报错分析: -+ 问题描述 +造成该报错的原因通常是环境不匹配导致的。安装时,GPU版本为`paddlepaddle_gpu-1.8.4.post87-cp27-cp27mu-manylinux1_x86_64.whl`,`post87`表示需要在CUDA8.0、cuDNN7.0进行编译。如果机器上没有安装对应版本的CUDA和cuDNN,会导致执行程序时报错。 -版本为paddlepaddle_gpu-0.14.0.post87-cp27-cp27mu-manylinux1_x86_64.whl,跑一个简单的测试程序,出现Segmentation fault。其中 如果place为cpu,可以正常输出,改成gpu则core。 +此外值得注意的是,配置PaddlePaddle的GPU版本,不仅需要CUDA和cuDNN版本匹配,还需要与PaddlePaddle版本匹配。出现类似错误时请检查这三个程序的版本是否匹配。 -+ 问题解答 ++ 解决方法: -安装版本为`paddlepaddle_gpu-0.14.0.post87-cp27-cp27mu-manylinux1_x86_64.whl`,其中post87是指在CUDA8.0、cudnn7.0编译的,请确定您机器上是否安装了对应版本的cuDNN。造成问题描述中现象的情况通常可能是环境不匹配导致的。 +CUDA的安装可参考:https://docs.nvidia.com/cuda/archive/10.0/index.html;cuDNN的安装可参考:https://docs.nvidia.com/deeplearning/cudnn/install-guide/#install-windows。 -##### Q: 可以用 IDE 吗? +------ -+ 问题解答 +##### 问题: 本地使用import paddle时报错,`ModuleNotFoundError:No module named ‘paddle’`,如何解决? -当然可以,因为源码就在本机上。IDE 默认调用 make 之类的程序来编译源码,我们只需要配置 IDE 来调用 Docker 命令编译源码即可。 ++ 报错分析: -很多 PaddlePaddle 开发者使用 Emacs。他们在自己的 `~/.emacs` 配置文件里加两行: +原因在于用户的计算机上可能安装了多个版本的Python,而安装PaddlePaddle时的Python和import paddle时的Python版本不一致导致报错。如果用户熟悉PyCharm等常见的IDE配置包安装的方法,配置运行的方法,则可以避免此类问题。 -`global-set-key "\C-cc" 'compile` ++ 解决方法: -`setq compile-command "docker run --rm -it -v $(git rev-parse --show-toplevel):/paddle paddle:dev"` +用户明确安装Paddle的python位置,并切换到该python进行安装。可能需要使用python -m pip install paddlepaddle命令确保paddle是安装到该python中。 -就可以按 `Ctrl-C` 和 `c` 键来启动编译了。 +------ -##### Q: 可以并行编译吗? +##### 问题: 使用PaddlePaddle GPU的Docker镜像时报错, `Cuda Error: CUDA driver version is insufficient for CUDA runtime version`,如何解决? -+ 问题解答 ++ 报错分析: -是的。我们的 Docker image 运行一个 [Bash 脚本](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/scripts/paddle_build.sh)。这个脚本调用`make -j$(nproc)` 来启动和 CPU 核一样多的进程来并行编译。 +机器上的CUDA驱动偏低导致。 -##### Q: 磁盘不够? ++ 解决方法: -+ 问题解答 +需要升级CUDA驱动解决。 -在本文中的例子里,`docker run` 命令里都用了 `--rm` 参数,这样保证运行结束之后的 containers 不会保留在磁盘上。可以用 `docker ps -a` 命令看到停止后但是没有删除的 containers。`docker build` 命令有时候会产生一些中间结果,是没有名字的 images,也会占用磁盘。 +1. Ubuntu和CentOS环境,需要把相关的驱动和库映射到容器内部。如果使用GPU的docker环境,需要用nvidia-docker来运行,更多请参考nvidia-docker。 +2. Windows环境,需要升级CUDA驱动。 -## CPU +------ -### 源代码编译问题 +##### 问题: 使用PaddlePaddle时报错,`Error: no CUDA-capable device is detected`,如何解决? -#### Linux系统 ++ 报错分析: -##### Q: CentOS6下如何编译python2.7为共享库 +CUDA安装错误导致。 -+ 问题解答 ++ 解决方法: -使用以下指令: +查找“libcudart.so”所在目录,并将其添加到“LD_LIBRARY_PATH”中。 -``` -./configure --prefix=/usr/local/python2.7 --enable-shared -make && make install -``` +例如:执行`find / -name libcudart.so`, 发现libcudart.so在“/usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudart.so”路径下, 使用如下命令添加即可。 -##### Q: 安装swig后找不到swig +`export LD_LIBRARY_PATH=/usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudart.so$LD_LIBRARY_PATH` -+ 问题描述 +------ -ubuntu14编译安装时已经安装了swig,之后在虚环境中make编译时报找不到swig错误。 +##### 问题: 如何升级PaddlePaddle? -+ 问题解答 ++ 答复: -安装时没有严格按照官网安装流程的顺序安装,退出虚环境再安装一次swig。 +1. GPU环境: -##### Q: 源代码编译安装后出现版本错误 -+ 问题描述 + `pip install -U paddlepaddle-gpu` -在Liunx环境上,通过编译源码的方式安装PaddlePaddle,当安装成功后,运行 `paddle version`, 出现 `PaddlePaddle 0.0.0`? +或者 -+ 问题解答 +`pip install paddlepaddle-gpu == 需要安装的版本号(如2.0)` -如果运行 `paddle version`, 出现`PaddlePaddle 0.0.0`;或者运行 `cmake ..`,出现 +2. CPU环境: -```bash -CMake Warning at cmake/version.cmake:20 (message): -Cannot add paddle version from git tag -``` +`pip install -U paddlepaddle` -在dev分支下这个情况是正常的,在release分支下通过export PADDLE_VERSION=对应版本号来解决。 +或者 -##### Q: Ubuntu编译时大量代码段不能识别 +`pip install paddlepaddle == 需要安装的版本号(如2.0)` -+ 问题解答 +------ -这可能是由于cmake版本不匹配造成的,请在gcc的安装目录下使用以下指令: +##### 问题: 在GPU上如何选择PaddlePaddle版本? -``` -apt install gcc-4.8 g++-4.8 -cp gcc gcc.bak -cp g++ g++.bak -rm gcc -rm g++ -ln -s gcc-4.8 gcc -ln -s g++-4.8 g++ -``` ++ 答复: -#### MacOS系统 - -##### Q: 在 Windows/MacOS 上编译很慢? - -+ 问题解答 - -Docker 在 Windows 和 MacOS 都可以运行。不过实际上是运行在一个Linux虚拟机上。可能需要注意给这个虚拟机多分配一些 CPU 和内存,以保证编译高效。具体做法请参考[issue627](https://github.com/PaddlePaddle/Paddle/issues/627)。 - -##### Q: 编译develop分支代码后出现No such file or directory - -+ 问题描述 - -MacOS本地编译PaddlePaddle github上develop分支的代码出现,出现No such file or directory错误? - -+ 问题解答 - -因为此时develop分支上Generating build/.timestamp这一步涉及的代码还在进行修改,所以并不能保证稳定,建议切换回稳定分支进行编译安装。 - -可以通过执行如下命令将分支切换到0.14.0进行编译: - -```bash -cd Paddle -git checkout -b release/1.1 -cd build && rm -rf * -cmake .. -DWITH_FLUID_ONLY=ON -DWITH_GPU=OFF -DWITH_TESTING=OFF -make -j4 -``` - -编译成功后的结果如图: - -![](https://user-images.githubusercontent.com/17102274/42515418-4fb71e56-848e-11e8-81c6-da2a5553a27a.png) - -##### Q: 找不到各种module - -+ 问题描述 - -在MacOSX上从源码编译,最后`cmake ..`时 - -`Could NOT find PY_google.protobuf (missing: PY_GOOGLE.PROTOBUF) -CMake Error at cmake/FindPythonModule.cmake:27 (message): -python module google.protobuf is not found` - -若通过-D设置路径后,又会有其他的如`Could not find PY_wheel`等其他找不到的情况 - -+ 问题解答 - -![](https://cloud.githubusercontent.com/assets/728699/19915727/51f7cb68-a0ef-11e6-86cc-febf82a07602.png) - -如上,当cmake找到python解释器和python库时,如果安装了许多pythons,它总会找到不同版本的Python。在这种情况下,您应该明确选择应该使用哪个python。 -通过cmake显式设置python包。只要确保python libs和python解释器是相同的python可以解决所有这些问题。当这个python包有一些原生扩展时,例如numpy,显式set python包可能会失败。 - -##### Q: `ld terminated with signal 9 [Killed]`错误 - -+ 问题描述 - -在MacOS下,本地直接编译安装PaddlePaddle遇到`collect2: ld terminated with signal 9 [Killed]` ? - -+ 问题解答 - -该问题是由磁盘空间不足造成的,你的硬盘要有30G+的空余空间,请尝试清理出足够的磁盘空间,重新安装。 - -##### Q: Error 2 - -+ 问题描述 - -MacOS本机直接通过源码编译的方式安装PaddlePaddle出现`[paddle/fluid/platform/CMakeFiles/profiler_py_proto.dir/all] Error 2`? - -+ 报错截图 - -![](https://user-images.githubusercontent.com/17102274/42515350-28c055ce-848e-11e8-9b90-c294b375d8a4.png) - -+ 问题解答 - -使用cmake版本为3.4则可。自行编译建议GCC版本:4.8、5.4以及更高。 - -##### Q: `wget: command not found` - -+ 问题描述 - -MacOS 10.12下编译PaddlePaddle出现`/bin/sh: wget: command not found`,如何解决? - -+ 问题解答 - -报错的原因从报错输出的信息中可以发现,即没有有找到wget命令,安装wget则可,安装命令如下: - -```bash -brew install wget -``` - -##### Q: `Configuring incomplete, errors occured!` - -+ 问题描述 - -以源码方式在MacOS上安装时,出现`Configuring incomplete, errors occured!`? - -+ 问题解答 - -安装PaddlePaddle编译时需要的各种依赖则可,如下: - -```bash -pip install wheel -brew install protobuf@3.1 -pip install protobuf==3.1.0 -``` - -如果执行pip install protobuf==3.1.0时报错,输出下图内容: - -![](https://user-images.githubusercontent.com/17102274/42515286-fb7a7b76-848d-11e8-931a-a7f61bd6374b.png) - -从图中可以获得报错的关键为`Cannot uninstall 'six'`,那么解决方法就是先安装好`six`,再尝试安装`protobuf 3.1.0`如下: - -```bash -easy_install -U six -pip install protobuf==3.1.0 -``` - -##### Q: 基于Docker容器编译 VS MacOS本机编译 - -+ 问题描述 - -PaddlePaddle官方文档中,关于MacOS下安装PaddlePaddle只提及了MacOS中使用Docker环境安装PaddlePaddle的内容,没有Mac本机安装的内容? - -+ 问题解答 - -基于Docker容器编译PaddlePaddle与本机上直接编译PaddlePaddle,所使用的编译执行命令是不一样的,但是官网仅仅给出了基于Docker容器编译PaddlePaddle所执行的命令。 - -1.基于Docker容器编译PaddlePaddle,需要执行: - -```bash -# 1. 获取源码 -git clone https://github.com/PaddlePaddle/Paddle.git -cd Paddle -# 2. 可选步骤:源码中构建用于编译PaddlePaddle的Docker镜像 -docker build -t paddle:dev . -# 3. 执行下面的命令编译CPU-Only的二进制 -docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" paddlepaddle/paddle_manylinux_devel:cuda8.0_cudnn5 bash -x /paddle/paddle/scripts/paddle_build.sh build -# 4. 或者也可以使用为上述可选步骤构建的镜像(必须先执行第2步) -docker run -it -v $PWD:/paddle -e "WITH_GPU=OFF" -e "WITH_TESTING=OFF" paddle:dev -``` -2.直接在本机上编译PaddlePaddle,需要执行: -```bash -# 1. 使用virtualenvwrapper创建python虚环境并将工作空间切换到虚环境 -mkvirtualenv paddle-venv -workon paddle-venv -# 2. 获取源码 -git clone https://github.com/PaddlePaddle/Paddle.git -cd Paddle -# 3. 执行下面的命令编译CPU-Only的二进制 -mkdir build && cd build -cmake .. -DWITH_GPU=OFF -DWITH_TESTING=OFF -make -j$(nproc) -``` - -更详细的内容,请参考[官方文档](http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/install/install_MacOS.html) - -### 安装冲突 - -##### Q: Error-平台不支持 - -+ 问题描述 - -安装PaddlePaddle过程中,出现`paddlepaddle\*.whl is not a supported wheel on this platform`? - -+ 问题解答 - -`paddlepaddle\*.whl is not a supported wheel on this platform`表示你当前使用的PaddlePaddle不支持你当前使用的系统平台,即没有找到和当前系统匹配的paddlepaddle安装包。最新的paddlepaddle python安装包支持Linux x86_64和MacOS 10.12操作系统,并安装了python 2.7和pip 9.0.1。 -请先尝试安装最新的pip,方法如下: - -```bash -pip install --upgrade pip -``` - -如果还不行,可以执行 `python -c "import pip; print(pip.pep425tags.get_supported())"` 获取当前系统支持的python包的后缀, -并对比是否和正在安装的后缀一致。 - -如果系统支持的是 `linux_x86_64` 而安装包是 `manylinux1_x86_64` ,需要升级pip版本到最新; - -如果系统支持 `manylinux1_x86_64` 而安装包(本地)是 `linux_x86_64` ,可以重命名这个whl包为 `manylinux1_x86_64` 再安装。 - -##### Q: NumPy & Python冲突 - -+ 问题描述 - -因为需要安装numpy等包,但在Mac自带的Python上无法安装,权限错误导致难以将PaddlePaddle正常安装到Mac本地? - -+ 问题解答 - -Mac上对自带的Python和包有严格的权限保护,最好不要在自带的Python上安装。建议用virtualenv建立一个新的Python环境来操作。virtualenv的基本原理是将机器上的Python运行所需的运行环境完整地拷贝一份。我们可以在一台机器上制造多份拷贝,并在这多个拷贝之间自由切换,这样就相当于在一台机器上拥有了多个相互隔离、互不干扰的Python环境。 - -下面使用virtualenv为Paddle生成一个专用的Python环境。 - -安装virtualenv,virtualenv本身也是Python的一个包,可以用pip进行安装: - -``` -sudo -H pip install virtualenv -``` - -由于virtualenv需要安装给系统自带的Python,因此需要使用sudo权限。接着使用安装好的virtualenv创建一个新的Python运行环境: - -``` -virtualenv --no-site-packages paddle -``` - ---no-site-packages 参数表示不拷贝已有的任何第三方包,创造一个完全干净的新Python环境。后面的paddle是我们为这个新创建的环境取的名字。执行完这一步后,当前目录下应该会出现一个名为paddle(或者你取的其他名字)的目录。这个目录里保存了运行一个Python环境所需要的各种文件。 -启动运行环境: - -``` -source paddle/bin/activate -``` - -执行后会发现命令提示符前面增加了(paddle)字样,说明已经成功启动了名为‘paddle’的Python环境。执行which python,可以发现使用的已经是刚刚创建的paddle目录下的Python。在这个环境中,我们可以自由地进行PaddlePaddle的安装、使用和开发工作,无需担心对系统自带Python的影响。 -如果我们经常使用Paddle这个环境,我们每次打开终端后都需要执行一下source paddle/bin/activate来启动环境,比较繁琐。为了简便,可以修改终端的配置文件,来让终端每次启动后自动启动特定的Python环境。 -执行: - -``` -vi ~/.bash_profile -``` - -打开终端配置文件,并在文件的最后添加一行: - -``` -source paddle/bin/activate -``` - -这样,每次打开终端时就会自动启动名为‘paddle’的Python环境了。 - -### 安装后无法使用 - -##### Q: 安装后无法import paddle.fluid - -+ 问题描述 - -MacOS下安装PaddlePaddle后import paddle.fluid出现`Fatal Python error: PyThreadState_Get: no current thread running`错误 - -+ 问题解答 - -For Python2.7.x (install by brew): 请使用`export LD_LIBRARY_PATH=/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7 && export DYLD_LIBRARY_PATH=/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7` - -For Python2.7.x (install by Python.org): 请使用`export LD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/2.7 && export DYLD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/2.7` - -For Python3.5.x (install by Python.org): 请使用`export LD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/3.5/ && export DYLD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/3.5/` - -##### Q: CPU版本训练中自动退出 - -+ 问题描述 - -成功安装了PaddlePaddle CPU版本后,使用Paddle训练模型,训练过程中,Paddle会自动退出,gdb显示Illegal instruction? - -+ 问题解答 - -CPU版本PaddlePaddle自动退出的原因通常是因为所在机器不支持AVX2指令集而主动abort。简单的判断方法: -用gdb-7.9以上版本(因编译C++文件用的工具集是gcc-4.8.2,目前只知道gdb-7.9这个版本可以debug gcc4编译出来的目标文件): - -```bash -$ /path/to/gdb -iex "set auto-load safe-path /" -iex "set solib-search-path /path/to/gcc-4/lib" /path/to/python -c core.xxx -``` - -在gdb界面: - -```bash -(gdb) disas -``` - -找到箭头所指的指令,例如: - -```bash - 0x00007f381ae4b90d <+3101>: test %r8,%r8 -=> 0x00007f381ae4b912 <+3106>: vbroadcastss %xmm0,%ymm1 - 0x00007f381ae4b917 <+3111>: lea (%r12,%rdx,4),%rdi -``` - -然后google一下这个指令需要的指令集。上面例子中的带xmm和ymm操作数的vbroadcastss指令只在AVX2中支持 -然后看下自己的CPU是否支持该指令集 - -```bash -cat /proc/cpuinfo | grep flags | uniq | grep avx --color -``` - -如果没有AVX2,就表示确实是指令集不支持引起的主动abort。 - -如果没有AVX2指令集,就需要要安装不支持AVX2指令集版本的PaddlePaddle,默认安装的PaddlePaddle是支持AVX2指令集的,因为AVX2可以加速模型训练的过程,更多细节可以参考[安装文档](http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/install/index_cn.html)。 - -##### Q: Python相关单元测试失败 - -+ 问题描述 - -安装完了PaddlePaddle后,出现以下python相关的单元测试都过不了的情况: - -``` -24 - test_PyDataProvider (Failed) -26 - test_RecurrentGradientMachine (Failed) -27 - test_NetworkCompare (Failed) -28 - test_PyDataProvider2 (Failed) -32 - test_Prediction (Failed) -33 - test_Compare (Failed) -34 - test_Trainer (Failed) -35 - test_TrainerOnePass (Failed) -36 - test_CompareTwoNets (Failed) -37 - test_CompareTwoOpts (Failed) -38 - test_CompareSparse (Failed) -39 - test_recurrent_machine_generation (Failed) -40 - test_PyDataProviderWrapper (Failed) -41 - test_config_parser (Failed) -42 - test_swig_api (Failed) -43 - layers_test (Failed) -``` - -并且查询PaddlePaddle单元测试的日志,提示: - -``` -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'. -``` - -+ 问题解答 - -卸载PaddlePaddle包 `pip uninstall paddle`, 清理掉老旧的PaddlePaddle安装包,使得单元测试有一个干净的环境。如果PaddlePaddle包已经在python的site-packages里面,单元测试会引用site-packages里面的python包,而不是源码目录里 `/python` 目录下的python包。同时,即便设置 `PYTHONPATH` 到 `/python` 也没用,因为python的搜索路径是优先已经安装的python包。 - - - -## GPU - -### 安装过程中报错 - -##### Q: Error: no CUDA-capable device is detected - -+ 问题描述 - -使用paddle时出现no CUDA-capable device is detected错误 - -+ 问题解答 - -没装对cuda。建议查找libcudart.so在哪个目录下,并将其加到LD_LIBRARY_PATH中。例如: find / -name libcudart.so, 可以发现libcudart.so在/usr/local/cuda-8.0/targets/x86_64-linux/lib/libcudart.so, 然后使用命令export LD_LIBRARY_PATH=/usr/local/cuda-8.0/targets/x86_64-linux/lib/libcudart.so$LD_LIBRARY_PATH即可 - -##### Q: Error: after cudaFuncGetAttributes: invalid device function - -+ 问题描述 - -在A机器上编译的paddle,在B机器上跑报错Runtime Error: function_attributes(): after cudaFuncGetAttributes: invalid device function - -+ 问题解答 - -应该是在A上编译的时候选择的GPU的架构与B机器上的GPU架构不兼容,建议用户在B上重新编译 - -##### Q: Error: Can not load core_noavx.* .ImportError - -+ 问题描述 - -为了更好的支持paddle安装包在不同指令集(AVX和没有AVX)的机器上运行,近期对paddle核心core文件进行了修改(有重命名),可能会导致开发者遇到类似如下warning或者错误: - -``` -WARNING: Can not import avx core. You may not build with AVX, but AVX is supported on local machine, you could build paddle WITH_AVX=ON to get bettwe performance. Error: Can not load core_noavx.* .ImportError -``` -+ 问题解读 - -这条信息分为2个,前者是warning,是追求性能的warning,普通情况可以忽略。后者是,Error:往后才是导致不能继续运行的地方。 - -+ 问题解答 - -1. 更新最新代码,如上图的错误代表您还不是最新代码,请更新之后尝试。 - -2. 如果您机器上之前本来就安装有paddlepaddle,请使用pip install -U paddlepaddle, 加上-U选项明确代表升级。 - -3. 如果问题还存在,可能问题原因是之前build缓存没有删除导致,可以make clean,删除build目录下的python目录从而删除原有缓存,重新编译安装即可。 - -4. 如果仍然有问题,当然,通常到这里就已经不是paddle本身的问题了,并且该错误跟AVX本身没有任何关系,请怀疑下您的运行环境是否和编译环境一致,包括glibc,python版本等信息。或者,是您的加了什么代码,没有正确加到pybind导致的错误。 - 1. 请仔细查看错误信息,会提示缺失或者load错误的原因。 - 2. 请确认安装后的python目录下(通常会在/usr/local/lib/python2.7/dist-packages/paddle/fluid)中是否有core_avx.so或者core_noavx.so,这两文件其中一个,或者两个都有。如果都没有,或者只有core.so那说明第一和二步没有正确执行。并请仔细查看python输出的load失败的报错信息。通常这个是因为编译和运行不在一个环境导致的错误,比如glibc版本不匹配等,这个与本次升级无关。 - -##### Q: 报错“nccl.h找不到” - -+ 问题解答: - -请[安装nccl2](https://developer.nvidia.com/nccl/nccl-download) - -#### 安装过程中cuDNN报错 - -##### Q: CUDNN_STATUS_NOT_INITIALIZED - -+ 问题描述 - -遇到如下cuDNN报错如何解决? - -``` -CUDNN_STATUS_NOT_INITIALIZED at [/paddle/paddle/fluid/platform/device_context.cc:216] -``` - -+ 问题解答 - -cuDNN与CUDA版本不一致导致。PIP安装的GPU版本默认使用CUDA 9.0和cuDNN 7编译,请根据您的环境配置选择在官网首页选择对应的安装包进行安装,例如paddlepaddle-gpu==1.2.0.post87 代表使用CUDA 8.0和cuDNN 7编译的1.2.0版本。 - -#### 安装过程中CUDA报错 - -##### Q: cuda9.0对应paddle版本 - -+ 问题描述 -cuda9.0需要安装哪一个版本的paddle,安装包在哪? - -+ 问题解答 - -`pip install paddlepaddle-gpu`命令将安装支持CUDA 9.0 cuDNN v7的PaddlePaddle,可以参考[安装说明文档](http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/install/index_cn.html) - -##### Q: driver version is insufficient for runtime version - -+ 问题描述 - -在使用PaddlePaddle GPU的Docker镜像的时候,出现 `Cuda Error: CUDA driver version is insufficient for CUDA runtime version`? - -+ 问题解答 - -通常出现 `Cuda Error: CUDA driver version is insufficient for CUDA runtime version`, 原因在于机器上CUDA驱动偏低,需要升级CUDA驱动加以解决。 - -Ubuntu和CentOS环境,可以把相关的驱动和库映射到容器内部。 -Windows环境,需要升级CUDA驱动。 - -Ubuntu和CentOS下如果使用GPU的docker环境,需要用nvidia-docker来运行。 - -更多请参考[nvidia-docker](https://github.com/NVIDIA/nvidia-docker) - -#### Docker - -使用Docker出现编译错误,请额外参照GitHub上[Issue12079](https://github.com/PaddlePaddle/Paddle/issues/12079) - -##### Q: 无法下载golang - -+ 问题描述 - -根据官方文档中提供的步骤安装Docker,无法下载需要的golang,导致`tar: Error is not recoverable: exiting now`? - -+ 报错截图 - -![](https://user-images.githubusercontent.com/17102274/42516245-314346be-8490-11e8-85cc-eb95e9f0e02c.png) - -+ 问题解答 - -由上图可知,生成docker镜像时需要下载[golang](https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz),使用者需要保证电脑可以科学上网。 - -选择下载并使用docker.paddlepaddlehub.com/paddle:latest-devdocker镜像,执行命令如下: - -``` -git clone https://github.com/PaddlePaddle/Paddle.git -cd Paddle -git checkout -b 0.14.0 origin/release/0.14.0 -sudo docker run --name paddle-test -v $PWD:/paddle --network=host -it docker.paddlepaddlehub.com/paddle:latest-dev /bin/bash -``` - -进入docker编译GPU版本的PaddlePaddle,执行命令如下: - -``` -mkdir build && cd build -# 编译GPU版本的PaddlePaddle -cmake .. -DWITH_FLUID_ONLY=ON -DWITH_GPU=ON -DWITH_TESTING=ON -make -j$(nproc) -``` - -通过上面的方式操作后: - -![](https://user-images.githubusercontent.com/17102274/42516287-46ccae8a-8490-11e8-9186-985efff3629c.png) - -接着安装PaddlePaddle并运行线性回归test_fit_a_line.py程序测试一下PaddlePaddle是安装成功则可 - -```bash -pip install build/python/dist/*.whl -python python/paddle/fluid/tests/book/test_fit_a_line.py -``` - -##### Q: 在Docker镜像上,GPU版本的PaddlePaddle运行结果报错 - -+ 问题描述 - -![](https://user-images.githubusercontent.com/17102274/42516300-50f04f8e-8490-11e8-95f1-613d3d3f6ca6.png) - -![](https://user-images.githubusercontent.com/17102274/42516303-5594bd22-8490-11e8-8c01-55741484f126.png) - -+ 问题解答 - -使用`sudo docker run --name paddle-test -v $PWD:/paddle --network=host -it docker.paddlepaddlehub.com/paddle:latest-dev /bin/bash`命令创建的docker容器仅能支持运行CPU版本的PaddlePaddle。 -使用如下命令重新开启支持GPU运行的docker容器: - -``` -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 {}:{}') -sudo docker run ${CUDA_SO} ${DEVICES} --rm --name paddle-test-gpu -v /usr/bin/nvidia-smi:/usr/bin/nvidia-smi -v $PWD:/paddle --network=host -it docker.paddlepaddlehub.com/paddle:latest-dev /bin/bash -``` - -进入docker之后执行如下命令进行PaddlePaddle的安装及测试运行: - -``` -export LD_LIBRARY_PATH=/usr/lib64:/usr/local/lib:$LD_LIBRARY_PATH -pip install build/python/dist/*.whl -python python/paddle/fluid/tests/book/test_fit_a_line.py -``` - -### 安装后无法使用 - -##### Q: GPU安装成功,无法import - -+ 问题描述 - -使用 `sudo nvidia-docker run --name Paddle -it -v $PWD:/work hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda8.0-cudnn7 /bin/bash`,安装成功后,出现如下问题 - -``` -import paddle.fluid -*** Aborted at 1539682149 (unix time) try "date -d @1539682149" if you are using GNU date *** -PC: @ 0x0 (unknown) -*** SIGILL (@0x7f6ac6ea9436) received by PID 16 (TID 0x7f6b07bc7700) from PID 18446744072751846454; stack trace: *** -``` - -+ 问题解答 - -请先确定一下机器是否支持AVX2指令集,如果不支持,请按照相应的不支持AVX2指令集的PaddlePaddle,可以解决该问题。 - -##### Q: 曾经运行成功,现在运行失败 - -+ 问题描述 - -使用 `pip install paddlepaddle-gpu==0.14.0.post87`命令在公司内部开发GPU机器上安装PaddlePaddle,按照官网安装:pip install paddlepaddle-gpu==0.14.0.post87,执行 import paddle.fluid as fluid 失败。奇怪的是,同样的环境下,上周运行成功,这周确运行失败,求解答? - -+ 问题解答 - -这通常是GPU显存不足导致的,请检查一下机器的显存,确保显存足够后再尝试import paddle.fluid - -##### Q: 安装成功后,示例运行失败 -+ 问题描述 - -安装的是cuda9.0和cudnn7.0,默认安装的是0.14.0.post87,训练一个手写数据那个例子的时候报错? - -+ 问题解答 - -该问题通常是GPU显存不足造成的,请在显存充足的GPU服务器上再次尝试则可。可以检查一下机器的显存使用情况。 - -方法如下: - -```bash -test@test:~$ nvidia-smi -Tue Jul 24 08:24:22 2018 -+-----------------------------------------------------------------------------+ -| NVIDIA-SMI 384.130 Driver Version: 384.130 | -|-------------------------------+----------------------+----------------------+ -| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | -| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | -|===============================+======================+======================| -| 0 GeForce GTX 960 Off | 00000000:01:00.0 On | N/A | -| 22% 52C P2 100W / 120W | 1757MiB / 1994MiB | 98% Default | -+-------------------------------+----------------------+----------------------+ - -+-----------------------------------------------------------------------------+ -| Processes: GPU Memory | -| GPU PID Type Process name Usage | -|=============================================================================| -| 0 1071 G /usr/lib/xorg/Xorg 314MiB | -| 0 1622 G compiz 149MiB | -| 0 2201 G fcitx-qimpanel 7MiB | -| 0 15304 G ...-token=58D78B2D4A63DAE7ED838021B2136723 74MiB | -| 0 15598 C python 1197MiB | -+-----------------------------------------------------------------------------+ -``` - -## 卸载问题 - -##### Q: 报错`Cannot uninstall 'six'.` - -+ 问题描述 - -此问题可能与系统中已有Python有关,请使用`pip install paddlepaddle --ignore-installed six`(CPU)或`pip install paddlepaddle --ignore-installed six`(GPU)解决 +pip install paddlepaddle-gpu==需要安装的版本号+'.post'+CUDA主版本+CUDNN主版本 例:pip install paddlepaddle-gpu==1.8.4.post97表示需要在CUDA9.0、cuDNN7.0进行安装。更多安装信息请见官网:https://www.paddlepaddle.org.cn/start diff --git a/doc/fluid/faq/others_cn.md b/doc/fluid/faq/others_cn.md new file mode 100644 index 000000000..8842edfc3 --- /dev/null +++ b/doc/fluid/faq/others_cn.md @@ -0,0 +1,20 @@ +# 其他常见问题 + + +##### 问题:import paddle.fluid后logging模块无法使用,如何解决? + ++ 答复:操作方法可以参考[#issue17731](https://github.com/PaddlePaddle/Paddle/issues/17731)。 + +---------- + +##### 问题:使用X2paddle 从Caffe 转Paddle model时,报错 `TypeError: __new__() got an unexpected keyword argument 'serialized_options'` ,如何处理? + ++ 答复:这是由于ProtoBuf版本较低导致,将protobuf升级到3.6.0即可解决。 + +---------- + +##### 问题:Windows环境下,出现"Windows not support stack backtrace yet",如何处理? + ++ 答复:Windows环境下,遇到程序报错不会详细跟踪内存报错内容。这些信息对底层开发者更有帮助,普通开发者不必关心这类警告。如果想得到完整内存追踪错误信息,可以尝试更换至Linux系统。 + +---------- diff --git a/doc/fluid/faq/train_cn.md b/doc/fluid/faq/train_cn.md index f7964402a..39c2c7d00 100644 --- a/doc/fluid/faq/train_cn.md +++ b/doc/fluid/faq/train_cn.md @@ -1,314 +1,318 @@ -# 网络搭建及训练 +# 框架类FAQ +## 数据处理 -## 模型介绍 +##### 问题:如何处理图片小但数量很大的数据集? -##### Q: sigmoid中num_classes意义? ++ 答复:`multiprocess_reader`可以解决该问题,具体可参考[Github示例](https://github.com/PaddlePaddle/Paddle/issues/16592)。 -+ 问题描述 +---------- -sigmoid二分类,`sigmoid_cross_entropy_with_logits`,其中num_classes的意义是什么? +##### 问题:使用`py_reader`读取数据时,如何给变量命名? -+ 问题解答 ++ 答复:可以通过设置里面的name变量。具体方法请参考飞桨[create_py_reader_by_data](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.3/api_cn/layers_cn.html#create-py-reader-by-data) API。 -`sigmoid_cross_entropy_with_logits`里面的num_classes是指有多个分类标签,而且这些标签之间相互独立,这样对每个分类都会有一个预测概率。举个例子,假如我们要做一个视频动作分类,有如下几个标签(吃饭,聊天,走路,打球),那么num_classes = 4。一个视频可以同时有多个ground truth标签是1,比如这里可能是(1, 1, 0, 0),也就是一边吃饭一边聊天的场景。而一个可能的预测概率是(0.8, 0.9, 0.1, 0.3),那么计算损失函数的时候,要对每个分类标签分别计算`sigmoid cross entropy`。 +---------- -##### Q:proto信息解释文档? +##### 问题:使用多卡或多GPU进行数据并行时,如何设置异步数据读取? -+ 问题描述 ++ 答复:使用多卡或多GPU进行数据并行时,需要设置:`places = fluid.cuda_places() if USE_CUDA else fluid.cpu_places(CPU_NUM)`,具体内容可以参考文档:[异步数据读取](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/user_guides/howto/prepare_data/use_py_reader.html) 。 -PaddlePaddle的proto信息相关的解释文档? +---------- -+ 问题解答 +##### 问题:使用`paddle.dataset.mnist.train()`获得数据后,如何转换为可操作的Tensor? -proto信息可以打印出来,然后参考Github [framework.prot](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/framework/framework.proto)文件进行解释。 ++ 答复:执行`fluid.dygraph.to_varibale()`,将data数据转化为可以操作的动态图Tensor。 +---------- -## 模型调用 +##### 问题:如何给图片添加一个通道数,并进行训练? -##### Q: 如何不训练某层的权重? ++ 答复:执行`np.expand_dims`增加维度后再reshape。如果需要通道合并,可以执行`fluid.layers.concat()`。 -+ 问题解答 +---------- -ParamAttr里配置`learning_rate=0`。 +##### 问题:`paddle.fluid.layers.py_reader`和`fluid.io.PyReader`有什么区别? -##### Q: 根据输出结束模型运行? ++ 答复:两个都是异步的。推荐使用`fluid.io.PyReader`。 -+ 问题描述 +---------- -PaddlePaddle可以像tf一样根据输出,只执行模型的一部分么? +##### 问题:有拓展Tensor维度的Op吗? -+ 问题解答 ++ 答复:有的,操作方法请参考[unsqueeze op](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/layers_cn/unsqueeze_cn.html) 。 -目前的executor会执行整个program。建议做法是,在定义program的时候提前clone出一个子program,如当前`inference_program = fluid.default_main_program().clone(for_test=True)`的做法。 +---------- -##### Q: 遍历每一个时间布? +##### 问题:是否支持两维以上的变长tensor,如:shape[-1, -1, 128]? -+ 问题描述 ++ 答复:配置网络时`shape`可以设置为:[-1,*任意整数*,128],输入时`shape`可以设置为:[*任意整数,**任意整数*,128]。维度只是个占位,网络运行时的实际维度是从输入数据中推导出来的。两个"任意整数" 在输入和配置时可以不相等,但是配置网络时,第一维度必须为-1。 -在RNN模型中如何遍历序列数据里每一个时间步? +---------- -+ 问题解答 +##### 问题:如何从np.array生成一个具有Shape和DType的Tensor? -对于LodTensor数据,分步处理每一个时间步数据的需求,大部分情况可以使用`DynamicRNN`,[参考示例](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_machine_translation.py#L69) ,其中`rnn.step_input`即是每一个时间步的数据,`rnn.memory`是需要更新的rnn的hidden state,另外还有个`rnn.static_input`是rnn外部的数据在DynamicRNN内的表示(如encoder的output),可以利用这三种数据完成所需操作。 ++ 答复:具体方法可参考文档 [LoD-Tensor使用说明]( https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/user_guides/howto/basic_concept/lod_tensor.html) 。 -rank_table记录了每个sequence的长度,DynamicRNN中调用了lod_tensor_to_array在产生array时按照rank_table做了特殊处理(sequence从长到短排序后从前到后进行slice),每个时间步数据的batch size可能会缩小(短的sequence结束时),这是Fluid DynamicRNN的一些特殊之处。 -对于非LoDTensor数据,可以使用StaticRNN,用法与上面类似,参考[语言模型示例]( https://github.com/PaddlePaddle/models/blob/develop/PaddleNLP/shared_modules/models/language_model/lm_model.py#L261)。 +---------- -##### Q: NumPy读取出fc层W矩阵? +##### 问题:如何初始化一个随机数的Tensor? -+ 问题描述 ++ 答复: -PaddlePaddle中训练好的fc层参数,有没有直接用numpy 读取出fc层的W矩阵的示例代码呢? -+ 问题解答 -weight名字在构建网络的时候可以通过param_attr指定,然后用`fluid.global_scope().find_var("weight_name").get_tensor()`。 + ta = fluid.create_lod_tensor(np.random.randn(10, 5), [], fluid.CPUPlace()) -##### Q: `stop_gradient=True`影响范围? + tb = fluid.create_lod_tensor(np.ones([5, 10]), [], place) -+ 问题描述 + print(np.array(ta)) -请问fluid里面如果某一层使用`stop_gradient=True`,那么是不是这一层之前的层都会自动 `stop_gradient=True`? + print(np.array(tb)) -+ 问题解答 -是的,梯度不回传了。 -##### Q: 如何获取accuracy? +## 模型搭建 -+ 问题描述 +##### 问题:如何不训练某层的权重? -根据models里面的[ctr例子](https://github.com/PaddlePaddle/models/blob/develop/PaddleRec/ctr/dnn/infer.py)改写了一个脚本,主要在train的同时增加test过程,方便选择模型轮次,整体训练测试过程跑通,不过无法获取accuracy? ++ 答复:在`ParamAttr`里设置learning_rate=0。 -+ 问题解答 +---------- -AUC中带有LOD 信息,需要设置`return_numpy=False `来获得返回值。 +##### 问题:`stop_gradient=True`的影响范围? -##### Q: 模型运行过程中如何获取某个变量的值? ++ 答复:如果fluid里某一层使用`stop_gradient=True`,那么这一层之前的层都会自动 `stop_gradient=True`,梯度不再回传。 -+ 问题描述 +---------- -在使用Executor运行模型时,如何获取模型中某个变量的值。 +##### 问题:请问`fluid.layers.matmul`和`fluid.layers.mul`有什么区别? -+ 问题解答 ++ 答复:`matmul`支持broadcast和任意阶相乘。`mul`会把输入都转成两维去做矩阵乘。 -Executor的run方法提供了`fetch_list`参数,如果用户想获取运行模型中某个变量的值,只需要该变量添加到`fetch_list`中即可,详细用法可参考[Executor的示例](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/api_cn/executor_cn.html#executor)。 +---------- -##### Q: 图片小数量大数据集处理方法 -+ 问题描述 -对于图片小但数量很大的数据集有什么好的处理方法? +## 模型训练&评估 -+ 问题解答 +##### 问题:在CPU上进行模型训练,如何使用多线程? -`multiprocess_reader`可以解决该问题。参考[Github示例](https://github.com/PaddlePaddle/Paddle/issues/16592)。 ++ 答复:可以参考使用[ParallelExecutor API](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.3/api_cn/fluid_cn.html#parallelexecutor)。 -##### Q: Libnccl.so报错如何解决? +---------- -+ 报错信息 +##### 问题:如何提高单CPU多线程利用率? -``` -Failed to find dynamic library: libnccl.so ( libnccl.so: cannot open shared object file: No such file or directory ) -``` ++ 答复:线程数是设备同时并行执行程序的个数,可以将线程数设置为“CPU的个数*CPU的核数”。可以通过 -+ 问题解答 +`os.getenv("CPU_NUM")`或者`os.environ['CPU_NUM'] = str(2)`获取相关参数值。 -按照以下步骤做检查: +---------- -1、先确定是否安装libnccl.so +##### 问题:使用NVIDIA多卡运行Paddle时报错,`Error:NCCL ContextMap`或者`Error:hang住`(log日志打印突然卡住),如何解决? -2、确定环境变量是否配置正确 ++ 答复:参考[NCCL Tests](https://github.com/NVIDIA/nccl-tests)检测您的环境。如果检测不通过,请登录[NCCL官网](https://developer.nvidia.com/zh-cn)下载NCCl,安装后重新检测。 -``` -export LD_LIBRARY_PATH=`pwd`/nccl_2.1.4-1+cuda8.0_x86_64/lib:$LD_LIBRARY_PATH -``` +---------- -3、确定是否要配置软链 +##### 问题:多卡训练时启动失败,`Error:Out of all 4 Trainers`,如何处理? -``` -cd /usr/lib/x86_64-linux-gnu -ln -s libnccl.so.2 libnccl.so -``` ++ 问题描述:多卡训练时启动失败,显示如下信息: +![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-13d1b5df218cb40b0243d13450ab667f34aee2f7) -## 模型保存 ++ 报错分析:PaddlePaddle安装版本和多卡训练不匹配导致。 -##### Q: 保存模型API选择 ++ 解决方法:排查当前安装的PaddlePaddle是否支持并行训练。如果是开发者编译的Paddle,请在编译时打开 `WITH_DISTRIBUTE`选项。 -+ 问题描述 +---------- -请说明一下如下两个接口的适用场景,现在保存模型都不知用哪个:`save_inference_model`、`save_params`? +##### 问题:训练过程中提示显存不足,如何处理? -+ 问题解答 ++ 答复:这是一种常见情况,你可以尝试调整`batch_size`大小,也可以更改网络模型,或者参考官方文档[显存分配与优化](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/best_practice/memory_optimize.html) 。建议用户使用[AI Studio 学习与 实训社区训练](https://aistudio.baidu.com/aistudio/index),获取免费GPU算力,速度更快。 -`save_inference_model`主要是用于预测的,该API除了会保存预测时所需的模型参数,还会保存预测使用的模型结构。而`save_params`会保存一个program中的所有参数,但是不保存该program对应的模型结构。参考[模型保存与加载](http://paddlepaddle.org/documentation/docs/zh/1.4/api_guides/low_level/model_save_reader.html) +---------- -##### Q: 保存模型报错 +##### 问题:GPU显存占用过高,如何解决? -+ 问题描述 ++ 答复:建议调整 `FLAGS_fraction_of_gpu_memory_to_use` ,并检查`batch_size` 。通过设置较小的`batch_size`能降低显存消耗;`FLAGS_fraction_of_gpu_memory_to_use`默认值为 =0.92, 当申请不到需要的显存时会直接报内存不足。如遇到此情况,可以先检查一下GPU卡是否被占用,再设置较小的值,以启动程序。 -CTR模型保存模型时报错 +---------- -+ 代码文件:[network_conf.py](https://github.com/PaddlePaddle/models/blob/develop/PaddleRec/ctr/dnn/network_conf.py)只修改了最后一行: +##### 问题:GPU内存不足,报错 `Error:Out of memory error GPU`,如何处理? -``` -accuracy = fluid.layers.accuracy(input=predict, label=words[-1]) -auc_var, batch_auc_var, auc_states = \ - fluid.layers.auc(input=predict, label=words[-1], num_thresholds=2 ** 12, slide_steps=20) -return accuracy, avg_cost, auc_var, batch_auc_var, py_reader -``` ++ 问题描述: -+ 问题解答 +![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-3cbc8370534cb998f321af9b32aa2859403d9c9d) -保存模型时需指定program 才能正确保存。请使用`executor = Executor(place)`, 你的train_program, 以及给`layers.data`指定的名称作为`save_inference_model` 的输入。 ++ 解决方案: + 1. 检查是当前模型是否占用内存过高,可尝试减小`batch_size` ; + 2. 开启以下三个选项: + `#一旦不再使用即释放内存垃圾,=1.0 垃圾占用内存大小达到10G时,释放内存垃圾` + `export FLAGS_eager_delete_tensor_gb=0.0` + `#启用快速垃圾回收策略,不等待cuda kernel 结束,直接释放显存` + `export FLAGS_fast_eager_deletion_mode=1` + `#该环境变量设置只占用0%的显存` + `export FLAGS_fraction_of_gpu_memory_to_use=0` -## 参数相关 +---------- -##### Q: 本地数据传入embedding的参数矩阵 +##### 问题:如何提升模型训练时的GPU利用率? -+ 问题描述 ++ 答复:有如下两点建议: -如何将本地数据传入embedding的参数矩阵中? + 1. 如果数据预处理耗时较长,可使用py_Reader 或 multiprocess_reader加速; -+ 问题解答 + 2. 如果提高GPU计算量,可以增加`batch_size`,但是注意调节其他超参数。 -需将本地词典向量读取为numpy数据格式,然后使用fluid.initializer.NumpyArrayInitializer这个op初始化fluid.layers.embedding里的param_attr参数。即可实现加载用户自定义(或预训练)的embedding向量。 + 以上两点均为比较通用的方案,其他的优化方案和模型相关,可参考相应models示例。 -##### Q: 如何查看w和b的值 +---------- -+ 问题描述 +##### 问题:使用CPU或GPU时,如何设置`num_threds`? -如何查看paddle.fluid.layers.fc生成的w和b的值? ++ 答复: -+ 问题解答 + 1. 如果是CPU,最大可以设置到当前CPU的内核数。 + 2. 如果是GPU,受显卡多处理器的寄存器数目限制,例如GeForce 8800GT的显卡,最多8192个寄存器。假设每个线程需要的寄存器等于16,则最多只有512个线程。再高的线程将会将数据切换的显卡显存,反而降低执行效率。 -可以通过param_t = fluid.global_scope().find_var(param_name).get_tensor()查看, -param_name可以自己指定,如果不知道的话,可以通过 param_list = fluid.framework.default_main_program().block(0).all_parameters() 看一下。 +---------- -##### Q: 共享向量权重 +##### 问题:如何处理变长ID导致程序内存占用过大的问题? -+ 问题描述 ++ 答复:请先参考[显存分配与优化文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/best_practice/memory_optimize.html) 开启存储优化开关,包括显存垃圾及时回收和Op内部的输出复用输入等。若存储空间仍然不够,建议: -fluid.layers.embedding中如何实现多个feature间共享该层的向量权重? + 1. 降低`batch_size`; + 2. 对index进行排序,减少padding的数量。 -+ 问题解答 +---------- -将所有embedding层中param_attr参数里的name设置为同一个,即可实现共享向量权重。如`param_attr=fluid.ParamAttr(name="word_embedding")`。 +##### 问题:Executor与ParallelExecutor有什么区别? -##### Q: 手动输入参数并改变? ++ 答复:如果没有指定Scope,所有的Executor都会共享一个Scope,即`global_scope`。 -+ 问题描述 +1. `fluid.Executor`执行对象是Program,可以认为是一个轻量级的执行器,目前主要用于参数初始化、参数加载、参数模型保存。 -PaddlePaddle的全连接层,可不可以手动输入参数比如weights和bias并禁止优化器比如optimizer.SGD在模型训练的时候改变它? +2. `fluid.ParallelExecutor`的执行对象是Graph,ParallelExecutor内部会将Program转为Graph,这样更便于对模型进行分析。 -+ 问题解答 +---------- -可以通过ParamAttr设置参数的属性,`fluid.ParamAttr( initializer=fluid.initializer.Normal(0.0, 0.02), learning_rate=2.0)`,其中learning_rate设置为0,就不会修改。手动输入参数也可以实现,但是会比较麻烦。 +##### 问题:训练过程中如果出现不收敛的情况,如何处理? -##### Q: `fluid.unique_name.guard()`影响范围 ++ 答复:不收敛的原因有很多,可以参考如下方式排查: -+ 问题描述 + 1. 检查数据集中训练数据的准确率,数据是否有很多错误,特征是否归一化; + 2. 简化网络结构,先基于benchmark实验,确保在baseline网络结构和数据集上的收敛结果正确; + 3. 对于复杂的网络,每次只增加一个改动,确保改动后的网络正确; + 4. 检查网络在训练数据上的Loss是否下降; + 5. 检查学习率、优化算法是否合适,学习率过大会导致不收敛; + 6. 检查`batch_size`设置是否合适,`batch_size`过小会导致不收敛; + 7. 检查梯度计算是否正确,是否有梯度过大的情况,是否为NaN。 -batch norm 里面的两个参数:moving_mean_name、moving_variance_name应该是两个var,但是他们却没有受到 `with fluid.unique_name.guard()` 的影响,导致名字重复? +---------- -+ 问题解答 +##### 问题:Loss为NaN,如何处理? -用户指定的name的优先级高于unique_name生成器,所以名字不会被改变。 ++ 答复:可能由于网络的设计问题,Loss过大(Loss为NaN)会导致梯度爆炸。如果没有改网络结构,但是出现了NaN,可能是数据读取导致,比如标签对应关系错误。 -##### Q: 2fc层共享参数? +---------- -+ 问题描述 +##### 问题:在AI Studio上使用GPU训练时报错 `Attempt to use GPU for prediction, but environment variable CUDA_VISIBLE_DEVICES was not set correctly.`,如何处理? -怎么配置让两个fc层共享参数? ++ 答复:需要在Notebook环境中增加:`%set_env CUDA_VISIBLE_DEVICES=0`。 -+ 问题解答 +---------- -只要指定param_attr相同名字即可,是`param_attr = fluid.ParamAttr(name='fc_share')`,然后把param_attr传到fc里去。 +##### 问题:使用GPU训练时报错,`Error:incompatible constructor arguments.`,如何处理? ++ 问题描述: + ![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-3779aa5b33dbe1f05ba2bfeabb2d22d4270d1929) -## LoD-Tensor数据结构相关 ++ 报错分析:`CUDAPlace()`接口没有指定GPU的ID编号导致。 -##### Q: 拓展tensor纬度 ++ 答复:CUDAPlace()接口需要指定GPU的ID编号,接口使用方法参见:[paddle.fluid.CUDAPlace](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/CUDAPlace_cn.html)。 -+ 问题描述 +---------- -PaddlePaddle有拓展tensor维度的op吗? +##### 问题:增量训练中,如何保存模型和恢复训练? -+ 问题解答 ++ 答复:在增量训练过程中,不仅需要保存模型的参数,也需要保存模型训练的状态(如learning_rate)。使用[save_persistables](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/api_cn/dygraph_cn.html#save-persistables)保存模型训练的参数和状态;恢复训练时,使用[load_persistables](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/api_cn/dygraph_cn.html#load-persistables)进行恢复训练。 -请参[unsqueeze op](http://paddlepaddle.org/documentation/docs/zh/1.3/api/layers.html#unsqueeze),例如[1,2]拓展为[1,2,1] +---------- -##### Q: 多维变长tensor? +##### 问题:训练后的模型很大,如何压缩? -+ 问题描述 ++ 答复:建议您使用飞桨模型压缩工具[PaddleSlim](https://www.paddlepaddle.org.cn/tutorials/projectdetail/489539)。PaddleSlim是飞桨开源的模型压缩工具库,包含模型剪裁、定点量化、知识蒸馏、超参搜索和模型结构搜索等一系列模型压缩策略,专注于**模型小型化技术**。 -PaddlePaddle是否支持两维以上的变长tensor,如shape[-1, -1, 128]? +---------- -+ 问题解答 -配置网络的时候可以将shape写成[-1,任意正数,128],然后输入的时候shape可以为[任意正数,任意正数,128]。维度只是个占位,运行网络的时候的实际维度是从输入数据推导出来的。两个"任意整数" 在输入和配置的时候可以不相等。配置网络的时候第一维度必须为-1。 -##### Q: vector -> LodTensor +## 应用预测 -+ 问题描述 +##### 问题:load_inference_model在加载预测模型时能否用py_reader读取? -C++ 如何把std::vector转换成LodTensor的方法? ++ 答复:目前`load_inference_model`加载进行的模型还不支持py_reader输入。 -+ 问题解答 +---------- -如下示例 -```cpp -std::vector ids{1918, 117, 55, 97, 1352, 4272, 1656, 903}; -framework::LoDTensor words; -auto size = static_cast(ids.size()); -framework::LoD lod{{0, ids.size()}}; -DDim dims{size, 1}; -words.Resize(dims); -words.set_lod(lod); -auto *pdata = words.mutable_data(); -size_t n = words.numel() * sizeof(int64_t); -memcpy(pdata, ids.data(), n); -``` -##### Q: 报错holder should not be null +## 参数调整 -+ 错误信息 +##### 问题:如何将本地数据传入`fluid.dygraph.Embedding`的参数矩阵中? -``` -C++ Callstacks: -holder should not be null -Tensor not initialized yet when Tensor::type() is called. at [/paddle/paddle/fluid/framework/tensor.h:145] -PaddlePaddle Call Stacks: -``` ++ 答复:需将本地词典向量读取为NumPy数据格式,然后使用`fluid.initializer.NumpyArrayInitializer`这个op初始化`fluid.dygraph.Embedding`里的`param_attr`参数,即可实现加载用户自定义(或预训练)的Embedding向量。 -+ 问题解答 +------ -错误提示是某个tensor为空。建议运行时加上环境变量GLOG_vmodule=operator=4 , GLOG_logtostderr=1看看运行到哪个op,哪个tensor为空。 +##### 问题:如何实现网络层中多个feature间共享该层的向量权重? ++ 答复:将所有网络层中`param_attr`参数里的`name`设置为同一个,即可实现共享向量权重。如使用embedding层时,可以设置`param_attr=fluid.ParamAttr(name="word_embedding")`,然后把param_attr传入embedding中。 -## pyreader +---------- -##### Q: 加载模型时pyreader使用 +##### 问题:如何修改全连接层参数,如:weights、bias、optimizer.SGD? -+ 问题描述 ++ 答复:可以通过`param_attr`设置参数的属性,`fluid.ParamAttr( initializer=fluid.initializer.Normal(0.0, 0.02), learning_rate=2.0)`,如果`learning_rate`设置为0,该层就不参与训练。手动输入参数也可以实现,但是会比较麻烦。 -调用`save_inference_model`后,`load_inference_model`加载预测模型的时候用py_reader读取,`feeded_var_names`为空也无法通过feed输入了。py_reader此刻应该如何声明? +---------- -+ 问题解答 +##### 问题:使用optimizer或ParamAttr设置的正则化和学习率,二者什么差异? -目前`load_inference_model`加载进行的模型还不支持py_reader输入。 ++ 答复:ParamAttr中定义的`regularizer`优先级更高。若ParamAttr中定义了`regularizer`,则忽略Optimizer中的`regularizer`;否则,则使用Optimizer中的`regularizer`。学习率的设置也可以参考此方式。 -##### Q: 变量取名 +---------- -+ 问题描述 +##### 问题:如何导出指定层的权重,如导出最后一层的*weights*和*bias*? -使用py_reader读取数据的时候,怎么给读取的变量指定名字呢? ++ 答复:使用`save_vars`保存指定的vars,然后使用`load_vars`加载对应层的参数值。具体示例请见API文档:[load_vars](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/load_vars_cn.html#load-vars) 和 [save_vars](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/save_vars_cn.html#save-vars) 。 -+ 问题解答 +---------- -参考[create_py_reader_by_data](http://paddlepaddle.org/documentation/docs/zh/1.3/api_cn/layers_cn.html#create-py-reader-by-data) +##### 问题:训练过程中如何固定网络和Batch Normalization(BN)? + ++ 答复: + +1. 对于固定BN:设置 `use_global_stats=True`,使用已加载的全局均值和方差:`global mean/variance`,具体内容可查看官网文档[BatchNorm](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dygraph_cn/BatchNorm_cn.html)。 + +2. 对于固定网络层:如: stage1→ stage2 → stage3 ,设置stage2的输出,假设为*y*,设置 `y.stop_gradient=True`,那么, stage1→ stage2整体都固定了,不再更新。 + +---------- + +##### 问题:优化器设置时报错`AttributeError: parameter_list argument given to the Optimizer should not be None in dygraph mode.`,如何处理? + ++ 错误分析:必选参数缺失导致。 + ++ 答复:飞桨1.7版本之后需要在optimizer的设置中加入必选项`param_list`。 + +---------- + +##### 问题:`fluid.layer.pool2d`的全局池化参数和设置参数有关系么? + ++ 答复:如果设置`global_pooling`,则设置的`pool_size`将忽略,不会产生影响。 + +---------- -- GitLab