时间:2021-05-22
初步尝试 Keras (基于 Tensorflow 后端)深度框架时, 发现其对于 GPU 的使用比较神奇, 默认竟然是全部占满显存, 1080Ti 跑个小分类问题, 就一下子满了. 而且是服务器上的两张 1080Ti.
服务器上的多张 GPU 都占满, 有点浪费性能.
因此, 需要类似于 Caffe 等框架的可以设定 GPU ID 和显存自动按需分配.
实际中发现, Keras 还可以限制 GPU 显存占用量.
这里涉及到的内容有:
GPU ID 设定
GPU 显存占用按需分配
GPU 显存占用限制
GPU 显存优化
1. GPU ID 设定
#! -- coding: utf-8 --*--import osos.environ["CUDA_VISIBLE_DEVICES"] = "1"这里将 GPU ID 设为 1.
GPU ID 从 0 开始, GPUID=1 即表示第二块 GPU.
2. GPU 显存占用按需分配
#! -- coding: utf-8 --*--import tensorflow as tfimport keras.backend.tensorflow_backend as ktf# GPU 显存自动调用config = tf.ConfigProto()config.gpu_options.allow_growth=Truesession = tf.Session(config=config)ktf.set_session(session)3. GPU 显存占用限制
#! -- coding: utf-8 --*--import tensorflow as tfimport keras.backend.tensorflow_backend as ktf# 设定 GPU 显存占用比例为 0.3config = tf.ConfigProto()config.gpu_options.per_process_gpu_memory_fraction = 0.3session = tf.Session(config=config)ktf.set_session(session )这里虽然是设定了 GPU 显存占用的限制比例(0.3), 但如果训练所需实际显存占用超过该比例, 仍能正常训练, 类似于了按需分配.
设定 GPU 显存占用比例实际上是避免一定的显存资源浪费.
4. GPU ID 设定与显存按需分配
#! -- coding: utf-8 --*--import osimport tensorflow as tfimport 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.3session = tf.Session(config=config)ktf.set_session(session)# 指定GPUID, 第一块GPU可用os.environ["CUDA_VISIBLE_DEVICES"] = "0"5. 利用fit_generator最小化显存占用比例/数据Batch化
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 osimport tensorflow as tffrom keras.backend.tensorflow_backend import set_sessionfrom numba import cudaStep3: 指定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) # 方法二:选择GPU1cuda.close() #关闭选择的GPU以上这篇Keras - GPU ID 和显存占用设定步骤就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Tensorfow框架下,在模型运行时,设置对显存的占用。1.按比例config=tf.ConfigProto()config.gpu_options.per_
1.keras新版本中加入多GPU并行使用的函数下面程序段即可实现一个或多个GPU加速:注意:使用多GPU加速时,Keras版本必须是Keras2.0.9以上版
如果在python内调用pytorch有可能显存和GPU占用不会被自动释放,此时需要加入如下代码torch.cuda.empty_cache()我们来看一下官方
最大预渲染设置是4,最大预渲染帧数同时占用额外的处理器时间和GPU额外显存,如果处理器并不好和显存并不大,请设置为1到2范围内,让大部分的性能用来渲染当前帧。
显存和内存区别是: 1、内存是由CPU和WINDOWS系统调度使用,显存则只由显卡GPU和图形图像显示程序调度和使用。内存可以在一定条件充当显存,而显存则无法