飞桨(PaddlePaddle)为用户提供技术领先、简单易用、兼顾显存回收与复用的显存优化策略,在Transformer、BERT、DeepLabV3+上Max Batch Size性能优于对标开源框架,在YOLOv3、Mask-RCNN模型上显存性能与对标开源框架持平,有兴趣的同学可以试一下,上一组数据先睹为快。
测试条件如下:
-
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 均是同步操作,非常耗时。为了加速显存分配,飞桨采用了显存预分配的策略,具体方式如下图所示:
(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大小的显存返回。
(2)在释放free_size大小的显存时&#