使用paddlepaddle训练模型,显存不够
情况描述
服务器上部署了多个paddlepaddle的服务。此时我想在服务器上训练模型,nvidia-smi命令看到显存剩余非常多,足够训练模型。但是开始训练时候,报错显存不够。
报错信息如下:
Out of memory error on GPU 0. Cannot allocate 32.959229MB memory on GPU 0, available memory is only 3.287499MB.
原因分析
paddlepaddle 使用了一些显存,没有即时释放。导致后面训练模型,申请不到显存。
解决办法
在程序运行的前面添加如下代码:
os.environ[‘FLAGS_eager_delete_tensor_gb’] = “0.0”
或者设置环境变量:
export FLAGS_eager_delete_tensor_gb=0.0
主要作用是 GPU memory garbage collection optimization flags
最好在引入paddle之前加入上述代码。
变量设置说明:
FLAGS_eager_delete_tensor_gb 是GC策略的使能开关,double类型,默认值为-1。GC策略会积攒一定大小的显存垃圾后再统一释放,FLAGS_eager_delete_tensor_gb 控制的是显存垃圾的阈值,单位是GB。
建议用户设置 FLAGS_eager_delete_tensor_gb=0 。
- 若 FLAGS_eager_delete_tensor_gb=0 ,则一旦有显存垃圾则马上回收,最为节省显存。
- 若 FLAGS_eager_delete_tensor_gb=1 ,则显存垃圾积攒到1G后才触发回收。
- 若 FLAGS_eager_delete_tensor_gb<0 ,则GC策略关闭
其他环境变量
- 启用快速垃圾回收策略,不等待cuda kernel 结束,直接释放显存
export FLAGS_fast_eager_deletion_mode=1 - 该环境变量设置只占用0%的显存
export FLAGS_fraction_of_gpu_memory_to_use=0
下面的方法没有测试
1 如果是在多卡的环境下运行的出现错误
可以设置
CUDA_VISIBLE_DEVICES=“0” #后面是显卡编号,确保程序在这张显卡上运行
2 如果是在自己写的代码下运行报错
一定要开启model.eval()