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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
Python中的localtime()方法使用详解
May 22 Python
Django后台获取前端post上传的文件方法
May 28 Python
python实现对csv文件的列的内容读取
Jul 04 Python
python程序封装为win32服务的方法
Mar 07 Python
详解python运行三种方式
May 13 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
Aug 04 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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 addslashes 函数详细分析说明
2009/06/23 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
ThinkPHP中html:list标签用法分析
2016/01/09 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
2014/03/03 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
python的id()函数介绍
2013/02/10 Python
深入浅析Python字符编码
2015/11/12 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python面向对象实现方法总结
2020/08/12 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
Python爬取某平台短视频的方法
2021/02/08 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
会计电算化专业自荐信
2014/03/15 职场文书
就职演讲稿范文
2014/05/19 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
化工厂员工工作总结
2015/10/15 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript