提交 4b5286c5 编写于 作者: L LielinJiang

update faq

上级 f0e64cd0
......@@ -99,17 +99,10 @@
##### 问题:在CPU上进行模型训练,如何使用多线程?
+ 答复:可以参考使用[ParallelExecutor API](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.3/api_cn/fluid_cn.html#parallelexecutor)
+ 答复:可以参考使用[CompiledProgram API 中的with_data_parallel方法](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/CompiledProgram_cn.html#id5)
----------
##### 问题:如何提高单CPU多线程利用率?
+ 答复:线程数是设备同时并行执行程序的个数,可以将线程数设置为“CPU的个数*CPU的核数”。可以通过
`os.getenv("CPU_NUM")`或者`os.environ['CPU_NUM'] = str(2)`获取相关参数值。
----------
##### 问题:使用NVIDIA多卡运行Paddle时报错,`Error:NCCL ContextMap`或者`Error:hang住`(log日志打印突然卡住),如何解决?
......@@ -123,40 +116,15 @@
![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-13d1b5df218cb40b0243d13450ab667f34aee2f7)
+ 报错分析:PaddlePaddle安装版本和多卡训练不匹配导致。
+ 解决方法:排查当前安装的PaddlePaddle是否支持并行训练。如果是开发者编译的Paddle,请在编译时打开 `WITH_DISTRIBUTE`选项。
----------
##### 问题:训练过程中提示显存不足,如何处理?
+ 报错分析:主进程发现一号卡(逻辑)上的训练进程退出了。
+ 答复:这是一种常见情况,你可以尝试调整`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算力,速度更快
+ 解决方法:查看一号卡上的日志,找出具体的出错原因。`paddle.distributed.launch` 启动多卡训练时,设置 `--log_dir` 参数会将每张卡的日志保存在设置的文件夹下
----------
##### 问题:GPU显存占用过高,如何解决
##### 问题:训练过程中提示显存不足,报错 `Error:Out of memory error GPU`,如何处理
+ 答复:建议调整 `FLAGS_fraction_of_gpu_memory_to_use` ,并检查`batch_size` 。通过设置较小的`batch_size`能降低显存消耗;`FLAGS_fraction_of_gpu_memory_to_use`默认值为 =0.92, 当申请不到需要的显存时会直接报内存不足。如遇到此情况,可以先检查一下GPU卡是否被占用,再设置较小的值,以启动程序。
----------
##### 问题:GPU内存不足,报错 `Error:Out of memory error GPU`,如何处理?
+ 问题描述:
![图片](https://agroup-bos-bj.cdn.bcebos.com/bj-3cbc8370534cb998f321af9b32aa2859403d9c9d)
+ 解决方案:
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`
+ 答复:这是一种常见情况,可以先检查一下GPU卡是否被其他程序占用,你可以尝试调整`batch_size`大小,也可以更改网络模型,或者参考官方文档[存储分配与优化](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/performance_improving/singlenode_training_improving/memory_optimize.html) 。建议用户使用[AI Studio 学习与 实训社区训练](https://aistudio.baidu.com/aistudio/index),获取免费GPU算力,显存16GB的v100,速度更快。
----------
......@@ -164,9 +132,9 @@
+ 答复:有如下两点建议:
1. 如果数据预处理耗时较长,可使用py_Reader 或 multiprocess_reader加速;
1. 如果数据预处理耗时较长,可使用[fluid.io.DataLLoader](https://www.paddlepaddle.org.cn/documentation/docs/en/api/io/DataLoader.html#dataloader)加速;该API提供了多进程的异步加载支持,在静态图与动态图下均可使用,也是paddle后续主推的数据读取方式。用户可通过配置num_workers指定异步加载数据的进程数目从而满足不同规模数据集的读取需求。
2. 如果提高GPU计算量,可以增加`batch_size`,但是注意调节其他超参数。
2. 如果GPU显存没满,且数据读取不是性能瓶颈,可以增加`batch_size`,但是注意调节其他超参数。
以上两点均为比较通用的方案,其他的优化方案和模型相关,可参考相应models示例。
......@@ -174,29 +142,27 @@
##### 问题:使用CPU或GPU时,如何设置`num_threds`?
+ 答复:
1. 如果是CPU,最大可以设置到当前CPU的内核数。
2. 如果是GPU,受显卡多处理器的寄存器数目限制,例如GeForce 8800GT的显卡,最多8192个寄存器。假设每个线程需要的寄存器等于16,则最多只有512个线程。再高的线程将会将数据切换的显卡显存,反而降低执行效率。
+ 答复:可以通过`os.getenv("CPU_NUM")`获取相关参数值或者`os.environ['CPU_NUM'] = str(2)`设置相关参数值。
----------
##### 问题:如何处理变长ID导致程序存占用过大的问题?
##### 问题:如何处理变长ID导致程序存占用过大的问题?
+ 答复:请先参考[显存分配与优化文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/best_practice/memory_optimize.html) 开启存储优化开关,包括显存垃圾及时回收和Op内部的输出复用输入等。若存储空间仍然不够,建议:
1. 降低`batch_size`
2. 对index进行排序,减少padding的数量。
+ 答复:请先参考上述显存不足的问题的解决方案。若存储空间仍然不够,建议对index进行排序,减少padding的数量。
----------
##### 问题:Executor与ParallelExecutor有什么区别?
+ 答复:如果没有指定Scope,所有的Executor都会共享一个Scope,即`global_scope`
+ 答复:飞桨(PaddlePaddle,以下简称Paddle)的设计思想类似于高级编程语言C++和JAVA等。程序的执行过程被分为编译和执行两个阶段。
用户完成对 Program 的定义后,Executor 接受这段 Program 并转化为C++后端真正可执行的 FluidProgram,这一自动完成的过程叫做编译。
编译过后需要 Executor 来执行这段编译好的 FluidProgram。
1. `fluid.Executor`执行对象是Program,可以认为是一个轻量级的执行器,目前主要用于参数初始化、参数加载、参数模型保存。
2. `fluid.ParallelExecutor`的执行对象是Graph,ParallelExecutor内部会将Program转为Graph,这样更便于对模型进行分析
2. `fluid.ParallelExecutor``Executor` 的一个升级版本,可以支持基于数据并行的多节点模型训练和测试。如果采用数据并行模式, ParallelExecutor 在构造时会将参数分发到不同的节点上,并将输入的 Program 拷贝到不同的节点,在执行过程中,各个节点独立运行模型,将模型反向计算得到的参数梯度在多个节点之间进行聚合,之后各个节点独立的进行参数的更新
----------
......@@ -216,7 +182,7 @@
##### 问题:Loss为NaN,如何处理?
+ 答复:可能由于网络的设计问题,Loss过大(Loss为NaN)会导致梯度爆炸。如果没有改网络结构,但是出现了NaN,可能是数据读取导致,比如标签对应关系错误。
+ 答复:可能由于网络的设计问题,Loss过大(Loss为NaN)会导致梯度爆炸。如果没有改网络结构,但是出现了NaN,可能是数据读取导致,比如标签对应关系错误。还可以检查下网络中是否会出现除0,log0的操作等。
----------
......@@ -237,25 +203,23 @@
----------
##### 问题:增量训练中,如何保存模型和恢复训练?
+ 答复:在增量训练过程中,不仅需要保存模型的参数,也需要保存模型训练的状态(如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)进行恢复训练。
##### 问题:出现未编译CUDA报错怎么办?
----------
![](https://ai-studio-static-online.cdn.bcebos.com/aba33440dd194ea397528f06bcb3574bddcf496b679b4da2832955b71cf65c76)
##### 问题:训练后的模型很大,如何压缩?
* 答复:报错是由于没有安装GPU版本的PaddlePaddle,CPU版本默认不包含CUDA检测功能。使用`pip install paddlepaddle-gpu -U` 即可。
+ 答复:建议您使用飞桨模型压缩工具[PaddleSlim](https://www.paddlepaddle.org.cn/tutorials/projectdetail/489539)。PaddleSlim是飞桨开源的模型压缩工具库,包含模型剪裁、定点量化、知识蒸馏、超参搜索和模型结构搜索等一系列模型压缩策略,专注于**模型小型化技术**
----------
-----
##### 问题:增量训练中,如何保存模型和恢复训练?
+ 答复:在增量训练过程中,不仅需要保存模型的参数,也需要保存模型训练的状态(如learning_rate)。使用[save](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/save_cn.html#save)保存模型训练的参数和状态;恢复训练时,使用[load](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/fluid_cn/load_cn.html#load)进行恢复训练。
## 应用预测
----------
##### 问题:load_inference_model在加载预测模型时能否用py_reader读取
##### 问题:训练后的模型很大,如何压缩
+ 答复:目前`load_inference_model`加载进行的模型还不支持py_reader输入
+ 答复:建议您使用飞桨模型压缩工具[PaddleSlim](https://www.paddlepaddle.org.cn/tutorials/projectdetail/489539)。PaddleSlim是飞桨开源的模型压缩工具库,包含模型剪裁、定点量化、知识蒸馏、超参搜索和模型结构搜索等一系列模型压缩策略,专注于**模型小型化技术**
----------
......@@ -283,7 +247,7 @@
##### 问题:使用optimizer或ParamAttr设置的正则化和学习率,二者什么差异?
+ 答复:ParamAttr中定义的`regularizer`优先级更高。若ParamAttr中定义了`regularizer`,则忽略Optimizer中的`regularizer`;否则,则使用Optimizer中的`regularizer`学习率的设置也可以参考此方式
+ 答复:ParamAttr中定义的`regularizer`优先级更高。若ParamAttr中定义了`regularizer`,则忽略Optimizer中的`regularizer`;否则,则使用Optimizer中的`regularizer`ParamAttr中的学习率默认为1,在对参数优化时,最终的学习率等于optimizer的学习率乘以ParamAttr的学习率
----------
......@@ -307,7 +271,7 @@
+ 错误分析:必选参数缺失导致。
+ 答复:飞桨框架1.7版本之后需要在optimizer的设置中加入必选项`param_list`
+ 答复:飞桨框架1.7版本之后,动态图模式下,需要在optimizer的设置中加入必选项`parameter_list`
----------
......@@ -316,3 +280,37 @@
+ 答复:如果设置`global_pooling`,则设置的`pool_size`将忽略,不会产生影响。
----------
##### 问题:训练的step在参数优化器中是如何变化的?
<img src="https://ai-studio-static-online.cdn.bcebos.com/610cd445435e40e1b1d8a4944a7448c35d89ea33ab364ad8b6804b8dd947e88c" style="zoom: 50%;" />
* 答复:
`step`表示的是经历了多少组mini_batch,其统计方法为`exe.run`(对应Program)运行的当前次数,即每运行一次`exe.run`,step加1。举例代码如下:
```python
# 执行下方代码后相当于step增加了N x Epoch总数
for epoch in range(epochs):
# 执行下方代码后step相当于自增了N
for data in [mini_batch_1,2,3...N]:
# 执行下方代码后step += 1
exe.run(data)
```
-----
##### 问题:如何修改全连接层参数,比如weight,bias?
+ 答复:可以通过`param_attr`设置参数的属性,`fluid.ParamAttr( initializer=fluid.initializer.Normal(0.0, 0.02), learning_rate=2.0)`,如果`learning_rate`设置为0,该层就不参与训练。也可以构造一个numpy数据,使用`fluid.initializer.NumpyArrayInitializer`来给权重设置想要的值。
----------
## 应用预测
##### 问题:load_inference_model在加载预测模型时能否用py_reader读取?
+ 答复:目前`load_inference_model`加载进行的模型还不支持py_reader输入。
----------
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册