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

Keras下CPU的使用

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

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""

注意:os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"可能会改变没有次句时GPU的默认序号。

TensorFlow和keras中GPU使用的设置

方法一: 在终端显式指定

这种方法与深度学习工具无关了,无论是Keras,tensorflow 还是Pytorch都可以使用

  1. 训练运行时候指定GPU,需在运行时候加一行代码:
CUDA_VISIBLE_DEVICES=0,2,3  python your_file.py

备注:这里的0,2,3是通过nvidia-smi 命令查看的GPU编号CUDA_VISIBLE_DEVICES取多个值时对应Tensorflow、Pytorch、Keras的多GPU的并行操作

  1. 运行过程中按需或者定量分配GPU,需在运行时候加一行代码:
CUDA_VISIBLE_DEVICES=0,1 python yourcode.py

方法二 :在Python代码中指定

这种方法也是与深度学习工具无关的方法。仔细看看这种方式其实和在【终端显式指定】类似,关键字都是一样的。

import os

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 多个GPU下使用的方法是“0,1,2,3”

备注: 需要注意的是,第一、二种方法在有些时候是无法起到作用的;如果遇到到这种情况: 用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. 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]) # 模型编译

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)

tensroflow指定GPU的多卡并行的时候,也是可以先将声明的变量放入GPU中,不过其他的框架没有这样做。

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

with tf.device("cpu:0")

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

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的话,需要这句话

Pytorch中GPU使用的设置

Pytorch 是目前比较方便的一种深度学习框架,在指定GPU的方法上,也是比较简洁。PyTorch提供有torch.cuda.set_device() 方法

import torch
torch.cuda.set_device(id)

这种方式只能制定一个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:

一、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)

2. 第二种是先构造config对象,再对构造的config对象进行赋值 。如下:

config = tf.ConfigProto()

config.log_device_placement= True

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

keras使用torch移动到GPU上运行 keras怎么使用gpu_CUDA

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

session = tf.Session(config=config)

二、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))

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 限制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)

【注意】当限制GPU使用率时,GPU所占的显存是一直占着的,哪怕你Ctrl+Z 终止了程序,这时你需要手动kill进程。具体如下:

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

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

ps -f     # 查看PID号

(2)然后确认该进程PID号后,可以kill直接杀掉:

kill -9 PID号   #注意必须加-9,否则可能杀不掉进程

这个就是通过动态申请显存来设置TensorFlow session的。

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)

参考链接: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}))

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})))

3. 使用CUDA_VISIBLE_DEVICES命令行参数,代码如下:

CUDA_VISIBLE_DEVICES="0" python3 train.py

参考链接:TensorFlow和keras中GPU使用的设置操作