keras实现多GPU或指定GPU的使用介绍

1. keras新版本中加入多GPU并行使用的函数

下面程序段即可实现一个或多个GPU加速:

注意:使用多GPU加速时,Keras版本必须是Keras2.0.9以上版本

from keras.utils.training_utils import multi_gpu_model  #导入keras多GPU函数
import VGG19   #导入已经写好的函数模型,例如VGG19

if G <= 1:
  print("[INFO] training with 1 GPU...")
  model = VGG19()

# otherwise, we are compiling using multiple GPUs
else:
  print("[INFO] training with {} GPUs...".format(G))
  # we'll store a copy of the model on *every* GPU and then combine
  # the results from the gradient updates on the CPU
  with tf.device("/cpu:0"):
    # initialize the model
    model1 = VGG19()
    # make the model parallel(if you have more than 2 GPU)
    model = multi_gpu_model(model1, gpus=G)

2.指定使用某个GPU

首先在终端查看主机中GPU编号:

watch -n -9 nvidia-smi

查询结果如下所示:

显示主机中只有一块GPU,编号为0

2.1 下面方法是直接在终端运行时加入相关语句实现指定GPU的使用

export CUDA_VISIBLE_DEVICES=0 python test.py
# 表示运行test.py文件时,使用编号为0的GPU卡
export CUDA_VISIBLE_DEVICES=0,2 python test.py
# 表示运行test.py文件时,使用编号为0和2的GPU卡

2.2 下面方法是在Python程序中添加

import os
# 使用第一张与第三张GPU卡
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2"

补充知识:踩坑记----large batch_size cause low var_acc

有时候,我们在训练模型前期,会出现很高的train_acc(训练准确率),但var_acc(验证准确率)却很低。这往往是因为我们模型在训练过程中已经进入局部最优,或者出现过拟合的现象。造成这种情况有多种原因,我只提出以下几点,有补充的可以在下面留言,我补充。

(1).训练数据分布不均匀,可能你的训练数据某一类别占据了大多数,比如95%的数据为苹果,5%的数据为其他类别,那么模型为了拟合训练数据,则模型会偏袒于把识别结果归属于苹果,而验证集的数据是正常的,那么便会出现高train_acc,低val_acc。

(2).训练数据没有shuffle,那么整个batch里面将会是同一个类别数据,比如都为苹果的图片,那么训练一个batch,那么模型输出将会往这一类别靠拢,会形成一个很高的acc的假象,但这个模型泛化能力却很低,因为这个模型都只会为了拟合这批同类的数据。

(3).训练集跟验证集的预处理不一致,这个是细节问题,输入的图片分布不一致,那么必然会影响到验证结果。

(4).模型过于复杂,造成过拟合现象,特别是在于训练数据集不多的情况下,更容易出现过拟合。

(5).这个也是最难发现的,就是过大的batch_size,造成训练前期,模型还未收敛,出现很高的train_acc,却有很低的val_acc,亲测,在120个类别,参数只有七万的分类模型中,在batch-size等于64的情况下,在第二个epoch时,train_acc达到80%,val_acc却只有6%,train_loss跟val_loss也是相差很大,而在batch_size在等于8的情况下,在第二个epoch,train_acc跟val_acc皆能达到60%,且还有上升的趋势。至于为什么,个人认为,模型在大的batch_size的情况下,模型泛化能力下降,且更难拟合,每个epoch所包含的step也更少,且在adam的优化算法,前期的学习率较高,模型出现了振荡,一直在局部最优值徘徊,具体原因不知。

接下来分析下,batc_size对模型的影响:

large batch_size:

好处:训练的更快,每一step都包含更多的训练集,模型准确率会更高,不容易受到噪声的影响,稳定性更好。

small batch_size:

好处:不容易陷入局部最优,泛化能力更强。

总结:

(1).large batch_size,虽然训练模型的训练误差会更低,但往往在execute的时候,效果却不尽人意。

(2).在时间允许的情况下,建议batch_size在32或以下。

以上这篇keras实现多GPU或指定GPU的使用介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • keras多显卡训练方式

    使用keras进行训练,默认使用单显卡,即使设置了os.environ['CUDA_VISIBLE_DEVICES']为两张显卡,也只是占满了显存,再设置tf.GPUOptions(allow_growth=True)之后可以清楚看到,只占用了第一张显卡,第二张显卡完全没用. 要使用多张显卡,需要按如下步骤: (1)import multi_gpu_model函数:from keras.utils import multi_gpu_model (2)在定义好model之后,使用multi_gpu

  • Pytorch 多块GPU的使用详解

    注:本文针对单个服务器上多块GPU的使用,不是多服务器多GPU的使用. 在一些实验中,由于Batch_size的限制或者希望提高训练速度等原因,我们需要使用多块GPU.本文针对Pytorch中多块GPU的使用进行说明. 1. 设置需要使用的GPU编号 import os os.environ["CUDA_VISIBLE_DEVICES"] = "0,4" ids = [0,1] 比如我们需要使用第0和第4块GPU,只用上述三行代码即可. 其中第二行指程序只能看到第1

  • pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    如下所示: device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#第一行代码 model.to(device)#第二行代码 首先是上面两行代码放在读取数据之前. mytensor = my_tensor.to(device)#第三行代码 然后是第三行代码.这句代码的意思是将所有最开始读取数据时的tersor变量copy一份到device所指定的GPU上去,之后的运算都在GPU上

  • keras 多gpu并行运行案例

    一.多张gpu的卡上使用keras 有多张gpu卡时,推荐使用tensorflow 作为后端.使用多张gpu运行model,可以分为两种情况,一是数据并行,二是设备并行. 二.数据并行 数据并行将目标模型在多个设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据. 利用multi_gpu_model实现 keras.utils.multi_gpu_model(model, gpus=None, cpu_merge=True, cpu_relocation=False) 具体来说

  • keras实现多GPU或指定GPU的使用介绍

    1. keras新版本中加入多GPU并行使用的函数 下面程序段即可实现一个或多个GPU加速: 注意:使用多GPU加速时,Keras版本必须是Keras2.0.9以上版本 from keras.utils.training_utils import multi_gpu_model #导入keras多GPU函数 import VGG19 #导入已经写好的函数模型,例如VGG19 if G <= 1: print("[INFO] training with 1 GPU...") mod

  • tensorflow指定GPU与动态分配GPU memory设置

    在tensorflow中,默认指定占用所有的GPU,如需指定占用的GPU,可以在命令行中: export CUDA_VISIBLE_DEVICES=1 这样便是只占用1号GPU,通过命令 nvidia-smi 可以查看各个GPU的使用情况. 另外,也可以在python程序中指定GPU,并且动态分配memory,代码如下 import os import sys os.environ['CUDA_VISIBLE_DEVICES'] = sys.argv[1] import tensorflow a

  • pytorch使用指定GPU训练的实例

    本文适合多GPU的机器,并且每个用户需要单独使用GPU训练. 虽然pytorch提供了指定gpu的几种方式,但是使用不当的话会遇到out of memory的问题,主要是因为pytorch会在第0块gpu上初始化,并且会占用一定空间的显存.这种情况下,经常会出现指定的gpu明明是空闲的,但是因为第0块gpu被占满而无法运行,一直报out of memory错误. 解决方案如下: 指定环境变量,屏蔽第0块gpu CUDA_VISIBLE_DEVICES = 1 main.py 这句话表示只有第1块

  • 在pytorch中为Module和Tensor指定GPU的例子

    pytorch指定GPU 在用pytorch写CNN的时候,发现一运行程序就卡住,然后cpu占用率100%,nvidia-smi 查看显卡发现并没有使用GPU.所以考虑将模型和输入数据及标签指定到gpu上. pytorch中的Tensor和Module可以指定gpu运行,并且可以指定在哪一块gpu上运行,方法非常简单,就是直接调用Tensor类和Module类中的 .cuda() 方法. import torch from PIL import Image import torch.nn as

  • pytorch 指定gpu训练与多gpu并行训练示例

    一. 指定一个gpu训练的两种方法: 1.代码中指定 import torch torch.cuda.set_device(id) 2.终端中指定 CUDA_VISIBLE_DEVICES=1 python 你的程序 其中id就是你的gpu编号 二. 多gpu并行训练: torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0) 该函数实现了在module级别上的数据并行使用,注意batch size要大于G

  • 基于tensorflow指定GPU运行及GPU资源分配的几种方式小结

    1. 在终端执行时设置使用哪些GPU(两种方式) (1) 如下(export 语句执行一次就行了,以后再运行代码不用执行) (2) 如下 2. 代码中指定(两种方式) (1) import os os.environ["CUDA_VISIBLE_DEVICES"] = "1" (2) # Creates a graph. with tf.device('/gpu:1'): a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0],

  • tensorflow使用指定gpu的方法

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

  • tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现

    在Python代码中指定GPU import os os.environ["CUDA_VISIBLE_DEVICES"] = "0" 设置定量的GPU使用量: config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.9 # 占用GPU90%的显存 session = tf.Session(config=config) 设置最小的GPU使用量: config =

  • 在tensorflow中设置使用某一块GPU、多GPU、CPU的操作

    tensorflow下设置使用某一块GPU(从0开始编号): import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "1" 多GPU: num_gpus = 4 for i in range(num_gpus): with tf.device('/gpu:%d',%i): ... 只是用cpu的

  • keras自定义损失函数并且模型加载的写法介绍

    keras自定义函数时候,正常在模型里自己写好自定义的函数,然后在模型编译的那行代码里写上接口即可.如下所示,focal_loss和fbeta_score是我们自己定义的两个函数,在model.compile加入它们,metrics里'accuracy'是keras自带的度量函数. def focal_loss(): ... return xx def fbeta_score(): ... return yy model.compile(optimizer=Adam(lr=0.0001), lo

随机推荐