问题1:GPU利用率低下, 307MiB / 32510MiB
尝试解决
- 增加batch_size 也没有效果,超过某个数就内存溢出了==》 说明非batch_size 过小导致这个问题
- 如果在一块卡上再启动一个进程来训练模型,只能再叠加一个305Mib,并且程序在运行中可能出现内存溢出
问题2 - 内存溢出
五折交叉验证的时候,第一折跑完了,跑第二折的时候,内存溢出,是因为前面训练时占用的内存没有释放掉。可能是由于代码首部指定的使用GPU的方式引起的
指定GPU训练模型
这是组里祖传的代码,不修改代码的情况下,直接在训练模型代码的前面加上这几句话,就可以指定具体的 GPU 来训练模型。
import os
import tensorflow as tf
gpu_id = '0,1,2,3' # 指定使用这几块GPU
os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id)
os.system('echo $CUDA_VISIBLE_DEVICES')
tf_config = tf.compat.v1.ConfigProto()
tf_config.gpu_options.allow_growth = True
tf.compat.v1.Session(config=tf_config)
这篇文章:https://www.jianshu.com/p/99fca5b7fd8a
有详细介绍每一行的含义
# tf.ConfigProto一般用在创建session的时候用来对session进行参数配置
# log_device_placement = True : 是否打印设备分配日志
# allow_soft_placement = True : 如果你指定的设备不存在,允许TF自动分配设备
tf.ConfigProto(log_device_placement = True, allow_soft_placement = True)
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction = 0.7)
config = tf.ConfigProto(gpu_options = gpu_options)
session = tf.Session(config = config,....)
使用allow_growth option,刚一开始分配少量的GPU容量,然后按需慢慢的增加,由于不会释放内存,所以会导致碎片
解决
一折训练完之后,重置session
# import tensorflow.keras.backend as K
# from tensorflow.python.framework.ops import reset_default_graph
K.clear_session()
reset_default_graph()
两个问题的解决方案
删掉下面这个代码就好了
tf_config = tf.compat.v1.ConfigProto()
tf_config.gpu_options.allow_growth = True
tf.compat.v1.Session(config=tf_config)