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操作列表的常用方法分享
Feb 13 Python
Python最长公共子串算法实例
Mar 07 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
python使用MQTT给硬件传输图片的实现方法
May 05 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
浅谈Python type的使用
Nov 19 Python
Python turtle画图库&&画姓名实例
Jan 19 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 17 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php 缓存函数代码
2008/08/27 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
php xhprof使用实例详解
2019/04/15 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
python3中dict(字典)的使用方法示例
2017/03/22 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
python tkinter基本属性详解
2019/09/16 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
pytorch之添加BN的实现
2020/01/06 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
如何使用Pytorch搭建模型
2020/10/26 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
什么是索引指示器
2012/08/20 面试题
保安自我鉴定范文
2013/12/08 职场文书
工地宣传标语
2014/06/18 职场文书
考试保密承诺书
2014/08/30 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle
详解pytorch创建tensor函数
2022/03/22 Python