在ubuntu系统下双显卡运行TensorFlow代码报错:

ValueError: Memory growth cannot differ between GPU devices

报错的代码位置为: tf.config.experimental.set_memory_growth(physical_devices[0], True)

全部代码:

import os
import tensorflow as tf
from tensorflow.keras.applications import resnet50 physical_devices = tf.config.list_physical_devices('GPU')
print(physical_devices) tf.config.experimental.set_memory_growth(physical_devices[0], True) #加载预训练模型
model = resnet50.ResNet50(weights='imagenet') #save_model方式保存模型
tf.saved_model.save(model, "resnet/1/")

报错:

===============================================

查了网上的各种说法,有的说是TensorFlow的版本问题,有的说是TensorFlow的bug问题,有的说的gpu的版本问题(只有rtx2070和rtx2080的双显卡才会报错)

于是我就换了在服务器上运行,服务器为4卡泰坦,运行结果与上面的相同。

通过这样的对比实验我们可以得出结论,那就是这个并不是TensorFlow版本问题或是显卡版本问题,而是对于多显卡的运行模式下上面的写法并不是很正确,这本身就是TensorFlow的预先设定。

=====================================================

如果代码修改下就可以不报错,也就是添加内容:os.environ['CUDA_VISIBLE_DEVICES']='0'

import os
import tensorflow as tf
from tensorflow.keras.applications import resnet50 os.environ['CUDA_VISIBLE_DEVICES']='0' physical_devices = tf.config.list_physical_devices('GPU')
print(physical_devices) tf.config.experimental.set_memory_growth(physical_devices[0], True) #加载预训练模型
model = resnet50.ResNet50(weights='imagenet') #save_model方式保存模型
tf.saved_model.save(model, "resnet/1/")

运行正常不报错:

如果修改成下面这样,依然报同样的错误。

import os
import tensorflow as tf
from tensorflow.keras.applications import resnet50 #os.environ['CUDA_VISIBLE_DEVICES']='0' physical_devices = tf.config.list_physical_devices('GPU')
print(physical_devices) #os.environ['CUDA_VISIBLE_DEVICES']='0'
tf.config.experimental.set_memory_growth(physical_devices[0], True) #加载预训练模型
model = resnet50.ResNet50(weights='imagenet') #save_model方式保存模型
tf.saved_model.save(model, "resnet/1/")

回过头我们再仔细研究下报错的信息:

其实之所以报错就是因为主机有多块显卡,我们默认进行计算的时候是使用所有的显卡的,但是我们设置set_memory_growth时只为了部分显卡做设定,这样就造成了所要调用的显卡中部分显卡为set_memory_growth模式而部分不是,这样就造成了显卡与显卡之间的模式不已配的问题,因此也就报错了:

ValueError: Memory growth cannot differ between GPU devices

解决这个问题也是简单只要我们把所有用到的显卡模式设置为统一,如果设置set_memory_growth模式就为所有显卡都进行设定,也或者我们指定只使用部分显卡然后对这部分指定的显卡设置set_memory_growth模式。而设定只使用部分显卡的写法为:

os.environ['CUDA_VISIBLE_DEVICES']='0'

os.environ['CUDA_VISIBLE_DEVICES']='0,1'

而且需要知道一点,那就是os.environ['CUDA_VISIBLE_DEVICES']='0'这样的设置必须在调用TensorFlow框架之前声明否则不生效,这样同样会报错,就像上面的对比实验一样。

如下面:

为了方便我们可以直接把os.environ['CUDA_VISIBLE_DEVICES']='0'写在文件的最前面。

===============================================

如果我们想使用多块显卡进行计算,并且想使用set_memory_growth设置,那么我们就需要对这些显卡都进行set_memory_growth模式设置,具体如下代码:

import os
import tensorflow as tf
from tensorflow.keras.applications import resnet50 os.environ['CUDA_VISIBLE_DEVICES']='0,1' physical_devices = tf.config.list_physical_devices('GPU')
print(physical_devices) tf.config.experimental.set_memory_growth(physical_devices[0], True)
tf.config.experimental.set_memory_growth(physical_devices[1], True) #加载预训练模型
model = resnet50.ResNet50(weights='imagenet') #save_model方式保存模型
tf.saved_model.save(model, "resnet/1/")

关键的设置为:

==================================================

