初步尝试 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空出显存

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 和显存占用设定步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

batchsize和数据量设置比例_Keras - GPU ID 和显存占用设定步骤相关推荐

  1. Keras - GPU ID 和显存占用设定

    Keras - GPU ID 和显存占用设定 初步尝试 Keras (基于 Tensorflow 后端)深度框架时, 发现其对于 GPU 的使用比较神奇, 默认竟然是全部占满显存, 1080Ti 跑个 ...

  2. batchsize和数据量设置比例_1. 项目涉及技术

    1.1 Linux&Shell相关总结 1.1.1 Linux常用命令 序号命令命令解释 1top查看内存 2df -h查看磁盘存储情况 3iotop查看磁盘IO读写(yum install ...

  3. 使用FVD时遇到的问题记录:使用tensorflow时batch_size不变的情况下使用数据量更大的dataset发生了显存溢出(OOM)问题 的解决

    情况:计算 FVD 时,使用 dataset-1 时运行成功,使用数据量(data size)更大的 dataset-2 时运行失败.报错OOM:显存溢出. 查找问题:比较两次计算时的 input v ...

  4. watch和nvidia-smi命令实时查看GPU使用、显存占用情况

    方法一:watch -n 0.5 nvidia-smi watch -n 0.5 nvidia-smi:0.5代表每隔0.5秒刷新一次GPU使用情况,同理,每隔1秒刷新,则使用:watch -n 1 ...

  5. 模型显存占用及其计算量

    1. 显存的占用 当在GPU上跑一个模型时,显存的占用主要有两部分: 模型的输出(特征图.特征图的梯度).模型的参数(权重矩阵.偏置值.梯度) 1. 模型参数的显存占用:(例如:卷积核的参数.BN层. ...

  6. CNN模型的计算量、参数、显存占用

    经典CNN模型的计算量.参数.显存占用 文章目录 经典CNN模型的计算量.参数.显存占用 1. 深度学习复杂度 2. FLOPS概念 3.参数量计算 4. 输出特征图尺寸 5. 常用模型的FlOPs和 ...

  7. pytorch 优化GPU显存占用,避免out of memory

    pytorch 优化GPU显存占用,避免out of memory 分享一个最实用的招: 用完把tensor删掉,pytorch不会自动清理显存! 代码举例,最后多删除一个,gpu显存占用就会下降,训 ...

  8. 大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)

    点击我爱计算机视觉标星,更快获取CVML新技术 本文经授权转载自AINLP. 作者:光彩照人 学校:北京邮电大学 研究方向:自然语言处理,精准营销,风险控制 前序: Google AI最新出品的论文R ...

  9. ubuntu中显示本机的gpu_Ubuntu下实时查看Nvidia显卡显存占用情况和GPU温度

    一.查看Nvidia显卡显存占用情况 查看Nvidia显卡显存占用情况 nvidia-smi 效果如下: 显示的表格中: Fan: 风扇转速(0%–100%),N/A表示没有风扇 Temp: GPU温 ...

最新文章

  1. Binder通信机制介绍
  2. 对linux内核学习的一点感受,对linux内核学习的一点感受
  3. oracle快速插入大量数据
  4. Eclipse开发工具之崩溃和备份
  5. Android10加入APEX目的
  6. vivoy27android版本,vivo Y27手机系统是什么?vivo Y27能升级安卓4.3吗?
  7. MySQL 之 query cache
  8. 集中趋势度量Measures of Central Tendency
  9. 数据结构与算法之算法篇
  10. 〖教程〗Ladon提权Win2016/Win10/MSSQL2016
  11. docker执行权限问题Got permission denied while trying to connect to the Docker daemon socket
  12. python工程师的职业规划_一名Python开发工程师的职业规划
  13. 【时序异常检测翻译】1.DeepAnT: A Deep Learning Approach for Unsupervised Anomaly Detection in Time Series
  14. javaScript-模块化开发
  15. 小厂B端产品啥都干——B端表格设计入门指南(中)
  16. 一个Bug案例的解决过程:连续输入错误的PIN码,不能实现第二次倒计时30s才能重试
  17. AX7A200教程(3): DDR3突发读写
  18. 提问的智慧( 笔记)
  19. HTTP协议Header选项解读
  20. Part 4 描述性统计分析(占比 10%)——上

热门文章

  1. C#通过工厂模式,我把一大堆if干掉了
  2. ASP.NET Core Controller与IOC的羁绊
  3. 使用 .NET Core 中的 EventCounters 衡量性能
  4. Asp.Net Core Identity 骚断腿的究极魔改实体类
  5. TypeScript 3.7稳定版发布
  6. OsharpNS轻量级.net core快速开发框架简明入门教程
  7. ASP.NET Core中使用GraphQL - 第一章 Hello World
  8. .NET Core玩转机器学习
  9. Orleans解决并发之痛(三):集群
  10. Orleans入门例子