From b6a06094c491dfe01faec3509e78dc92a876b8d4 Mon Sep 17 00:00:00 2001 From: Chen Weihang Date: Thu, 24 Sep 2020 20:46:03 +0800 Subject: [PATCH] Polish train and eval FAQ items (#2679) * polish train eval faq * polish details --- doc/paddle/faq/train_cn.md | 119 +++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 65 deletions(-) diff --git a/doc/paddle/faq/train_cn.md b/doc/paddle/faq/train_cn.md index 3c677ac0b..00469bd69 100644 --- a/doc/paddle/faq/train_cn.md +++ b/doc/paddle/faq/train_cn.md @@ -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) ---------- -- GitLab