2022-08-18 使用paddlepaddle训练模型,显存不够

使用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()

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容