更快更简单|飞桨PaddlePaddle显存分配与优化最佳实践

飞桨PaddlePaddle通过显存预分配和GC策略实现显存优化,提高训练效率。文章介绍了显存预分配的chunk策略,GC的阈值控制以及Inplace策略,提供了最佳实践配置,并展示了在Transformer模型上的优化效果。
摘要由CSDN通过智能技术生成

飞桨(PaddlePaddle)为用户提供技术领先、简单易用、兼顾显存回收与复用的显存优化策略,在Transformer、BERT、DeepLabV3+上Max Batch Size性能优于对标开源框架,在YOLOv3、Mask-RCNN模型上显存性能与对标开源框架持平,有兴趣的同学可以试一下,上一组数据先睹为快。

 

640?wx_fmt=png

 

测试条件如下:

  • Paddle version:1.5.0

  • Tensorflow version:1.12.0, 1.14.0

  • Pytorch version:1.0.1, 1.1.0

  • GPU:Tesla V100-SXM2

  • CPU:Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz,38核

  • Nvida driver: 418.39

  • NCCL VERSION:2.4.2

  • CUDNN VERSION:7.4.2.24,7.5.0.56

  • CUDA VERSION:9.0.176,单卡模式

 

1. 飞桨的显存分配策略

 

由于原生的CUDA系统调用 cudaMalloc 和 cudaFree 均是同步操作,非常耗时。为了加速显存分配,飞桨采用了显存预分配的策略,具体方式如下图所示:

 

 

640?wx_fmt=png

 

(1)在分配requested_size大小的显存时,先定义一个显存池的大小,记为chunk_size,chunk_size由环境变量 FLAGS_fraction_of_gpu_memory_to_use 确定,表征chunk_size在全部显存的占比,默认值为0.92,即框架预先分配显卡92%的显存。

  • 若requested_size<= chunk_size,则框架会预先分配chunk_size大小的显存池chunk,并从chunk中分出requested_size大小的块返回。之后每次申请显存都会从chunk中分配。

  • 若requested_size> chunk_size,则框架会直接调用 cudaMalloc 分配requested_size大小的显存返回。

 

 

640?wx_fmt=png

(2)在释放free_size大小的显存时&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值