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

1.问题描述

在使用TensorFlow&Keras通过GPU进行加速训练时,有时在训练一个任务的时候需要去测试结果,或者是需要并行训练数据的时候就会显示OOM显存容量不足的错误。以下简称在训练一个任务的时候需要去测试结果,或者是需要并行训练数据为进行新的运算任务。

首先介绍下TensorFlow&Keras GPU使用的机制:TensorFlow&Keras会在有GPU可以使用时,自动将数据与运算放到GPU进行训练(这个不同于MXNet与PyTorch处理方式不同,MXNet与PyTorch需要手动编程去指定数据与运算的Device,这里不讨论这些方法之间的优劣,选择适合自己的就好了),默认充满GPU所有显存。 

所以当用户在运行一个运算任务时会占据所有显存,如果再去开启一个新任务就会内存不足,引起OOM显存容量不足的错误。

2.问题分析

通过对上述问题解读,应该可以通过以下的方法解决:

  1. 当一个训练任务默认占据所有GPU显存的时候,可以使用CPU进行新的任务(这显然不是最优方法,使用CPU进行新的任务速度会很慢)
  2. 当一个训练任务默认占据所有GPU显存的时候,用户可以设定此任务占用的GPU显存大小,现在再使用GPU进行新的任务时,就可以并行运行了
  3. 如果有多个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使用技巧的更多相关文章

  1. [开发技巧]·TensorFlow中numpy与tensor数据相互转化

    [开发技巧]·TensorFlow中numpy与tensor数据相互转化 个人主页–> https://xiaosongshine.github.io/ - 问题描述 在我们使用TensorFl ...

  2. 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 ...

  3. iOS开发UI篇—IOS开发中Xcode的一些使用技巧

    iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文 ...

  4. 转:ubuntu 下GPU版的 tensorflow / keras的环境搭建

    http://blog.csdn.net/jerr__y/article/details/53695567 前言:本文主要介绍如何在 ubuntu 系统中配置 GPU 版本的 tensorflow 环 ...

  5. 快速开发 jQuery 插件的 10 大技巧(转)

    1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...

  6. 谈谈TensorFlow with CPU support or TensorFlow with GPU support(图文详解)

    不多说,直接上干货! You must choose one of the following types of TensorFlow to install: TensorFlow with CPU ...

  7. windows 下 TensorFlow(GPU 版)的安装

    windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速 0. 环境 OS:Windows 10,64 bit: 显卡:NVIDIA GeFor ...

  8. 100天搞定机器学习|day39 Tensorflow Keras手写数字识别

    提示:建议先看day36-38的内容 TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edge ...

  9. 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...

随机推荐

  1. apache 绿色版 安装

    下载绿色版apache 本文已apache2.4为例 http://www.apachehaus.com/cgi-bin/download.plx 下载后解压 打开readme_first.html文 ...

  2. memcache-session-manager(flexjson)

    MSM项目FlexJson序列化参考文档. 序号(步骤) 需求描述 jar包列表: spymemcached-2.11.1.jar memcached-session-manager-tc8-1.8. ...

  3. 【shell】awk引用外部变量

    在使用awk的过程中,经常会需要引用外部变量,但是awk需要使用单引号将print包起来,导致print后的$引用无效,可以采用下面的方式 例如: #!/bin/bash a="line1 ...

  4. gradle 与 gradlew

    配置好gradle环境变量后(配置环境变量这里就不说了,可以自行百度),我们就可以在cmd中使用gradle命令了 在cmd中输入: gradle -v 输出如下: 这时说明gradle的环境变量配置 ...

  5. Linux安装ElasticSearch启动报错的解决方法

    Linux安装ElasticSearch后,ElasticSearch是不能用root用户启动的,以root用户启动会报错Refer to the log for complete error det ...

  6. leetcode 890. Possible Bipartition

    Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of ...

  7. 和菜鸟一起学android4.0.3源码之硬件gps简单移植【转】

    本文转载自:http://blog.csdn.net/mwj19890829/article/details/18751447 关于Android定位方式 android 定位一般有四种方法,这四种方 ...

  8. OpenGL几何变换---翻译http://www.songho.ca/opengl/gl_projectionmatrix.html

    Overview 几何数据——顶点位置,和法向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点运算(Vertex Operation)和基本组合 ...

  9. BZOJ 3410 [Usaco2009 Dec]Selfish Grazing 自私的食草者:贪心【最多线段覆盖】

    题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1324 题意: 给你n个区间,问你最多能选择多少个区间使得它们不相互覆盖. 题解: RQ ...

  10. html中css的三种样式

    在html中定义CSS样式的方法有三种,新建CSS文件 使用link 关联 这种是最常用的外部引用样式,第二种讲样式写在 head 头部里面 这种是页面样式 ,第三中样式直接写在行内  style里面 ...