【解决】ValueError: Memory growth cannot differ between GPU devices的更多相关文章

  1. Allowing GPU memory growth

    By default, TensorFlow maps nearly all of the GPU memory of all GPUs (subject to CUDA_VISIBLE_DEVICE ...

  2. 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  3. _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  4. 【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)

    原文转自 http://blog.csdn.net/u011430225/article/details/47840647 我的环境是: XP SP2.VS2003 最近在一个项目中, 程序退出后都出 ...

  5. [已解决]ValueError: row index was 65536, not allowed by .xls format

    报错: ValueError: row index was 65536, not allowed by .xls format 解决方案: xlrd和xlwt处理的是xls文件,单个sheet最大行数 ...

  6. 吴裕雄--天生自然TensorFlow高层封装:解决ValueError: Invalid backend. Missing required entry : placeholder

    找到对应的keras配置文件keras.json 将里面的内容修改为以下就可以了

  7. cmd 【已解决】windows连接手机,运行adb devices提示“unauthorized”

    报错截图如下: 问题原因:电脑连接手机.手机未授权 解决方式: 设置----开发者选项-----打开USB调试,出现如下弹框,点击"确定"即可解决问题.

  8. Tensorflow2对GPU内存的分配策略

    一.问题源起 从以下的异常堆栈可以看到是BLAS程序集初始化失败,可以看到是执行MatMul的时候发生的异常,基本可以断定可能数据集太大导致memory不够用了. 2021-08-10 16:38:0 ...

  9. 解决TensorFlow程序无限制占用GPU

    今天遇到一个奇怪的现象,使用tensorflow-gpu的时候,出现内存超额~~如果我训练什么大型数据也就算了,关键我就写了一个y=W*x.......显示如下图所示: 程序如下: import te ...

  10. 【Udacity并行计算课程笔记】- Lesson 3 Fundamental GPU Algorithms (Reduce, Scan, Histogram)

    本周主要内容如下: 如何分析GPU算法的速度和效率 ​​3个新的基本算法:归约.扫描和直方图(Reduce.Scan.Histogram) 一.评估标准 首先介绍用于评估GPU计算的两个标准: ste ...

随机推荐

  1. node.js常用命令总结

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,用于构建快速.可扩展的网络应用程序.它使用事件驱动.非阻塞 I/O 模型,使其非常适合构建数据密集型的实时应用 ...

  2. 增补博客 第二十三篇 python 对比Python中的列表、元组、字典、集合、字符串等之间异同

    1. 列表(List): - 异同:列表是可变(Mutable)的有序容器,使用方括号 [] 定义,可以存储任意类型的元素.可以通过索引访问和修改列表中的元素.列表支持切片操作和列表推导式. - 相同 ...

  3. 基于阿里Anolis OS8.8 的Hadoop大数据平台建设

    基于阿里Anolis OS8.8 的Hadoop大数据平台建设 VNC安装与使用 0 Anolis OS基本操作 0.1 Anolis OS用户与组管理 0.2 系统进程管理 0.3 文件操作命令及权 ...

  4. Linux日志搜索 grep

    1.关键字"或"的搜索, -E 不能少.grep -E "word1|word2|word3" file.txt满足任意条件(word1.word2和word3 ...

  5. Java 对象转Map,Java Map转对象方法

    Java 对象转Map,Java Map转对象方法 import com.alibaba.fastjson.JSON; import org.apache.commons.beanutils.Bean ...

  6. 笔记:Sublime Text3配置

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 笔记:Sublime Text3配置 日期:2017-12 ...

  7. HTML5 在泛在电力物联网的 10 大业务领域 2/3D 可视化应用

    过去的 2018 年,我们认为是国内工业互联网可视化的元年,图扑软件作为在工业可视化领域的重度参与者,一线见证了众多 HTML5/Web 化.2D/3D 化的项目在工业界应用落地. 2019 年可以定 ...

  8. RHEL8.1---离线升级gcc

    升级gcc到gcc9.1.0 下载离线包.放到/opt下 [root@172-18-251-35 opt]# wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc ...

  9. poj1163 the triangle 题解

    Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a progr ...

  10. Android7关机充电流程

    2021-09-03:Android7关机充电流程 背景 为了修改关机充电中的显示效果,因此学习一下Android 7关机充电的流程是怎么样的. 以msm8909为例. [ 94.741021] ch ...