tensorflow使用指定gpu的方法


Posted in Python onFebruary 04, 2020

TensorFlow是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief [1]  。
Tensorflow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究 。

TensorFlow由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud在内的多个项目以及各类应用程序接口(Application Programming Interface, API) 。自2015年11月9日起,TensorFlow依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码 。

持续监控GPU使用情况命令:

$ watch -n 10 nvidia-smi

一、指定使用某个显卡

如果机器中有多块GPU,tensorflow会默认吃掉所有能用的显存, 如果实验室多人公用一台服务器,希望指定使用特定某块GPU。
可以在文件开头加入如下代码:

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "1"  # 使用第二块GPU(从0开始)

也可以制定使用某几块GPU

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2" # 使用第一, 三块GPU

禁用GPU

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

支持的设备

在一套标准系统中通常有多台计算设备。TensorFlow 支持 CPU 和 GPU 这两种设备。它们均用 strings 表示。例如:

"/cpu:0":机器的 CPU。
"/device:GPU:0":机器的 GPU(如果有一个)。
"/device:GPU:1":机器的第二个 GPU(以此类推)。

如果 TensorFlow 指令中兼有 CPU 和 GPU 实现,当该指令分配到设备时,GPU 设备有优先权。例如,如果 matmul 同时存在 CPU 和 GPU 核函数,在同时有 cpu:0 和 gpu:0 设备的系统中,gpu:0 会被选来运行 matmul。

记录设备分配方式

要找出您的指令和张量被分配到哪个设备,请创建会话并将 log_device_placement 配置选项设为 True。

#Creates a graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
#Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
#Runs the op.
print(sess.run(c))

应该会看到以下输出内容:

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/device:GPU:0
a: /job:localhost/replica:0/task:0/device:GPU:0
MatMul: /job:localhost/replica:0/task:0/device:GPU:0
[[ 22. 28.]
 [ 49. 64.]]

手动分配设备

如果您希望特定指令在您选择的设备(而非系统自动为您选择的设备)上运行,您可以使用 with tf.device 创建设备上下文,这个上下文中的所有指令都将被分配在同一个设备上运行。

# Creates a graph.
with tf.device('/cpu:0'):
 a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
 b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))

您会看到现在 a 和 b 被分配到 cpu:0。由于未明确指定运行 MatMul 指令的设备,因此 TensorFlow 运行时将根据指令和可用设备(此示例中的 gpu:0)选择一个设备,并会根据要求自动复制设备间的张量。

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/cpu:0
a: /job:localhost/replica:0/task:0/cpu:0
MatMul: /job:localhost/replica:0/task:0/device:GPU:0
[[ 22. 28.]
 [ 49. 64.]]

允许增加 GPU 内存

默认情况下,TensorFlow 会映射进程可见的所有 GPU 的几乎所有 GPU 内存(取决于 CUDA_VISIBLE_DEVICES)。通过减少内存碎片,可以更有效地使用设备上相对宝贵的 GPU 内存资源。

在某些情况下,最理想的是进程只分配可用内存的一个子集,或者仅根据进程需要增加内存使用量。 TensorFlow 在 Session 上提供两个 Config 选项来进行控制。

第一个是 allow_growth 选项,它试图根据运行时的需要来分配 GPU 内存:它刚开始分配很少的内存,随着 Session 开始运行并需要更多 GPU 内存,我们会扩展 TensorFlow 进程所需的 GPU 内存区域。请注意,我们不会释放内存,因为这可能导致出现更严重的内存碎片情况。要开启此选项,请通过以下方式在 ConfigProto 中设置选项:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

第二个是 per_process_gpu_memory_fraction 选项,它可以决定每个可见 GPU 应分配到的内存占总内存量的比例。例如,您可以通过以下方式指定 TensorFlow 仅分配每个 GPU 总内存的 40%:

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

如要真正限制 TensorFlow 进程可使用的 GPU 内存量,这非常实用。

在多 GPU 系统中使用单一 GPU
如果您的系统中有多个 GPU,则默认情况下将选择 ID 最小的 GPU。如果您希望在其他 GPU 上运行,则需要显式指定偏好设置:

# Creates a graph.
with tf.device('/device:GPU:2'):
 a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
 b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
 c = tf.matmul(a, b)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(c))

如果您指定的设备不存在,您会看到 InvalidArgumentError:

InvalidArgumentError: Invalid argument: Cannot assign a device to node 'b':
Could not satisfy explicit device specification '/device:GPU:2'
 [[Node: b = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [3,2]
 values: 1 2 3...>, _device="/device:GPU:2"]()]]

当指定设备不存在时,如果您希望 TensorFlow 自动选择现有的受支持设备来运行指令,则可以在创建会话时将配置选项中的 allow_soft_placement 设为 True。

# Creates a graph.
with tf.device('/device:GPU:2'):
 a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
 b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
 c = tf.matmul(a, b)
# Creates a session with allow_soft_placement and log_device_placement set
# to True.
sess = tf.Session(config=tf.ConfigProto(
  allow_soft_placement=True, log_device_placement=True))
# Runs the op.
print(sess.run(c))

使用多个 GPU

如果您想要在多个 GPU 上运行 TensorFlow,则可以采用多塔式方式构建模型,其中每个塔都会分配给不同 GPU。例如:

# Creates a graph.
c = []
for d in ['/device:GPU:2', '/device:GPU:3']:
 with tf.device(d):
 a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
 b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
 c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
 sum = tf.add_n(c)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(sum))

您会看到以下输出内容:

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K20m, pci bus
id: 0000:02:00.0
/job:localhost/replica:0/task:0/device:GPU:1 -> device: 1, name: Tesla K20m, pci bus
id: 0000:03:00.0
/job:localhost/replica:0/task:0/device:GPU:2 -> device: 2, name: Tesla K20m, pci bus
id: 0000:83:00.0
/job:localhost/replica:0/task:0/device:GPU:3 -> device: 3, name: Tesla K20m, pci bus
id: 0000:84:00.0
Const_3: /job:localhost/replica:0/task:0/device:GPU:3
Const_2: /job:localhost/replica:0/task:0/device:GPU:3
MatMul_1: /job:localhost/replica:0/task:0/device:GPU:3
Const_1: /job:localhost/replica:0/task:0/device:GPU:2
Const: /job:localhost/replica:0/task:0/device:GPU:2
MatMul: /job:localhost/replica:0/task:0/device:GPU:2
AddN: /job:localhost/replica:0/task:0/cpu:0
[[ 44. 56.]
 [ 98. 128.]]

cifar10 教程就是个很好的例子,演示了如何使用多个 GPU 进行训练。

见官方教程:https://www.tensorflow.org/programmers_guide/using_gpu?hl=zh-cn

总结

以上所述是小编给大家介绍的tensorflow使用指定gpu的方法,希望对大家有所帮助!

Python 相关文章推荐
Python3实战之爬虫抓取网易云音乐的热门评论
Oct 09 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
Python拼接字符串的7种方法总结
Nov 01 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
对django views中 request, response的常用操作详解
Jul 17 Python
python提取照片坐标信息的实例代码
Aug 14 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Python 文件数据读写的具体实现
Jan 24 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
python中可以声明变量类型吗
Jun 18 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 #Python
基于TensorFlow中自定义梯度的2种方式
Feb 04 #Python
tensorflow 查看梯度方式
Feb 04 #Python
opencv python图像梯度实例详解
Feb 04 #Python
TensorFlow设置日志级别的几种方式小结
Feb 04 #Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 #Python
解决tensorflow打印tensor有省略号的问题
Feb 04 #Python
You might like
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
JavaScript中的私有成员
2006/09/18 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Python中的TCP socket写法示例
2018/05/11 Python
python爬取哈尔滨天气信息
2018/07/14 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
python 如何将office文件转换为PDF
2020/09/22 Python
Java面试题:为什么要用Java
2012/05/11 面试题
我的中国梦演讲稿400字
2014/08/19 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
运动会广播稿200字
2015/08/19 职场文书
如何写好活动总结
2019/06/21 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS