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获取本地计算机名字的方法
Apr 29 Python
Python中的条件判断语句与循环语句用法小结
Mar 21 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
Python第三方库h5py_读取mat文件并显示值的方法
Feb 08 Python
Python如何定义有默认参数的函数
Aug 10 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 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仿QQ验证码的实例分析
2013/07/01 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
简单实现PHP留言板功能
2016/12/21 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Ajax与服务器(JSON)通信实例代码
2016/11/05 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
angular6 填坑之sdk的方法
2018/12/27 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Django Rest framework权限的详细用法
2019/07/25 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
党员廉洁自律承诺书
2014/05/26 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
项目投资意向书范本
2015/05/09 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js