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使用xlrd读取Excel格式文件的方法
Mar 10 Python
django+mysql的使用示例
Nov 23 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Django用户认证系统 Web请求中的认证解析
Aug 02 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
pywinauto自动化操作记事本
Aug 26 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python实现简单井字棋小游戏
Mar 05 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python的logging模块基本用法
Dec 24 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 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
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php 什么是PEAR?
2009/03/19 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
2014/10/15 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
js中int和string数据类型互相转化实例
2019/01/16 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
python爬虫爬取网页表格数据
2018/03/07 Python
Django组件cookie与session的具体使用
2019/06/05 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
采购文员岗位职责
2013/11/20 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
体育委员竞选稿
2015/11/21 职场文书
Python简易开发之制作计算器
2022/04/28 Python