[开发技巧]·TensorFlow&Keras GPU使用技巧
[开发技巧]·TensorFlow&Keras GPU使用技巧

1.问题描述
在使用TensorFlow&Keras通过GPU进行加速训练时,有时在训练一个任务的时候需要去测试结果,或者是需要并行训练数据的时候就会显示OOM显存容量不足的错误。以下简称在训练一个任务的时候需要去测试结果,或者是需要并行训练数据为进行新的运算任务。
首先介绍下TensorFlow&Keras GPU使用的机制:TensorFlow&Keras会在有GPU可以使用时,自动将数据与运算放到GPU进行训练(这个不同于MXNet与PyTorch处理方式不同,MXNet与PyTorch需要手动编程去指定数据与运算的Device,这里不讨论这些方法之间的优劣,选择适合自己的就好了),默认充满GPU所有显存。
所以当用户在运行一个运算任务时会占据所有显存,如果再去开启一个新任务就会内存不足,引起OOM显存容量不足的错误。
2.问题分析
通过对上述问题解读,应该可以通过以下的方法解决:
- 当一个训练任务默认占据所有GPU显存的时候,可以使用CPU进行新的任务(这显然不是最优方法,使用CPU进行新的任务速度会很慢)
- 当一个训练任务默认占据所有GPU显存的时候,用户可以设定此任务占用的GPU显存大小,现在再使用GPU进行新的任务时,就可以并行运行了
- 如果有多个GPU可以默认指定任务在不同GPU上。
3.使用教程
1.解决方法一:使用CPU进行新的任务
这不是最优方法,使用CPU进行新的任务速度会很慢,但是也是一种解决方式
import os os.environ['CUDA_VISIBLE_DEVICES'] = '-1' # 打印 TF 可用的 GPU
print(os.environ['CUDA_VISIBLE_DEVICES']) # -1 表示不使用GPU
2.解决方法二:设定任务占用的GPU显存大小
这个是笔者比较推荐的方式,由于TensorFlow&Keras运行一个运算任务时会占据所有显存,其实有时并没有用到那么多。
这样做也会有点小问题就是,单个任务会变慢一点,笔者测试结果是在使用上述方法并行运行两个单个任务速度变为0.8左右,但是换来了可以运行两个任务,还是很值得的。(推测变慢的原因是两个任务并行运算时,对GPU压力更大,每个任务上分配的性能就会降低,类似于在电脑上跑多个任务,电脑会卡顿)
这样做要注意一点,在分配显存空间后,模型训练占据的内存要设置好(这个是指实际占用内存,可以通过修改batch_size来控制),不要超出你所分配的大小,不然会有不期望的结果出现。
import tensorflow as tf # 在开启对话session前,先创建一个 tf.ConfigProto() 实例对象 gpuConfig = tf.ConfigProto(allow_soft_placement=True) # 限制一个进程使用 60% 的显存
gpuConfig.gpu_options.per_process_gpu_memory_fraction = 0.6 # 把你的配置部署到session 变量名 sess 无所谓
sess1 =tf.Session(config=gpuConfig) #这样,如果你指定的卡的显存是2000M的话,你这个进程只能用1200M。
输出结果(with 1228 MB memory,代表使用1228 MB,这与设置的0.6 * 2000相符)
Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1228 MB memory) ->
physical GPU (device: 0, name: GeForce MX150, pci bus id: 0000:01:00.0, compute capability: 6.1)
3.解决方法三:多个GPU指定在不同GPU运行
如果条件允许,拥有多个,就可以把不同任务放置在不同GPU上,要注意如果是和同事共用,要约定好如何分配,免得大家都用了同一个。
设置方法与方法一类似。-1代表不使用,0代表第一个,1代表第二个
以两个GPU举例,第一个任务开头可以使用如下,第二个任务就把0改为1,多个GPU方法类似。注意一点要放置在开头位置。
import os os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 打印 TF 可用的 GPU
print(os.environ['CUDA_VISIBLE_DEVICES']) # -1 表示不使用GPU 0代表第一个
如果多于两个GPU,想在某个任务设置多个GPU,可以使用下述方法
import os os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # 打印 TF 可用的 GPU
print(os.environ['CUDA_VISIBLE_DEVICES']) # -1 表示不使用GPU 0代表第一个
最后留个大家一个思考问题,os.environ['CUDA_VISIBLE_DEVICES'] = '-1,0' 时会怎么样调用?
欢迎大家在评论区留言发布自己看法和解读。。
4.参考
1.https://www.cnblogs.com/tectal/p/9048184.html
[开发技巧]·TensorFlow&Keras GPU使用技巧的更多相关文章
- [开发技巧]·TensorFlow中numpy与tensor数据相互转化
[开发技巧]·TensorFlow中numpy与tensor数据相互转化 个人主页–> https://xiaosongshine.github.io/ - 问题描述 在我们使用TensorFl ...
- tensor搭建--windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速
windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速 原文见于:http://www.jianshu.com/p/c245d46d43f0 ...
- iOS开发UI篇—IOS开发中Xcode的一些使用技巧
iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n 新建项目 cmd + n 新建文 ...
- 转:ubuntu 下GPU版的 tensorflow / keras的环境搭建
http://blog.csdn.net/jerr__y/article/details/53695567 前言:本文主要介绍如何在 ubuntu 系统中配置 GPU 版本的 tensorflow 环 ...
- 快速开发 jQuery 插件的 10 大技巧(转)
1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...
- 谈谈TensorFlow with CPU support or TensorFlow with GPU support(图文详解)
不多说,直接上干货! You must choose one of the following types of TensorFlow to install: TensorFlow with CPU ...
- windows 下 TensorFlow(GPU 版)的安装
windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速 0. 环境 OS:Windows 10,64 bit: 显卡:NVIDIA GeFor ...
- 100天搞定机器学习|day39 Tensorflow Keras手写数字识别
提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...
- 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet
常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...
随机推荐
- 关于Wix的源代码
Wix的源代码有两种方式可以获得,以3.8为例: 在Release的页面下载wix38-debug.zip 通过SourceCode页面下载,http://wix.codeplex.com/Sourc ...
- SVM怎样解决多分类问题
从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器.即它仅仅回答属于正类还是负类的问题.而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定"是&q ...
- Eclipse中servlet显示无法导入javax.servlet包问题的解决方案
项目名-->右键 Property-->选择 JavaBuild Path-->选择 Add External JARs-->选择 把servlet-api.jar的路径输入即 ...
- OpenGLES 与 WebGL 中顶点属性的组织格式的误解 - 一个不好笑的笑话
版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589.加好友请注明来意. https://blog.csdn.net/sleks/article/details/289 ...
- 【Linux】服务器之间的免密登录脚本
在实际运维的过程中,经常需要用到免密登录,下面这个脚本实现服务器之间的免密登录,如下 比如,要实现A服务器与B.C.D服务器的免密登录,只需要将B.C.D服务器的IP地址写在serverlist.tx ...
- SSH Tunnel扫盲(ssh port forwarding端口转发)
SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能.它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中.下面仔细就仔细讨论SSH的这种非常有用的功能 ...
- HDU - 1241 Oil Deposits 【DFS】
题目链接 https://cn.vjudge.net/contest/65959#problem/L 题意 @表示油田 如果 @@是连在一起的 可以八个方向相连 那么它们就是 一块油田 要找出 一共有 ...
- Java多线程系列 基础篇06 synchronized(同步锁)
转载 http://www.cnblogs.com/paddix/ 作者:liuxiaopeng http://www.infoq.com/cn/articles/java-se-16-synchro ...
- 使用vscode写typescript(node.js环境)起手式
动机 一直想把typescript在服务端开发中用起来,主要原因有: javascript很灵活,但记忆力不好的话,的确会让你头疼,看着一月前自己写的代码,一脸茫然. 类型检查有利有敝,但在团队开发中 ...
- nginx+keepalived简单双机主从热备
双机主从热备概述 可以两台机子互为热备,平时各自负责各自的服务.在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续 ...