【转载】 TensorFlow学习——tf.GPUOptions和tf.ConfigProto用法解析

原文地址:

https://blog.csdn.net/c20081052/article/details/82345454

---------------------------------------------------------------------------------------------------

在服务器上用多GPU做训练时,由于想只用其中的一个GPU设备做训练,可使用深度学习代码运行时往往出现多个GPU显存被占满清理。出现该现象主要是tensorflow训练时默认占用所有GPU的显存。

查看你的源文件中是否有类似如下的代码片段: 

with tf.Graph().as_default():
    gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=args.gpu_memory_fraction)
    sess=tf.Session(config=tf.ConfigProto(gpu_options=gpu_options,log_device_placement=False))
    with sess.as_default():

上述代码片段主要是在创建session的时候,对session进行参数配置用的,

tf.ConfigProto()   的参数如下:

log_device_placement=True : 是否打印设备分配日志

allow_soft_placement=True : 如果你指定的设备不存在,允许TF自动分配设备

tf.ConfigProto(log_device_placement=True,   allow_soft_placement=True)

在构造tf.Session()时可通过tf.GPUOptions作为可选配置参数的一部分来显示地指定需要分配的显存比例。

per_process_gpu_memory_fraction    指定了每个GPU进程中使用显存的上限,但它只能均匀地作用于所有GPU,无法对不同GPU设置不同的上限。

示例代码如下:

#allow growth
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)
# 使用allow_growth option,刚一开始分配少量的GPU容量,然后按需慢慢的增加,由于不会释放
#内存,所以会导致碎片
# per_process_gpu_memory_fraction
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
config=tf.ConfigProto(gpu_options=gpu_options)
session = tf.Session(config=config, ...)
#设置每个GPU应该拿出多少容量给进程使用,0.4代表 40%

指定GPU设备号和个数

方法一:如果你在终端指定GPU个数和ID号,如果电脑有多个GPU,tensorflow默认全部使用。如果想只使用部分GPU,可以设置CUDA_VISIBLE_DEVICES。在调用python程序时,可以使用:

CUDA_VISIBLE_DEVICES=1 python your_script.py #在运行脚本前指定GPU的设备号
 
#常规设置有:
CUDA_VISIBLE_DEVICES=1           Only device 1 will be seen
CUDA_VISIBLE_DEVICES=0,1         Devices 0 and 1 will be visible
CUDA_VISIBLE_DEVICES="0,1"       Same as above, quotation marks are optional
CUDA_VISIBLE_DEVICES=0,2,3       Devices 0, 2, 3 will be visible; device 1 is masked
CUDA_VISIBLE_DEVICES=""          No GPU will be visible
 
#你也可以使用
export CUDA_VISIBLE_DEVICES=2   #指定设备号

方法二:如果你在python原文件中作更改,在在文件开始处添加如下内容:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"  #指明了GPU ID号
 
#若多个GPU的话
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2"  #指明了两个GPU ID号,注意这里不区分双引号和单引号

实用技巧:

如果你在linux终端运行深度学习python脚本文件,运行中发现占用多个GPU和内存资源,则请先查看占用资源的进程归属方是谁:

$ps  -f    PID号

然后确认该进程可以kill掉情况下建议:

$kill   -9    PID号


ctrl+Z指令只能强制结束当前流程,无法退出进程,所以发现有问题后用ctrl+Z后还需要kill进程。

---------------------------------------------------------------------------------------------------

————————————————
版权声明:本文为CSDN博主「ciky奇」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/c20081052/article/details/82345454

-------------------------------------------------------

原文地址:https://www.cnblogs.com/devilmaycry812839668/p/12035678.html