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的Django框架部署的一些建议
Apr 09 Python
Python中字典的基础知识归纳小结
Aug 19 Python
Django学习笔记之ORM基础教程
Mar 27 Python
python将txt文件读取为字典的示例
Dec 22 Python
python调用虹软2.0第三版的具体使用
Feb 22 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
Python简易版图书管理系统
Aug 12 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
整理Python中常用的conda命令操作
Jun 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获取表单所有复选框的值的方法
2014/08/28 PHP
laravel学习教程之关联模型
2016/07/30 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
jquery创建div 实现代码
2009/04/27 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
js判断是否是手机页面
2017/03/17 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
让python在hadoop上跑起来
2016/01/27 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python实现多线程端口扫描
2019/08/31 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
职业生涯规划怎么写
2013/12/29 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
社区先进事迹材料
2014/05/19 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers