精华内容
下载资源
问答
  • 注:本文针对单个服务器上多块GPU的使用,不是服务器多GPU的使用。在一些实验中,由于Batch_size的限制或者希望提高训练速度等原因,我们需要使用多块GPU。本文针对Pytorch中多块GPU的使用进行说明。1. 设置需要...

    注:本文针对单个服务器上多块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块和第4块GPU;

    第三行的0即为第二行中编号为0的GPU;1即为编号为4的GPU。

    2.更改网络,可以理解为将网络放入GPU

    class CNN(nn.Module):

    def __init__(self):

    super(CNN,self).__init__()

    self.conv1 = nn.Sequential(

    ......

    )

    ......

    self.out = nn.Linear(Liner_input,2)

    ......

    def forward(self,x):

    x = self.conv1(x)

    ......

    output = self.out(x)

    return output,x

    cnn = CNN()

    # 更改,.cuda()表示将本存储到CPU的网络及其参数存储到GPU!

    cnn.cuda()

    3. 更改输出数据(如向量/矩阵/张量):

    for epoch in range(EPOCH):

    epoch_loss = 0.

    for i, data in enumerate(train_loader2):

    image = data['image'] # data是字典,我们需要改的是其中的image

    #############更改!!!##################

    image = Variable(image).float().cuda()

    ############################################

    label = inputs['label']

    #############更改!!!##################

    label = Variable(label).type(torch.LongTensor).cuda()

    ############################################

    label = label.resize(BATCH_SIZE)

    output = cnn(image)[0]

    loss = loss_func(output, label) # cross entropy loss

    optimizer.zero_grad() # clear gradients for this training step

    loss.backward() # backpropagation, compute gradients

    optimizer.step()

    ... ...

    4. 更改其他CPU与GPU冲突的地方

    有些函数必要在GPU上完成,例如将Tensor转换为Numpy,就要使用data.cpu().numpy(),其中data是GPU上的Tensor。

    若直接使用data.numpy()则会报错。除此之外,plot等也需要在CPU中完成。如果不是很清楚哪里要改的话可以先不改,等到程序报错了,再哪里错了改哪里,效率会更高。例如:

    ... ...

    #################################################

    pred_y = torch.max(test_train_output, 1)[1].data.cpu().numpy()

    accuracy = float((pred_y == label.cpu().numpy()).astype(int).sum()) / float(len(label.cpu().numpy()))

    假如不加.cpu()便会报错,此时再改即可。

    5. 更改前向传播函数,从而使用多块GPU

    以VGG为例:

    class VGG(nn.Module):

    def __init__(self, features, num_classes=2, init_weights=True):

    super(VGG, self).__init__()

    ... ...

    def forward(self, x):

    #x = self.features(x)

    #################Multi GPUS#############################

    x = nn.parallel.data_parallel(self.features,x,ids)

    x = x.view(x.size(0), -1)

    # x = self.classifier(x)

    x = nn.parallel.data_parallel(self.classifier,x,ids)

    return x

    ... ...

    然后就可以看运行结果啦,nvidia-smi查看GPU使用情况:

    可以看到0和4都被使用啦

    以上这篇Pytorch 多块GPU的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    时间: 2019-12-29

    展开全文
  • pytorch指定多块GPU运行代码

    千次阅读 2020-12-25 17:05:14
    查看GPU状态和信息 nvidia-smi 在这里插入图片描述 定时刷新状态,-n(秒),每秒刷新一次 watch -n 1 nvidia-smi 指定可见GPU 终端跑程序指定GPU ...多块GPU可选 os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3

    查看GPU状态和信息

    nvidia-smi
    

    在这里插入图片描述在这里插入图片描述

    定时刷新状态,-n(秒),每秒刷新一次

    watch -n 1 nvidia-smi
    

    指定可见GPU

    终端跑程序指定GPU

    CUDA_VISIBLE_DEVICES=0 python XXX.py
    

    或者在python文件中加入

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

    多块GPU可选

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

    pytorch使用单GPU

    model = model.cuda()
    

    pytorch使用多GPU

    model = torch.nn.DataParallel(model, device_ids=[0,1,2,3]).cuda()
    

    使用了gpu0,1,2,3 共4块同时跑

    其他

    训练后保存的模型参数,再次导入模型时,出现报错:

    Missing key(s) in state_dict: ...
    

    解决办法:
    在导入参数前加上
    import torch.nn as nn
    from torch.backends import cudnn

    model = torch.nn.DataParallel(model)
    cudnn.benchmark = True
    
    展开全文
  • PyTorch使用多块GPU训练的代码,以及CPU和GPU的模型互相加载,模型fine tune的方法

    代码

    # 模型,训练模式
    net = Net(opt)
    net.train()
    
    
    # 损失函数,优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(net.parameters(), lr, (b1, b2))
    
    
    # 设定gpu
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3"
    
    # 如果epoch不为0,就加载已经训练过的ckpt
    if epoch != 0:
        ckpt = os.path.join(opt.out_path, 'net.pth')
        
        if torch.cuda.is_available():
            device = torch.device("cuda:0")
            net.to(device)
            criterion.to(device)
    
            # 多块gpu只转移模型
            if torch.cuda.device_count() > 1:
                net = nn.DataParallel(net, device_ids=[0,1,2,3])
                net.to(device)
    
            net.load_state_dict(torch.load(ckpt))
    
    # 否则不加载
    else:
        if torch.cuda.is_available():
            device = torch.device("cuda:0")
            net.to(device)
            criterion.to(device)
            
            if torch.cuda.device_count() > 1:
                net = nn.DataParallel(net, device_ids=[0,1,2,3])
                net.to(device)
    
    

    模型转移

    主要记载在GPU保存的模型读取到CPU,以及CPU保存的模型读取到GPU,主要的不同在于是否有module,无非就是加上和去掉的问题

    CPU->GPU

    # cpu保存的模型在gpu加载的方法
    from collections import OrderedDict
    new_state_dict = OrderedDict()
    for key, value in torch.load(ckpt).items():
        name = 'module.' + key # 加上module
        new_state_dict[name] = value
        
    net.load_state_dict(new_state_dict)
    
    

    GPU->CPU

    from collections import OrderedDict
    state_dict_new = OrderedDict()
    for key, value in torch.load(ckpt).items():
        name = key[7:] # 去掉module
        state_dict_new[name] = value
        
    net.load_state_dict(state_dict_new)
    
    

    或者还可以写得更简单:

    net.load_state_dict({k.replace('module.', ''): v for k, v in torch.load(model_path, map_location=torch.device('cpu')).items()})
    

    微调网络

    官方方法

    # 冻结除fc以外的层,再次写一遍fc层,默认求梯度
    for param in net.parameters():
    	param.requires_grad = False
    	net.fc = nn.Linear(512, 100)
    
    

    新方法

    # 更加灵活决定那些层是不求梯度的
    for param in list(net.parameters())[1:49]:
        param.requires_grad = False
    
    
    展开全文
  • pytorch同时调用多块GPU

    2021-10-30 15:58:18
    首先batch size要大于现有的gpu的数量。 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#cuda:0代表起始的; #device_id为0,如果直接是cuda,同样默认是从0...1,就多gpu训练 model = torc

    首先batch size要大于现有的gpu的数量。

    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#cuda:0代表起始的; #device_id为0,如果直接是cuda,同样默认是从0开始,可以根据实际需要修改起始位置,如cuda:1
    
    if torch.cuda.device_count() > 1: #查看当前电脑的可用的gpu的数量,若gpu数量>1,就多gpu训练
    	model = torch.nn.DataParallel(model)#多gpu训练,自动选择gpu
    # 
    model.to(device) 
    
    展开全文
  • ##2.Tensorflow使用GPU时的分配方法 方法一:在命令行中输入 CUDA_VISIBLE_DEVICES=0,1 python3 main.py 方法二:在代码中加入 import os os.environ['CUDA_VISIBLE_DEVICES'] = "0,1" 即可指定程序只在显
  • 多GPU设备运行程序指定GPU命令 方法1: 在程序中加入下面代码 import os os.environ["CUDA_VISIBLE_DEVICES"]="2" #2代码指定GPU的序号,序号一般从0开始,若多块,用“,”隔开 方法2: 在执行命令前加入指定GPU...
  • 来自官方的 教程 #单机单卡启动,默认使用第0号卡 $ python train.py #单机多卡启动,默认使用当前可见的所有卡 $ python -m paddle.distributed.launch train.py #单机多卡启动,设置当前使用的第0号和第1...
  • 其中一个就是:多块显卡被占用的问题,导致测试yoloV3,程序无法运行。出现以上问题的原因是tensorflow在训练默认占用所有GPU的显存。 解决方法: 在运行训练程序前,打开用户根目录下~/.bashrc文件 在文件头...
  • Keras多GPU训练指南

    2020-12-29 08:21:42
    摘要:随着Keras(v2.0.8)最新版本的发布,使用多GPU 训练深度神经网络将变得非常容易,就跟调用函数一样简单!利用多GPU,能够获得准线性的提速。Keras是我最喜欢的Python深度学习框架,特别是在图像分类领域。我在很...
  • pytorch 指定gpu训练与多gpu并行训练示例一. 指定一个gpu训练的两种方法:1.代码中指定import torchtorch.cuda.set_device(id)2.终端中指定CUDA_VISIBLE_DEVICES=1 python 你的程序其中id就是你的gpu编号二. 多gpu...
  • GPU 上分配显存 在GPU 上传入和转出显存数据 在GPU 上启动核函数 获取GPU 的相关信息 如要以运行程序的方式得出可用 GPU 的数量,请使用 cudaGetDeviceCount uint64_t num_gpus; ...
  • 服务器多GPU指定使用

    千次阅读 2021-11-15 16:45:02
    os.environ["CUDA_VISIBLE_DEVICES"] = '...代码中 CUDA_VISIBLE_DEVICES 这里设定为’2,3’,代表程序可见的GPU编号是第三和第四,也就是说如果你想使用第三和第四块GPU跑程序的话,你需要设置device id 为 [0,1
  • 背景让多人共同使用GPU资源而不相互干扰,同时系统资源分配比较灵活。服务器配置cpu48 Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz2颗24核CPU(指令:cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -ccat /...
  • 而对于一般的个人,甚至实验室来讲,配备个性能较好的gpu要比配备单个顶级gpu划算很。如果配备了gpu,在训练的时候如果没有指定device的话,你会发现你只有一个gpu的使用率上来了,其他的gpu都是被分配了一...
  • PyTorch构建了两种在GPU中实施分布式训练的方法:nn.DataParalllel和nn.DistributedParalllel。它们是包装和更改代码以及增加在GPU中训练网络的功能的简单方法。 nn.DataParallel更容易使用,但只需要在一...
  • 背景目前实验室GPU使用状况是:大...html经过本文,多卡读者能够实现分配每块GPU给特定同窗使用,也能够多人共用多块GPU。单卡读者能够实现多人共用一块GPU。linux需求说需求以前先来列一下机器配置:webCPU: i7-6...
  • pytorch使用多GPU训练两种方式:DataParallel和ModelParallel,这里主要介绍DataParallel 机制: DataParallel的机制是把每个minibatch分为GPU个数份儿,然后把原始模型复制到GPU上,在每个GPU上进行正向传播...
  • Pytorch指定某块GPU

    2021-06-21 21:08:51
    服务器块GPU,原本没有指定GPU的,直接用cuda()语句可以运行 今天GPU 0 上面别人在跑的程序,所以让我指定GPU 1 来跑 一开始试了各种方法代码还是报错,最后简单地加了一条语句就跑通了 import torch ...
  • 如下所示:device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#第一行代码model.to(device)#第二行代码首先是上面两行代码放在...这句代码的意思是将所有最开始读取数据的tersor变量copy...
  • pytorch 单gpu改为多gpu训练和测试 训练中 在plfd_backbone = plfd_backbone.to(device)之前加 import torch.nn as nn plfd_backbone = nn.DataParallel(plfd_backbone, device_ids = [0, 1, 2, 3]) device_ids:...
  • 关于多gpu训练,tf并没有给太的学习资料,比较官方的只有:tensorflow-models/tutorials/image/cifar10/cifar10_multi_gpu_train.py但代码比较简单,只是针对cifar做了数据并行的多gpu训练,利用到的layer、...
  • 在使用Pytorch加载模型出现这个错误语句。 原因:原本的模型是用两个GPU训练的,而你的电脑只有一个,所以会出错。 解决: model = torch.load(model_path) 改为: model = torch.load(model_path, map_...
  • 当你想指定个的时候可以用 os.environ["CUDA_VISIBLE_DEVICES"] = '1,2,3' 注意,修改指定GPU后 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 此代码中的0不用改变。 ...
  • TensorFlow多GPU训练

    2021-07-20 11:34:13
    提升GPU利用率 参考文献 问题描述 单机多GPU训练,机请自行查阅参考文献 解决方案 使用 tf.distribute.MirroredStrategy 的原理: 训练开始前,该策略在 N 个 GPU 上复制一份完整模型 每次训练传入一个批次数据,...
  • 一 . 指定一个 gpu训练的两种方法: ... gpu并行训练: bashtorch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0) 该函数实现了在module级别上的数据并行使用,注意batch size要大
  • 查看GPU状态和信息 nvidia-smi 1 在这里插入图片描述在这里插入图片描述 定时刷新状态,-n(秒),每秒刷新一次 watch -n 1 nvidia-smi 1 指定可见GPU ...多块GPU可选 os.environ[“CUDA_VISIBLE_DEVICES”
  • bert单机多GPU训练

    2021-04-08 22:20:11
    多GPU训练bert 概述 做nlp的肯定都听说过bert了,它属于迁移学习,官方提供了通用语料bert预训练结果,通过微调,可以提高下游任务的准确率。但是bert使用的维基百科这类的通用语料,对特定领域的文本特征学的不是很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,575
精华内容 57,030
关键字:

有多块gpu时