Paddle尚未支持python3
====
Paddle的Trick
1.1 cuDNN操作的选择
在 use_cudnn=True 时,框架底层调用的是cuDNN中的卷积操作。
通常cuDNN库提供的操作具有很好的性能表现,其性能明显优于Paddle原生的CUDA实现,比如 conv2d 。但是cuDNN中有些操作的性能较差,比如: conv2d_transpose 在 batch_size=1 时、pool2d 在 global_pooling=True 时等,这些情况下,cuDNN实现的性能差于Paddle的CUDA实现,建议手动设置 use_cudnn=False 。
1.2 使用融合功能的API
用户网络配置中使用融合功能的API,通常能取得更好的计算性能。
例如softmax_with_cross_entropy通常会比softmax cross_entropy分开用好
2.2 优化数据准备速度的方法
为降低训练的整体时间,建议用户使用异步数据读取的方式,并开启 use_double_buffer(默认开)。此外,用户可根据模型的实际情况设置数据队列的大小(capacity?)。
如果数据准备的时间大于模型执行的时间,或者出现了数据队列为空的情况,这时候需要考虑对Python的用户reader进行加速。常用的方法为:使用Python多进程准备数据。一个简单的使用多进程准备数据的示例,请参考YOLOv3(链接)。
Python端的数据预处理,都是使用CPU完成。如果Paddle提供了相应功能的API,可将这部分预处理功能写到模型配置中,如此Paddle就可以使用GPU来完成该预处理功能,这样也可以减轻CPU预处理数据的负担,提升总体训练速度。
3
4 FLAG设置
Fluid中有一些FLAGS可以有助于性能优化:
FLAGS_fraction_of_gpu_memory_to_use表示每次分配GPU显存的最小单位,取值范围为[0, 1)。由于CUDA原生的显存分配cuMalloc和释放cuFree操作均是同步操作,非常耗时,因此将FLAGS_fraction_of_gpu_memory_to_use设置成一个较大的值,比如0.92(默认值),可以显著地加速训练的速度。
FLAGS_cudnn_exhaustive_search表示cuDNN在选取conv实现算法时采取穷举搜索策略,因此往往能选取到一个更快的conv实现算法,这对于CNN网络通常都是有加速的。但穷举搜索往往也会增加cuDNN的显存需求,因此用户可根据模型的实际情况选择是否设置该变量。
FLAGS_enable_cublas_tensor_op_math表示是否使用TensorCore加速计算cuBLAS。这个环境变量只在Tesla V100以及更新的GPU上适用,且可能会带来一定的精度损失。
5 Profile工具分析
====
显存优化策略
GC(Garbage Collection)的原理是在网络运行阶段及时释放无用变量的显存空间,达到节省显存的目的。GC适用于使用Executor,ParallelExecutor做模型训练/预测的场合。
FLAGS_eager_delete_tensor_gb=0.0 - 一旦不再使用即释放内存垃圾。省显存。
由于原生的CUDA系统调用 cudaMalloc 和 cudaFree 均是同步操作,非常耗时。因此与许多框架类似,PaddlePaddle采用了显存预分配的策略加速显存分配。
若 FLAGS_fraction_of_gpu_memory_to_use 设为0,则每次显存分配和释放均会调用 cudaMalloc 和 cudaFree ,会严重影响性能,不建议你使用。 只有当你想测量网络的实际显存占用量时,你可以设置 FLAGS_fraction_of_gpu_memory_to_use 为0,观察nvidia-smi显示的显存占用情况。
Inplace策略
原理是Op的输出复用Op输入的显存空间。
由于目前设计上的一些问题,在开启Inplace策略后,必须保证后续exe.run中fetch_list的变量是persistable的。
fetch_list:结果获取表,训练时一般有loss等。
推荐的最佳显存优化策略为:
1 开启GC策略:设置 FLAGS_eager_delete_tensor_gb=0 。
FLAGS_memory_fraction_of_eager_deletion=1 (默认值=1)
FLAGS_fast_eager_deletion_mode=True (默认值为True)
2 开启Inplace策略:设置 build_strategy.enable_inplace = True ,并设置fetch_list中的 var.persistable = True 。
链接:https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/best_practice/memory_optimize.html#inplace-op