TensorFlow基础篇——(二)TensorFlow和keras中参数配置的用法

TensorFlow基础篇——(二)TensorFlow和keras中参数配置的用法
TensorFlow和keras中GPU使用的设置
方法一: 在终端显式指定
方法二 :在Python代码中指定
方法三 :使用深度学习工具提供的 API指定
Pytorch中GPU使用的设置
tf.ConfigProto的用法说明
一、TensorFlow下tf.ConfigProto的使用方法
二、Keras下tf.ConfigProto的使用方法
tf.GPUOptions的用法说明
CPU充分占用
Keras以及Tensorflow强制使用CPU的方法
Keras中文文档官方教程

Keras下GPU的使用

keras在使用GPU的时候有个特点,就是默认全部占满显存。 若单核GPU也无所谓,若是服务器GPU较多,性能较好,全部占满就太浪费了。于是乎有以下五种情况:

1、指定GPU
2、使用固定显存的GPU
3、指定GPU + 固定显存
4、GPU动态增长
5、CPU充分占用
6、tf.keras 使用多 GPU
1
2
3
4
5
6
Keras下CPU的使用

注意:这一部分要放在导入Keras之前

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""
1
2
3
注意:os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"可能会改变没有次句时GPU的默认序号。

参考链接:关于keras中使用CPU/GPU的配置(包含tensorboard使用)

TensorFlow和keras中GPU使用的设置
方法一: 在终端显式指定
这种方法与深度学习工具无关了,无论是Keras,tensorflow 还是Pytorch都可以使用。

训练运行时候指定GPU,需在运行时候加一行代码:
CUDA_VISIBLE_DEVICES=0,2,3 python your_file.py
1
备注:这里的0,2,3是通过nvidia-smi 命令查看的GPU编号。CUDA_VISIBLE_DEVICES取多个值时对应Tensorflow、Pytorch、Keras的多GPU的并行操作。

运行过程中按需或者定量分配GPU,需在运行时候加一行代码:
CUDA_VISIBLE_DEVICES=0,1 python yourcode.py
1
方法二 :在Python代码中指定
这种方法也是与深度学习工具无关的方法。仔细看看这种方式其实和在【终端显式指定】类似,关键字都是一样的。

import os

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 多个GPU下使用的方法是“0,1,2,3”
1
2
3
4
备注: 需要注意的是,第一、二种方法在有些时候是无法起到作用的;如果遇到到这种情况: 用Kears的时候指定了多个GPU,但还是出现OOM异常,则可通过设置Kears函数 keras.utils.multi_gpu_model(model=xxx,gpus=nums) 来指定使用多少GPU;

方法三 :使用深度学习工具提供的 API指定
TensorFlow和keras中指定GPU的设置:

tensorflow直接在开启Session时候加几行代码就行,而Keras指定GPU,并限制按需用量和TensorFlow不太一样,因为keras训练是封装好的,不好对Session操作。如下是两种对应的操作。

1-1. keras中的操作——指定GPU的设置【tf.ConfigProto()函数】:

# 在python程序中设置:
import os
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session

# 指定第一块GPU可用
os.environ["CUDA_VISIBLE_DEVICES"] = "0" #指定GPU的第二种方法

"""
ConfigProto()类提供有对GPU使用率的函数方法:
"""
config = tf.ConfigProto()
config.gpu_options.allocator_type = 'BFC' #A "Best-fit with coalescing" algorithm, simplified from a version of dlmalloc.
config.gpu_options.per_process_gpu_memory_fraction = 0.3 #定量——设置使用率,占用GPU30%的显存
config.gpu_options.allow_growth = True #按需——指定GPU的数量是否增长
set_session(tf.Session(config=config))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1-2. Keras中的操作——指定GPU的设置【multi_gpu_model函数】:

由于Kears是作为Tesorflow或者Theano的前端出现的,从某种方式上也是可以用后端深度学习框架进行多GPU的指定的,上述1-1就是调用的kears的多GPU并行的方式,但这种方式写的代码不美观。Kears本身提供有 keras.utils.multi_gpu_model(model=xxx,gpus=nums) 函数来指定使用多少GPU进行编译。

from keras.utils import multi_gpu_model
model=SegNet() # 构建model
parralle_model = multi_gpu_model(model,gpus=3) # 指定gpu的数量
parralle_model.compile(loss='mse', optimizer=optimizer, loss_weights=[1,1]) # 模型编译
1
2
3
4
2. TensorFlow中的操作——指定GPU的设置:

# 在python程序中设置:
#指定GPU
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" # 其中0,1是选择所调用的gpu id

"""
ConfigProto()类提供有对GPU使用率的函数方法:
"""
#设置GPU定量分配
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9 # 占用GPU90%的显存
session = tf.Session(config=config)

#设置GPU按需分配
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tensroflow指定GPU的多卡并行的时候,也是可以先将声明的变量放入GPU中,不过其他的框架没有这样做。

with tf.device("/gpu:%d"%i):

with tf.device("cpu:0")
1
2
3
参考链接:TensorFlow和keras中GPU使用的设置

个人推荐使用的最好方式:

import os # 建议使用这种方式
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = "2" # python 的方式指定GPU id
from keras.backend.tensorflow_backend import set_session # 如果不是使用Kears的话,可以不用写这句话
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 指定GPU 利用率
set_session(tf.Session(config=config)) # 如果使用Kears的话,需要这句话
1
2
3
4
5
6
7
Pytorch中GPU使用的设置
Pytorch 是目前比较方便的一种深度学习框架,在指定GPU的方法上,也是比较简洁。PyTorch提供有torch.cuda.set_device() 方法。

import torch
torch.cuda.set_device(id)
1
2
这种方式只能制定一个GPU ,不太建议使用。

参考链接:Tensorflow、Pytorch、Keras的多GPU使用

tf.ConfigProto的用法说明
tf.ConfigProto一般用在创建session的时候,用来对session进行参数配置 ,而tf.GPUOptions可以作为设置tf.ConfigProto时的一个参数选项,一般用于限制GPU资源的使用 。

with tf.Session(config=tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))) as sess:
1
一、TensorFlow下tf.ConfigProto的使用方法
TensorFlow下tf.ConfigProto的使用方法:

tf.ConfigProto()的常用参数说明:

log_device_placement=True : 是否打印设备分配日志
allow_soft_placement=True : 如果你指定的设备不存在,允许TF自动分配设备
tf.ConfigProto()使用参数的两种方法:

1. 第一种是构造config对象时直接赋值 。如下:

tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)
1
2. 第二种是先构造config对象,再对构造的config对象进行赋值 。如下:

config = tf.ConfigProto()

config.log_device_placement= True

config.allow_soft_placement=True
1
2
3
4
5
备注:tf.ConfigProto()含有的部分参数(属性与方法),可使用命令dir(tf.ConfigProto())进行查看。


tf.ConfigProto()让参数设置生效的方法:

session = tf.Session(config=config)
1
二、Keras下tf.ConfigProto的使用方法
Keras下tf.ConfigProto的使用方法:

Keras下tf.ConfigProto的使用方法,基本与TensorFlow下相同,只是在 tf.ConfigProto()让参数设置生效的方法 部分,需额外添加以下两行代码:

from keras.backend.tensorflow_backend import set_session

set_session(tf.Session(config=config))
1
2
3
tf.GPUOptions的用法说明
tf.GPUOptions可以作为设置tf.ConfigProto时的一个参数选项,一般用于限制GPU资源的使用 。

为了加快运行效率,TensorFlow在初始化时会尝试分配所有可用的GPU显存资源给自己,这在多人使用的服务器上工作就会导致GPU占用,别人无法使用GPU工作的情况。

tf提供了两种控制GPU资源使用的方法:

第一种:让TensorFlow在运行过程中动态申请显存,需要多少就申请多少;
第二种:限制GPU的使用率。
1.1 动态申请显存

方法一:

config = tf.ConfigProto()

config.gpu_options.allow_growth = True

session = tf.Session(config=config)

方法二:

gpu_options=tf.GPUOptions(allow_growth = True)

config=tf.ConfigProto(gpu_options=gpu_options)

session = tf.Session(config=config)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.2 限制GPU的使用率

方法一:

config = tf.ConfigProto()

config.gpu_options.per_process_gpu_memory_fraction = 0.85 #占用85%显存

session = tf.Session(config=config)

方法二:

gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.85)

config=tf.ConfigProto(gpu_options=gpu_options)

session = tf.Session(config=config)
1
2
3
4
5
6
7
8
9
10
11
12
13
【注意】当限制GPU使用率时,GPU所占的显存是一直占着的,哪怕你Ctrl+Z 终止了程序,这时你需要手动kill进程。具体如下:

如果你在linux终端运行深度学习python脚本文件,运行中发现占用多个GPU和内存资源,可用下面的方法解决:

(1)请先查看占用资源的进程归属方是谁,在cmd终端执行命令:

ps -f # 查看PID号
1
(2)然后确认该进程PID号后,可以kill直接杀掉:

kill -9 PID号 #注意必须加-9,否则可能杀不掉进程
1
这个就是通过动态申请显存来设置TensorFlow session的。

参考链接:tf.ConfigProto和tf.GPUOptions用法总结

我的Keras使用总结(5)——Keras指定显卡且限制显存用量,常见函数的用法及其习题练习

CPU充分占用
尝试在 CPU 集群上运行 keras,为此我需要限制使用的内核数量(它是一个共享系统)。所以为了限制内核数量的解决方法:

from keras import backend as K
import tensorflow as tf
jobs = 2 # it means number of cores
config = tf.ConfigProto(intra_op_parallelism_threads=jobs,
inter_op_parallelism_threads=jobs,
allow_soft_placement=True,
device_count={'CPU': jobs})
session = tf.Session(config=config)
K.set_session(session)
1
2
3
4
5
6
7
8
9
参考链接:Python backend.set_session方法代碼示例

Keras以及Tensorflow强制使用CPU的方法
Keras如果是使用Theano后端的话,应该是自动不使用GPU只是用CPU的,启动GPU使用Theano内部命令即可。

对于Tensorflow后端的Keras以及Tensorflow会自动使用可见的GPU,而我需要其必须只运行在CPU上。网上查到三种方法,最后一种方法被证明有用,但也对三种方法分别记录如下:

1. 对于Tensorflow,声明Session的时候加入device_count={'gpu':0}即可,代码如下:

import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(device_count={'gpu':0}))
1
2
2. 对于Keras,则调用后端函数,设置其使用如上定义的Session即可,代码如下:

import tensorflow as tf
import keras.backend.tensorflow_backend as KTF
KTF.set_session(tf.Session(config=tf.ConfigProto(device_count={'gpu':0})))
1
2
3
3. 使用CUDA_VISIBLE_DEVICES命令行参数,代码如下:

CUDA_VISIBLE_DEVICES="0" python3 train.py
1
参考链接:TensorFlow和keras中GPU使用的设置操作
————————————————
版权声明:本文为CSDN博主「Yale曼陀罗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42782150/article/details/122180782

posted @ 2022-06-29 00:30  China Soft  阅读(477)  评论(0编辑  收藏  举报