首页 技术 正文
技术 2022年11月9日
0 收藏 867 点赞 3,273 浏览 2132 个字

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

[开发技巧]·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.问题分析

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

  1. 当一个训练任务默认占据所有GPU显存的时候,可以使用CPU进行新的任务(这显然不是最优方法,使用CPU进行新的任务速度会很慢)
  2. 当一个训练任务默认占据所有GPU显存的时候,用户可以设定此任务占用的GPU显存大小,现在再使用GPU进行新的任务时,就可以并行运行了
  3. 如果有多个GPU可以默认指定任务在不同GPU上。

3.使用教程

1.解决方法一:使用CPU进行新的任务

这不是最优方法,使用CPU进行新的任务速度会很慢,但是也是一种解决方式

import osos.environ['CUDA_VISIBLE_DEVICES'] = '-1'  # 打印 TF 可用的 GPU
print(os.environ['CUDA_VISIBLE_DEVICES'])# -1 表示不使用GPU

[开发技巧]·TensorFlow&Keras 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。

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

输出结果(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)

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

3.解决方法三:多个GPU指定在不同GPU运行

如果条件允许,拥有多个,就可以把不同任务放置在不同GPU上,要注意如果是和同事共用,要约定好如何分配,免得大家都用了同一个。

设置方法与方法一类似。-1代表不使用,0代表第一个,1代表第二个

以两个GPU举例,第一个任务开头可以使用如下,第二个任务就把0改为1,多个GPU方法类似。注意一点要放置在开头位置。

import osos.environ['CUDA_VISIBLE_DEVICES'] = '0' # 打印 TF 可用的 GPU
print(os.environ['CUDA_VISIBLE_DEVICES'])# -1 表示不使用GPU 0代表第一个

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

如果多于两个GPU,想在某个任务设置多个GPU,可以使用下述方法

import osos.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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,494
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295