Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
FluidDoc
提交
b6a06094
F
FluidDoc
项目概览
PaddlePaddle
/
FluidDoc
通知
5
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
23
列表
看板
标记
里程碑
合并请求
111
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FluidDoc
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
23
Issue
23
列表
看板
标记
里程碑
合并请求
111
合并请求
111
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
b6a06094
编写于
9月 24, 2020
作者:
C
Chen Weihang
提交者:
GitHub
9月 24, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Polish train and eval FAQ items (#2679)
* polish train eval faq * polish details
上级
39a80638
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
54 addition
and
65 deletion
+54
-65
doc/paddle/faq/train_cn.md
doc/paddle/faq/train_cn.md
+54
-65
未找到文件。
doc/paddle/faq/train_cn.md
浏览文件 @
b6a06094
...
...
@@ -96,23 +96,19 @@ with fluid.dygraph.guard(fluid.CPUPlace()):
## 模型训练&评估
##### 问题:
在CPU上进行模型训练,如何使用多线程
?
##### 问题:
使用CPU进行模型训练,如何利用多处理器进行加速
?
+
答复:
可以参考使用
[
ParallelExecutor API
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/1.3/api_cn/fluid_cn.html#parallelexecutor
)
。
+
答复:
在1.8版本的动态图模式下,CPU训练加速可以从以下两点进行配置:
----------
##### 问题:如何提高单CPU多线程利用率?
+
答复:线程数是设备同时并行执行程序的个数,可以将线程数设置为“CPU的个数
*
CPU的核数”。可以通过
1.
使用多进程DataLoader加速数据读取:训练数据较多时,数据处理往往会成为训练速度的瓶颈,paddle提供了异步数据读取接口DataLoader,可以使用多进程进行数据加载,充分利用多处理的优势,具体使用方法及示例请参考API文档:
[
fluid.io.DataLLoader
](
https://www.paddlepaddle.org.cn/documentation/docs/en/api/io/DataLoader.html#dataloader
)
。
`os.getenv("CPU_NUM")`
或者
`os.environ['CPU_NUM'] = str(2)`
获取相关参数值
。
2.
推荐使用支持MKL(英特尔数学核心函数库)的paddle安装包,MKL相比Openblas等通用计算库在计算速度上有显著的优势,能够提升您的训练效率
。
----------
##### 问题:使用NVIDIA多卡运行Paddle时报错
,`Error:NCCL ContextMap`或者`Error:hang住`(log日志打印突然卡住)
,如何解决?
##### 问题:使用NVIDIA多卡运行Paddle时报错
Nccl error
,如何解决?
+
答复:
参考
[
NCCL Tests
](
https://github.com/NVIDIA/nccl-tests
)
检测您的环境。如果检测不通过,请登录
[
NCCL官网
](
https://developer.nvidia.com/zh-cn
)
下载NCCl,安装后重新检测。
+
答复:
这个错误大概率是环境配置不正确导致的,建议您使用NVIDIA官方提供的方法参考检测自己的环境是否配置正确。具体地,可以使用
[
NCCL Tests
](
https://github.com/NVIDIA/nccl-tests
)
检测您的环境;如果检测不通过,请登录
[
NCCL官网
](
https://developer.nvidia.com/zh-cn
)
下载NCCl,安装后重新检测。
----------
...
...
@@ -128,34 +124,26 @@ with fluid.dygraph.guard(fluid.CPUPlace()):
----------
##### 问题:训练过程中提示显存不足,如何处理?
+
答复:这是一种常见情况,你可以尝试调整
`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算力,速度更快。
----------
##### 问题:GPU显存占用过高,如何解决?
##### 问题:训练时报错提示显存不足,如何解决?
+
答复:
建议调整
`FLAGS_fraction_of_gpu_memory_to_use`
,并检查
`batch_size`
。通过设置较小的
`batch_size`
能降低显存消耗;
`FLAGS_fraction_of_gpu_memory_to_use`
默认值为 =0.92, 当申请不到需要的显存时会直接报内存不足。如遇到此情况,可以先检查一下GPU卡是否被占用,再设置较小的值,以启动程序。
+
答复:
可以尝试按如下方法解决:
----------
1.
检查是当前模型是否占用了过多显存,可尝试减小
`batch_size`
;
##### 问题:GPU内存不足,报错 `Error:Out of memory error GPU`,如何处理?
+
问题描述:
2.
开启以下三个选项:
![
图片
](
https://agroup-bos-bj.cdn.bcebos.com/bj-3cbc8370534cb998f321af9b32aa2859403d9c9d
)
```
#一旦不再使用即释放内存垃圾,=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`
```
+
解决方案:
详细请参考官方文档
[
存储分配与优化
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/performance_improving/singlenode_training_improving/memory_optimize.html
)
调整相关配置。
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`
此外,建议您使用
[
AI Studio 学习与 实训社区训练
](
https://aistudio.baidu.com/aistudio/index
)
,获取免费GPU算力,提升您的训练效率。
----------
...
...
@@ -163,20 +151,11 @@ with fluid.dygraph.guard(fluid.CPUPlace()):
+
答复:有如下两点建议:
1.
如果数据预处理耗时较长,可使用py_Reader 或 multiprocess_reader加速;
2.
如果提高GPU计算量,可以增加
`batch_size`
,但是注意调节其他超参数。
以上两点均为比较通用的方案,其他的优化方案和模型相关,可参考相应models示例。
----------
##### 问题:使用CPU或GPU时,如何设置`num_threds`?
1.
如果数据预处理耗时较长,可使用DataLoader加速数据读取过程,具体请参考API文档:
[
fluid.io.DataLLoader
](
https://www.paddlepaddle.org.cn/documentation/docs/en/api/io/DataLoader.html#dataloader
)
。
+
答复:
2.
如果提高GPU计算量,可以增大
`batch_size`
,但是注意同时调节其他超参数以确保训练配置的正确性。
1.
如果是CPU,最大可以设置到当前CPU的内核数。
2.
如果是GPU,受显卡多处理器的寄存器数目限制,例如GeForce 8800GT的显卡,最多8192个寄存器。假设每个线程需要的寄存器等于16,则最多只有512个线程。再高的线程将会将数据切换的显卡显存,反而降低执行效率。
以上两点均为比较通用的方案,其他的优化方案和模型相关,可参考官方模型库
[
models
](
https://github.com/PaddlePaddle/models
)
中的具体示例。
----------
...
...
@@ -184,44 +163,28 @@ with fluid.dygraph.guard(fluid.CPUPlace()):
+
答复:请先参考
[
显存分配与优化文档
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/best_practice/memory_optimize.html
)
开启存储优化开关,包括显存垃圾及时回收和Op内部的输出复用输入等。若存储空间仍然不够,建议:
1.
降低
`batch_size`
;
1.
降低
`batch_size`
;
2.
对index进行排序,减少padding的数量。
----------
##### 问题:Executor与ParallelExecutor有什么区别?
+
答复:如果没有指定Scope,所有的Executor都会共享一个Scope,即
`global_scope`
。
1.
`fluid.Executor`
执行对象是Program,可以认为是一个轻量级的执行器,目前主要用于参数初始化、参数加载、参数模型保存。
2.
`fluid.ParallelExecutor`
的执行对象是Graph,ParallelExecutor内部会将Program转为Graph,这样更便于对模型进行分析。
----------
##### 问题:训练过程中如果出现不收敛的情况,如何处理?
+
答复:不收敛的原因有很多,可以参考如下方式排查:
1.
检查数据集中训练数据的准确率,数据是否有
很多
错误,特征是否归一化;
1.
检查数据集中训练数据的准确率,数据是否有错误,特征是否归一化;
2.
简化网络结构,先基于benchmark实验,确保在baseline网络结构和数据集上的收敛结果正确;
3.
对于复杂的网络,每次只增加一个改动,确保改动后的网络正确;
4.
检查网络在训练数据上的Loss是否下降;
5.
检查学习率、优化算法是否合适,学习率过大会导致不收敛;
6.
检查
`batch_size`
设置是否合适,
`batch_size`
过小会导致不收敛;
7.
检查梯度计算是否正确,是否有梯度过大的情况,是否为
NaN
。
7.
检查梯度计算是否正确,是否有梯度过大的情况,是否为
`NaN`
。
----------
##### 问题:Loss为NaN,如何处理?
+
答复:可能由于网络的设计问题,Loss过大(Loss为NaN)会导致梯度爆炸。如果没有改网络结构,但是出现了NaN,可能是数据读取导致,比如标签对应关系错误。
----------
##### 问题:在AI Studio上使用GPU训练时报错 `Attempt to use GPU for prediction, but environment variable CUDA_VISIBLE_DEVICES was not set correctly.`,如何处理?
+
答复:需要在Notebook环境中增加:
`%set_env CUDA_VISIBLE_DEVICES=0`
。
+
答复:可能是网络设计存在问题,Loss过大(Loss为NaN)会导致梯度爆炸。如果没有改网络结构,但是出现了NaN,可能是数据读取导致,比如标签对应关系错误。
----------
...
...
@@ -238,7 +201,33 @@ with fluid.dygraph.guard(fluid.CPUPlace()):
##### 问题:增量训练中,如何保存模型和恢复训练?
+
答复:在增量训练过程中,不仅需要保存模型的参数,也需要保存模型训练的状态(如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
)
进行恢复训练。
+
答复:在增量训练过程中,不仅需要保存模型的参数,也需要保存优化器的参数。
具体地,在1.8版本中需要使用Layer和Optimizer的
`state_dict`
和
`set_dict`
方法配合
`fluid.save_dygraph/load_dygraph`
使用。简要示例如下:
```
import paddle.fluid as fluid
with fluid.dygraph.guard():
emb = fluid.dygraph.Embedding([10, 10])
state_dict = emb.state_dict()
fluid.save_dygraph(state_dict, "paddle_dy")
adam = fluid.optimizer.Adam( learning_rate = fluid.layers.noam_decay( 100, 10000),
parameter_list = emb.parameters() )
state_dict = adam.state_dict()
fluid.save_dygraph(state_dict, "paddle_dy")
para_state_dict, opti_state_dict = fluid.load_dygraph("paddle_dy")
emb.set_dict(para_state_dict)
adam.set_dict(opti_state_dict)
```
更多介绍请参考以下API文档:
-
[
save_dygraph
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dygraph_cn/save_dygraph_cn.html#save-dygraph
)
-
[
load_dygraph
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dygraph_cn/load_dygraph_cn.html#load-dygraph
)
----------
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录