在使用TensorFlow&Keras经过GPU进行加速训练时,有时在训练一个任务的时候须要去测试结果,或者是须要并行训练数据的时候就会显示OOM显存容量不足的错误。如下简称在训练一个任务的时候须要去测试结果,或者是须要并行训练数据为进行新的运算任务。html
首先介绍下TensorFlow&Keras GPU使用的机制:TensorFlow&Keras会在有GPU能够使用时,自动将数据与运算放到GPU进行训练(这个不一样于MXNet与PyTorch处理方式不一样,MXNet与PyTorch须要手动编程去指定数据与运算的Device,这里不讨论这些方法之间的优劣,选择适合本身的就行了),默认充满GPU全部显存。 python
因此当用户在运行一个运算任务时会占据全部显存,若是再去开启一个新任务就会内存不足,引发OOM显存容量不足的错误。编程
经过对上述问题解读,应该能够经过如下的方法解决:session
这不是最优方法,使用CPU进行新的任务速度会很慢,可是也是一种解决方式app
这个是笔者比较推荐的方式,因为TensorFlow&Keras运行一个运算任务时会占据全部显存,其实有时并无用到那么多。性能
这样作也会有点小问题就是,单个任务会变慢一点,笔者测试结果是在使用上述方法并行运行两个单个任务速度变为0.8左右,可是换来了能够运行两个任务,仍是很值得的。(推测变慢的缘由是两个任务并行运算时,对GPU压力更大,每一个任务上分配的性能就会下降,相似于在电脑上跑多个任务,电脑会卡顿)测试
这样作要注意一点,在分配显存空间后,模型训练占据的内存要设置好(这个是指实际占用内存,能够经过修改batch_size来控制),不要超出你所分配的大小,否则会有不指望的结果出现。spa
import tensorflow as tf # 在开启对话session前,先建立一个 tf.ConfigProto() 实例对象 gpuConfig = tf.ConfigProto(allow_soft_placement=True) # 限制一个进程使用 60% 的显存 gpuConfig.gpu_options.per_process_gpu_memory_fraction = 0.6 # 把你的配置部署到session 变量名 sess 无所谓 sess1 =tf.Session(config=gpuConfig) #这样,若是你指定的卡的显存是2000M的话,你这个进程只能用1200M。
输出结果(with 1228 MB memory,表明使用1228 MB,这与设置的0.6 * 2000相符).net
Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1228 MB memory) -> physical GPU (device: 0, name: GeForce MX150, pci bus id: 0000:01:00.0, compute capability: 6.1)
若是条件容许,拥有多个,就能够把不一样任务放置在不一样GPU上,要注意若是是和同事共用,要约定好如何分配,省得你们都用了同一个。code
设置方法与方法一相似。-1表明不使用,0表明第一个,1表明第二个
以两个GPU举例,第一个任务开头能够使用以下,第二个任务就把0改成1,多个GPU方法相似。注意一点要放置在开头位置。
import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 打印 TF 可用的 GPU print(os.environ['CUDA_VISIBLE_DEVICES']) # -1 表示不使用GPU 0表明第一个
若是多于两个GPU,想在某个任务设置多个GPU,能够使用下述方法
最后留个你们一个思考问题,os.environ['CUDA_VISIBLE_DEVICES'] = '-1,0' 时会怎么样调用?
欢迎你们在评论区留言发布本身见解和解读。。