精华内容
下载资源
问答
  • tensorflow获取GPU设备

    千次阅读 2017-10-16 18:06:00
    tensorflow获取GPU设备 转自:http://blog.csdn.net/weixin_35653315/article/details/71403386 主要内容: 使用tensorflow查询机器上是否存在可用的gpu设备使用tensorflow获取可用的gpu设备编号tensorflow...

    tensorflow获取GPU设备

    转自:http://blog.csdn.net/weixin_35653315/article/details/71403386

    主要内容:

    • 使用tensorflow查询机器上是否存在可用的gpu设备
    • 使用tensorflow获取可用的gpu设备编号
    • tensorflow对GPU设备的编码

    使用tensorflow查询机器上是否存在可用的gpu设备

    def is_gpu_available(cuda_only=True):
      """
      code from https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/platform/test.py
      Returns whether TensorFlow can access a GPU.
      Args:
        cuda_only: limit the search to CUDA gpus.
      Returns:
        True iff a gpu device of the requested kind is available.
      """
      from tensorflow.python.client import device_lib as _device_lib
    
      if cuda_only:
        return any((x.device_type == 'GPU')
                   for x in _device_lib.list_local_devices())
      else:
        return any((x.device_type == 'GPU' or x.device_type == 'SYCL')
                   for x in _device_lib.list_local_devices())
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    使用tensorflow获取可用的gpu设备编号

    def get_available_gpus():
        """
        code from http://stackoverflow.com/questions/38559755/how-to-get-current-available-gpus-in-tensorflow
        """
        from tensorflow.python.client import device_lib as _device_lib
        local_device_protos = _device_lib.list_local_devices()
        return [x.name for x in local_device_protos if x.device_type == 'GPU']
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    完整代码见 tf.py, 测试代码见test_util_tf.py.

    tensorflow对GPU设备的编码

    执行:

    CUDA_VISIBLE_DEVICES=1,2  python test_util_tf.py
    • 1

    输出为:

    /gpu:0
    /gpu:1
    • 1
    • 2

    可以看出, 无论CUDA可见的设备是哪几个, tensorflow都会对它们从0开始重新编码。


    展开全文
  • keras自带模块 multi_gpu_model,此方式为数据并行的方式,将将目标模型在设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据,最高支持在8片GPU上并行。 使用方式: from keras.utils ...

    在keras环境中,使用多GPU进行训练,但是如何使保存的模型为能在单GPU上运行的模型呢?4块GPU环境下训练的模型,放到其他的机器上,那么也必须使用4GPU的机器才行。

    如果仅保存了多GPU权重-解决方法

    偷梁换柱!!
    即在多GPU的环境下加载权重(或者模型),再保存单GPU模型。
    前提条件,此时我们已经保存了最优的模型或者仅仅是模型参数:multi_model.h5
    流程如下:
    在这里插入图片描述

    多GPU训练

    keras自带模块 multi_gpu_model,此方式为数据并行的方式,将将目标模型在多个设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据,最高支持在8片GPU上并行。
    使用方式:

    def get_model(input_shape):
    .
    .
    .
    return model
    model = get_model(input_shape) #此时为单GPU 搭建的model
    
    from keras.utils import multi_gpu_model
    # Replicates `model` on 4 GPUs.
    # This assumes that your machine has 4 available GPUs.
    model = multi_gpu_model(model, gpus=4) #将搭建的model复制到4个GPU中
    # for train 
    model.compile(loss='categorical_crossentropy',
                           optimizer='adam')
    
    # fit data for train 
    

    单GPU预测

    因为定义的多核训练,所以网络的每一层都是按GPU来命名的,训练时采用多个GPU那么当导入参数的时候必须指定相同数量的GPU才行,如上代码的指定方式。但是,但我们将model切换到单GPU的环境中时,则会出现错误,此时我们必须将参数保存为单GPU的形式。
    方法:
    在原多GPU环境中导入模型,保存为单GPU版本,修改训练代码(fit),改为加载已经训练的权重。
    此时训练已经结束。

    def get_model(input_shape):
    .
    .
    .
    return model
    model = get_model(input_shape)  #此时为单GPU 搭建的model
    
    # metric
    # loss
    from keras.utils import multi_gpu_model
    paralleled_model = multi_gpu_model(model,gpus=4) # 此时paralleled_model为4个GPU的模型,已经进行复制,但是seg_model仍然为单GPU model。
    
    #seg_model.compile(optimizer=Adam) #训练结束,注释掉
    paralleled_model.load_weights("multi_model.h5") # 加载之前训练保存的在多GPU上训练的模型参数
    model.save('single_gpu_model.h5') # 保存单GPU的模型seg_model此时,保存的就是单模型参数!!
    
    

    加载单GPU模型:

    model.load_weights("single_gpu_model.h5") 
    

    多GPU训练,单GPU模型保存

    def get_model(input_shape):
    .
    .
    .
    return model
    model = get_model(input_shape) #此时为单GPU 搭建的model
    
    from keras.utils import multi_gpu_model
    # Replicates `model` on 4 GPUs.
    # This assumes that your machine has 4 available GPUs.
    paralleled_model = multi_gpu_model(model, gpus=4) #将搭建的model复制到4个GPU中
    # for train 
    paralleled_model.compile(loss='categorical_crossentropy',
                           optimizer='adam')
    model.save_weights("single_gpu_model.h5")
    # fit data for train 
    

    问题纪实

    使用多个GPU训练模型,使用multi_gpu_model和ModelCheckpoint来保存最佳模型,则在检查点保存的模型上调用load_model时会出现此错误:[4]

    "ValueError: axes don't match array"
    

    具体问题记录如下:
    在这里插入图片描述
    目前只能通过以上两种方式解决。
    但是,之前训练Unet时并未出现这个问题。。。。。。。
    -----2019-01-24


    参考:

    1. 【keras】一台设备上同时使用多张显卡训练同一个网络模型
    2. Keras 多GPU下模型和参数保存Modelcheckpoint callback报错问题以及在单GPU/CPU下载入
    3. Keras多GPU训练以及载入权重无效的问
    4. load_model fails with error ValueError: axes don’t match array
    展开全文
  • To函数 功能:转换数据类型\设备 ...多GPU分发并行机制 把数据等分,给不同的GPU运行 torch.nn.DataParallel # ============================ 手动选择gpu gpu_list = [2,3] gpu_list_str = ','.join(map(str, g

    To函数

    功能:转换数据类型\设备

    1.tensor.to()
    2.mouble.to()

    例子:
    在这里插入图片描述

    torch.cuda

    在这里插入图片描述

    多GPU分发并行机制

    把数据等分,给不同的GPU运行

    torch.nn.DataParallel

    在这里插入图片描述

    # ============================ 手动选择gpu
    gpu_list = [2,3]                                                     
    gpu_list_str = ','.join(map(str, gpu_list))                          
    os.environ.setdefault("CUDA_VISIBLE_DEVICES", gpu_list_str)          
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    # ============================ 依内存情况自动选择主gpu
    def get_gpu_memory():                                                             
        import platform                                                               
        if 'Windows' != platform.system():                                            
            import os                                                                 
            os.system('nvidia-smi -q -d Memory | grep -A4 GPU | grep Free > tmp.txt') 
            memory_gpu = [int(x.split()[2]) for x in open('tmp.txt', 'r').readlines()]
            os.system('rm tmp.txt')                                                   
        else:                                                                         
            memory_gpu = False                                                        
            print("显存计算功能暂不支持windows操作系统")                                            
        return memory_gpu                                                             
                                                                                      
                                                                                      
    gpu_memory = get_gpu_memory()                                                     
    if not gpu_memory:                                                                
        print("\ngpu free memory: {}".format(gpu_memory))                             
        gpu_list = np.argsort(gpu_memory)[::-1]                                       
                                                                                      
        gpu_list_str = ','.join(map(str, gpu_list))                                   
        os.environ.setdefault("CUDA_VISIBLE_DEVICES", gpu_list_str)                   
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")         
    

    常见报错

    1.原因:gpu训练出来的model,用map_location映射到cpu上
    在这里插入图片描述

    path_state_dict = "./model_in_gpu_0.pkl" 
    state_dict_load = torch.load(path_state_dict, map_location="cpu")
    print("state_dict_load:\n{}".format(state_dict_load))            
    

    2.多GPU(DataParallel)训练出来的模型,需要更改一下层的名字,因为在前面多了一个moudle字段
    在这里插入图片描述

    from collections import OrderedDict                   
    new_state_dict = OrderedDict()                        
    for k, v in state_dict_load.items():                  
        namekey = k[7:] if k.startswith('module.') else k 
        new_state_dict[namekey] = v                       
    print("new_state_dict:\n{}".format(new_state_dict))   
                                                          
    net.load_state_dict(new_state_dict)                   
    

    让网络加载new_state_dict即可

    展开全文
  • keras使用GPU训练: 1、简单方法:直接在运行前加 CUDA_VISIBLE_DEVICES=1 ...2、指定一块或GPU import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"...

    keras使用GPU训练:
    1、简单方法:直接在运行前加   CUDA_VISIBLE_DEVICES=1

    CUDA_VISIBLE_DEVICES=1 python train.py
    

    2、指定一块或多块GPU(这个是指定GPU的使用范围)

    import os
    
    os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
    
    os.environ["CUDA_VISIBLE_DEVICES"]="0"
    

    就可以使用0号显卡了,如果想使用多块显卡就可以使用:

    os.environ["CUDA_VISIBLE_DEVICES"]="0,1,2"
    

    当然如果想更精细地分配GPU的使用量还可以这么写:

    import tensorflow as tf
    import keras.backend.tensorflow_backend as KTF
    
    指定第一块GPU可用 
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    
    config = tf.ConfigProto()  
    config.gpu_options.per_process_gpu_memory_fraction = 0.5  # 程序最多只能占用指定gpu50%的显存
    config.gpu_options.allow_growth=True   #不全部占满显存, 按需分配
    sess = tf.Session(config=config)
    

    3、多GPU同时训练:

    keras.utils.multi_gpu_model(model, gpus)
    

    将模型在多个GPU上复制

    特别地,该函数用于单机多卡的数据并行支持,它按照下面的方式工作:
    (1)将模型的输入分为多个子batch
    (2)在每个设备上调用各自的模型,对各自的数据集运行
    (3)将结果连接为一个大的batch(在CPU上)
    例如,你的batch_size是64而gpus=2,则输入会被分为两个大小为32的子batch,在两个GPU上分别运行,通过连接后返回大小为64的结果。 该函数线性的增加了训练速度,最高支持8卡并行。

    *该函数只能在tf后端下使用

    参数如下:

    model: Keras模型对象,为了避免OOM错误(内存不足),该模型应在CPU上构建,参考下面的例子。
    gpus: 大或等于2的整数,要并行的GPU数目。
    该函数返回Keras模型对象,它看起来跟普通的keras模型一样,但实际上分布在多个GPU上。
    例子:

    import tensorflow as tf
    from keras.applications import Xception
    from keras.utils import multi_gpu_model
    import numpy as np
    
    num_samples = 1000
    height = 224
    width = 224
    num_classes = 1000
    
    # Instantiate the base model
    # (here, we do it on CPU, which is optional).
    with tf.device('/cpu:0'):
        model = Xception(weights=None,
                         input_shape=(height, width, 3),
                         classes=num_classes)
    
    # Replicates the model on 8 GPUs.
    # This assumes that your machine has 8 available GPUs.
    parallel_model = multi_gpu_model(model, gpus=8)
    parallel_model.compile(loss='categorical_crossentropy',
                           optimizer='rmsprop')
    
    # Generate dummy data.
    x = np.random.random((num_samples, height, width, 3))
    y = np.random.random((num_samples, num_classes))
    
    # This `fit` call will be distributed on 8 GPUs.
    # Since the batch size is 256, each GPU will process 32 samples.
    parallel_model.fit(x, y, epochs=20, batch_size=256)
    

    多GPU训练,更多细节可参考:https://www.jianshu.com/p/d57595dac5a9

    展开全文
  • tensorflow 多GPU训练

    千次阅读 2019-02-20 20:40:48
    使用GPU训练个算法 不同算法在不同GPU上训练(实质上还是 单GPU--->单算法)以上方法实现的是控制GPU的使用情况多GPU并行训练单个算法数据并行demo 不同算法在不同GPU上训练(实质上还是 单GPU—&...
  • keras 多gpu并行运行

    千次阅读 2019-03-08 10:55:45
    使用gpu运行model,可以分为两种情况,一是数据并行,二是设备并行。 二、数据并行 数据并行将目标模型在设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据。 利用multi_gpu_model...
  • tensorflow获取可用GPU设备

    万次阅读 2017-05-08 09:54:38
    主要内容: * 使用tensorflow查询机器上是否存在可用的gpu设备 * 使用tensorflow获取可用的gpu设备编号 * tensorflow对GPU设备的编码使用tensorflow查询机器上是否存在可用的gpu设备
  • 多GPU使用详解

    千次阅读 2018-06-14 09:13:29
    目录: 介绍 记录设备状态 ...在 TensorFlow 中支持的设备类型包括 CPU GPU。他们用字符串来表达,例如:   “/cpu:0”: 机器的 CPU “/device:GPU:0”: 机器的 GP...
  • 解决了PyTorch 使用torch.nn.DataParallel 进行多GPU训练的一个BUG:模型(参数)数据不在相同设备上 使用torch.nn.DataParallel进行多GPU训练时出现了一个BUG, 困扰许久: RuntimeError: Expected tensor for ...
  • 多GPU训练机制

    千次阅读 2019-07-17 18:24:24
    引言 通常情况下,在深度学习中使用梯度下降算法进行训练时,往往需要较大的batch-size才能获得良好的性能。...但是batch-size太小的话会影响性能,这时候如果硬件条件允许的情况下可以使用多GPU进行训练。 ...
  • OpenCL的多GPU开发(顺便提一下OpenGL的多GPU开发)标签(空格分隔):加速 opencl需求在某些加速优化项目中会使用到GPU,且为了追求速度,有时候我们会使用GPU。就OpenCL而言,如何充分利用GPU的运算能力...
  • CUDA 多GPU调用实现

    千次阅读 2019-04-09 19:50:21
    设备存在GPU时,为了高效利用GPU,我们常常需要使用多卡计算。本例中我们使用OpenMP来进行线程调用多GPU运行,初学者无须详细了解OpenMP,只需知道一两句命令就行。 详细步骤如下: 1、建立一个普通CUDA...
  • 多GPU运行

    千次阅读 2018-01-17 12:47:04
    有两种方法可以在GPU上运行一个模型:数据并行/设备并行大多数情况下,你需要的很可能是“数据并行”数据并行数据并行将目标模型在设备上各复制一份,并使用每个设备上的复制品处理整个数据集的不同部分数据...
  • pytorch中多GPU训练

    千次阅读 2019-04-10 17:51:58
    如果指定在某个GPU(如0号GPU)上训练,则只需要添加: import os os.environ["CUDA_VISIBLE_DEVICES"] = "0" 如果需要同时使用GPU,则...Pytorch中多GPU训练指北 前言 在数据越来越的时代,随着模型规...
  • 有两种方法可在GPU 上运行单个模型:数据并行和设备并行(Keras官方建议使用 TensorFlow 后端)。第一部分讲如何使用数据并行的方式使用多GPU加速;第二部分给出一个设备并行的例子。 1、数据并行 1.1、...
  • Pytorch中多GPU并行计算教程

    千次阅读 2020-11-17 18:28:55
    model parallel,当模型很大,单块GPU的显存不足以放下整个模型时,通常会将模型分成个部分,每个部分放到不同的GUP设备中(下图左侧),这样就能将原本跑不了的模型利用GPU跑起来。但这种情况,一般不能加速...
  • tensorflow-gpu2.x无法检测到GPU设备

    千次阅读 2020-09-12 16:54:00
    tensorflow-gpu2.x无法检测到GPU设备 1.检查 在解决问题前检查一下tensorflow是否只能检查到CPU,而无法检查到GPU,而非无法调用GPU。 import tensorflow as tf print(tf.test.is_gpu_available()) gpus = tf.config...
  • Python提供了一个 名为PyCUDA 的封装,通过使用Nvidia ...而PyCUDA是主要针对NVIDIA的GPU的,为了使用该库,需要你有相应的GPU设备,以及安装了CUDA toolkit (CUDA toolkit下载地址); Step1 安装PyCUDA 安装前...
  • PyTorch指定GPU设备

    千次阅读 2019-07-10 16:08:39
    PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他GPU。 有如下两种方法来指定需要使用的GPU。 1. 类似tensorflow指定GPU的方式,使用CUDA_VISIBLE_DEVICES。 1.1 直接终端中设定: CUDA_...
  • GPU

    千次阅读 多人点赞 2019-08-01 21:12:42
    GPU出世之前,处理2D、3D图像都依赖于CPU,这样会使”日理万机“的CPU更加劳累不堪,再加上一些设计上的原因面对日益复杂的3D图像,常常出现显卡等待CPU处理数据的情况,GPU应运而生。 3.GPU解决什么问题: 密集...
  • GPU: 多GPU训练的同步模式异步模式

    千次阅读 2018-10-05 21:11:13
    TensorFlow可以用单个GPU,加速深度学习模型的训练过程,但要利用更GPU或者机器,需要了解如何并行化地训练深度学习模型。 常用的并行化深度学习模型训练方式有两种:同步模式异步模式。 下面将介绍这两种...
  • 我的GPU设备信息

    2017-03-01 09:24:52
    我的GPU设备信息如下:
  • pytorch指定使用的gpu设备

    千次阅读 2018-12-27 11:26:29
    最近在使用pytorch写程序,想在指定的GPU设备上执行。 假设函数func( )使用到了GPU设备: 则在func()函数内部或者调用func()的地方加上: os.environ["CUDA_VISIBLE_DEVICES"] = str(gpu_id) 我之前...
  • 使用python多GPU任务分配

    千次阅读 2019-05-20 21:36:27
    背景:在做地震波正演时需要逐炮进行正演,这里面涉及到节点、多GPU的任务分发工作。前人之前写的版本静态分发任务,不能满足节点内部GPU算力不同(比如两张1080Ti两张780Ti)而导致的计算时间浪费。所以考虑使用...
  • Tensorflow多GPU计算

    千次阅读 2019-05-11 09:52:24
    2. 如果一台机器上有GPU,那么默认只会有第一块GPU参与计算,其余的会白白浪费掉 单机单卡 常规操作,省略 单机多卡 各卡执行不同模型训练任务 # 只需要在代码开头导入os,并指定使用第几块GPU,默认重0.....
  • TheanoTensorflow多GPU使用问题

    千次阅读 2017-09-25 17:46:56
    我使用的是tensorflow-gpu (1.2.1)Theano (0.9.0),2个4G显存Nvidia Quadro M2000 GPU。 1. theano: ValueError: Could not infer context from inputs  THEANO_FLAGS="contexts=dev0->cuda0;dev1->cuda1,...
  • Keras 指定GPU import keras.backend.tensorflow_backend as KTF import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,4,5,8,9" 使用GPU训练 数据并行 (multi_gpu_...
  • 但是通常情况下,我们在训练时会使用GPU,但是在测试时,有时是多GPU的操作环境,有时是单GPU的操作环境,这就需要我们以不同的方式去加载模型。 一、 多GPU训练,多GPU加载 1.1 训练 os.environ["CUDA_...
  • 要获得GPU设备的数量,在cuda中是通过cudaGetDeviceCount(int*)来实现的。 对于每个GPU设备。cuda使用cudaDeviceProp类型来保存设备信息。cudaDeviceProp的详细内容如下  我们通过cudaGetDeviceProperties...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,353
精华内容 28,141
关键字:

多设备和多gpu