Keras - GPU ID 和显存占用设定步骤

 更新时间:2020年06月22日 10:36:28   作者:AIHGF  
这篇文章主要介绍了Keras - GPU ID 和显存占用设定步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

初步尝试 Keras (基于 Tensorflow 后端)深度框架时, 发现其对于 GPU 的使用比较神奇, 默认竟然是全部占满显存, 1080Ti 跑个小分类问题, 就一下子满了. 而且是服务器上的两张 1080Ti.

服务器上的多张 GPU 都占满, 有点浪费性能.

因此, 需要类似于 Caffe 等框架的可以设定 GPU ID 和显存自动按需分配.

实际中发现, Keras 还可以限制 GPU 显存占用量.

这里涉及到的内容有:

GPU ID 设定

GPU 显存占用按需分配

GPU 显存占用限制

GPU 显存优化

1. GPU ID 设定

#! -- coding: utf-8 --*--
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1"

这里将 GPU ID 设为 1.

GPU ID 从 0 开始, GPUID=1 即表示第二块 GPU.

2. GPU 显存占用按需分配

#! -- coding: utf-8 --*--
import tensorflow as tf
import keras.backend.tensorflow_backend as ktf

# GPU 显存自动调用
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
session = tf.Session(config=config)
ktf.set_session(session)

3. GPU 显存占用限制

#! -- coding: utf-8 --*--
import tensorflow as tf
import keras.backend.tensorflow_backend as ktf

# 设定 GPU 显存占用比例为 0.3
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3
session = tf.Session(config=config)
ktf.set_session(session )

这里虽然是设定了 GPU 显存占用的限制比例(0.3), 但如果训练所需实际显存占用超过该比例, 仍能正常训练, 类似于了按需分配.

设定 GPU 显存占用比例实际上是避免一定的显存资源浪费.

4. GPU ID 设定与显存按需分配

#! -- coding: utf-8 --*--
import os
import tensorflow as tf
import keras.backend.tensorflow_backend as ktf

# GPU 显存自动分配
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
#config.gpu_options.per_process_gpu_memory_fraction = 0.3
session = tf.Session(config=config)
ktf.set_session(session)

# 指定GPUID, 第一块GPU可用
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

5. 利用fit_generator最小化显存占用比例/数据Batch化

#! -- coding: utf-8 --*--

# 将内存中的数据分批(batch_size)送到显存中进行运算
def generate_arrays_from_memory(data_train, labels_train, batch_size):
  x = data_train
  y=labels_train
  ylen=len(y)
  loopcount=ylen // batch_size
  while True:
    i = np.random.randint(0,loopcount)
    yield x[i*batch_size:(i+1)*batch_size],y[i*batch_size:(i+1)*batch_size]

# load数据到内存
data_train=np.loadtxt("./data_train.txt")
labels_train=np.loadtxt('./labels_train.txt')
data_val=np.loadtxt('./data_val.txt')
labels_val=np.loadtxt('./labels_val.txt')

hist=model.fit_generator(generate_arrays_from_memory(data_train,
                           labels_train,
                           batch_size),
             steps_per_epoch=int(train_size/bs),
             epochs=ne,
             validation_data=(data_val,labels_val),
             callbacks=callbacks )

5.1 数据 Batch 化

#! -- coding: utf-8 --*--

def process_line(line): 
  tmp = [int(val) for val in line.strip().split(',')] 
  x = np.array(tmp[:-1]) 
  y = np.array(tmp[-1:]) 
  return x,y 

def generate_arrays_from_file(path,batch_size): 
  while 1: 
    f = open(path) 
    cnt = 0 
    X =[] 
    Y =[] 
    for line in f: 
      # create Numpy arrays of input data 
      # and labels, from each line in the file 
      x, y = process_line(line) 
      X.append(x) 
      Y.append(y) 
      cnt += 1 
      if cnt==batch_size: 
        cnt = 0 
        yield (np.array(X), np.array(Y)) 
        X = [] 
        Y = [] 
  f.close() 

补充知识:Keras+Tensorflow指定运行显卡以及关闭session空出显存

Step1: 查看GPU

watch -n 3 nvidia-smi #在命令行窗口中查看当前GPU使用的情况, 3为刷新频率

Step2: 导入模块

导入必要的模块

import os
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
from numba import cuda

Step3: 指定GPU

程序开头指定程序运行的GPU

os.environ['CUDA_VISIBLE_DEVICES'] = '1' # 使用单块GPU,指定其编号即可 (0 or 1or 2 or 3)
os.environ['CUDA_VISIBLE_DEVICES'] = '1,2,3' # 使用多块GPU,指定其编号即可 (引号中指定即可)

Step4: 创建会话,指定显存使用百分比

创建tensorflow的Session

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.1 # 设定显存的利用率
set_session(tf.Session(config=config))

Step5: 释放显存

确保Volatile GPU-Util显示0%

程序运行完毕,关闭Session

K.clear_session() # 方法一:如果不关闭,则会一直占用显存

cuda.select_device(1) # 方法二:选择GPU1
cuda.close() #关闭选择的GPU

以上这篇Keras - GPU ID 和显存占用设定步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python3实现跳一跳点击跳跃

    python3实现跳一跳点击跳跃

    这篇文章主要为大家详细介绍了python3实现跳一跳点击跳跃,玩跳一跳小游戏的思路,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python实现三壶谜题的示例详解

    python实现三壶谜题的示例详解

    这篇文章主要介绍了python实现三壶谜题功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Jupyter Notebook 安装配置与使用详解

    Jupyter Notebook 安装配置与使用详解

    这篇文章主要介绍了Jupyter Notebook 安装配置与使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • python利用xlsxwriter模块 操作 Excel

    python利用xlsxwriter模块 操作 Excel

    这篇文章主要介绍了python利用xlsxwriter模块 操作 Excel,帮助大家更好的利用python处理表格,提高办公效率,感兴趣的朋友可以了解下
    2020-10-10
  • 在Python中使用cookielib和urllib2配合PyQuery抓取网页信息

    在Python中使用cookielib和urllib2配合PyQuery抓取网页信息

    这篇文章主要介绍了在Python中使用cookielib和rllib2配合PyQuery抓取网页信息的教程,主要是利用PyQuery解析HTML来实现,需要的朋友可以参考下
    2015-04-04
  • Python实现梯度下降法的示例代码

    Python实现梯度下降法的示例代码

    梯度下降法的机器学习的重要思想之一,梯度下降法的目标,是使得代价函数最小。本文将对梯度下降算法的原理及实现展开详细介绍,感兴趣的快跟随小编一起学习学习吧
    2022-08-08
  • Opencv图像处理之详解掩膜mask

    Opencv图像处理之详解掩膜mask

    这篇文章主要介绍了Opencv图像处理之详解掩膜mask,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 如何使用Python对NetCDF数据做空间相关分析

    如何使用Python对NetCDF数据做空间相关分析

    这篇文章主要介绍了如何使用Python对NetCDF数据做空间相关分析,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • Python实现数据结构线性链表(单链表)算法示例

    Python实现数据结构线性链表(单链表)算法示例

    这篇文章主要介绍了Python实现数据结构线性链表(单链表)算法,结合实例形式分析了Python单链表的定义、节点插入、删除、打印等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • 教你用Type Hint提高Python程序开发效率

    教你用Type Hint提高Python程序开发效率

    本文通过介绍和实例教大家如何利用Type Hint来提升Python程序开发效率,对大家使用python开发很有帮助,有需要的参考学习。
    2016-08-08

最新评论