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


Posted in Python onJune 22, 2020

初步尝试 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空出显存

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

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 和显存占用设定步骤

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

Python 相关文章推荐
Python实现求数列和的方法示例
Jan 12 Python
Python中的单继承与多继承实例分析
May 10 Python
python邮件发送smtplib使用详解
Jun 16 Python
python skimage 连通性区域检测方法
Jun 21 Python
python如何发布自已pip项目的方法步骤
Oct 09 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
Python内置异常类型全面汇总
May 28 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
详解Python生成器和基于生成器的协程
Jun 03 Python
Python 发送SMTP邮件的简单教程
Jun 24 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
Python 基于jwt实现认证机制流程解析
Jun 22 #Python
python中format函数如何使用
Jun 22 #Python
Tensorflow与Keras自适应使用显存方式
Jun 22 #Python
python数据类型强制转换实例详解
Jun 22 #Python
keras 指定程序在某块卡上训练实例
Jun 22 #Python
python Socket网络编程实现C/S模式和P2P
Jun 22 #Python
Python手动或自动协程操作方法解析
Jun 22 #Python
You might like
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PDO::exec讲解
2019/01/28 PHP
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Python selenium如何设置等待时间
2016/09/15 Python
Python面向对象之继承代码详解
2018/01/29 Python
利用python如何处理nc数据详解
2018/05/23 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
python飞机大战游戏实例讲解
2020/12/04 Python
一些.net面试题
2014/10/06 面试题
护理专业自荐信范文
2014/02/26 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS