精华内容
下载资源
问答
  • pytorch多GPU训练以及多线程加载数据

    万次阅读 2018-01-22 20:37:03
    更正说明: 时间 2018/01/23 现在我所测试得到的dataParallel只能有效的进行前向传播,不能后向传播。下面的关于后向传播的原因我没有在代码层面进行...Variable只有叶节点(在pytorch中计算图的倒着来的,叶节点就

    更正说明:

    时间 2018/01/23

    现在我所测试得到的dataParallel只能有效的进行前向传播,不能后向传播。下面的关于后向传播的原因我没有在代码层面进行分析,所以下面的记录部分(前面传播)是正确的。

    不过可以得出的结论有:Dataparallel不支持自动的后向传播;Variable的grad_fn不能修改;Variable只有叶节点(在pytorch中计算图的倒着来的,叶节点就是初始输入节点)可以修改requires_grad属性,因此尝试从中间开始记录“计算图”的计划落空(希望不要引起误解,requires_grad属性并不是用来决定是否保留subgraph的,但有点联系;更何况网络中的参数也是叶节点,不单单是输入,比如图片);

    目前就是这样,搞清楚了再来记录下来。


    pytorch多GPU训练

    时间2018/01/22

    pytorch支持多GPU训练,官方文档(pytorch 0.30)推荐使用DataParallel。但是这儿踩了一个很大的坑。

    pytorch使用gpu的踩坑记录:

    按照其官方网站上的说明,把神经网络结构做成了DataParallel对象,顺利的通过了前向传播,但是在后向传播进行梯度更新的时候出先了错误。后向计算以更新梯度时,因为grad_fn在dataparallel中,所以也要将更新梯度的方法放入到dataparallel中去。但是遗憾的是DataParallel计算得到的Variable中的属性grad_fn为torch.nn.parallel._function,而普通的网络所得到的对应grad_fn为torch.autograd.function。而前者不能用于backward(),所以最直接的想法是想修改计算图,但这样一点也不简单。

    关于Variable和DataParallel:

    简单的一提,这能帮助理解。Variable包含的的三个相关的项是data(记录数据Tensor),grad(记录梯度,以便后向传播),grad_fn(有人称为creator)。最后一个组成了计算所用的有向图。

    DataParallel是torch.nn下的一个类,需要制定的参数是module(可以多gpu运行的类函数)和input(数据集),module需要有parameter方法,input数据需要是Variable类型,默认沿着0轴(参数dim,可修改)将input分成多份。

    所以,pytorch(0.2.0)的多GPU训练方法:

    将net和loss 以及nn.optim统统放入到新的自定义类中。但注意,DataParallel的参数module需要有paramer方法,看源码也看不明白parameter用来干嘛,有什么作用。但是踩坑过程中,继承nn.module的类和torch.nn.optim类都可以放入dataparallel中去,所以自定义类直接继承自nn.module就好,不管了。反正整个网络的前向后向传播都是在这个dataparallel中完成的。代码如下:

    class train_parallel_module(nn.Module):#自定义类,继承自nn.Module,有人研究清楚了parameter欢迎讨论下啊
        """
        the net was used for DataParallel(module)
        """
    
        def __init__(self, net, optimizer, loss):#三个变量,见名知意
            super(train_parallel_module, self).__init__()
            self.net = net
            self.optim = optimizer
            self.loss = loss
    
        def forward(self, img, gt_heatmap):#img和gt_heatmap将沿着0轴分成等份。
            predicted = self.net(img)#前向传播
            l = self.loss(gt_heatmap, predicted)#loss计算
    
            # compute gradient and do SGD step
            self.optim.zero_grad()  # 后向传播
            l.backward()
            self.optim.step()  
            return l #结果返回,用于打印迭代的loss
    

    调用时的代码:

    # module for DataParallel
    module = train_parallel_module(net, optimizer, loss)
    module_parallel = nn.DataParallel(module, device_ids=device_ids)
    
    imgs = Variable(imgs, requires_grad=True).cuda(device_ids[0])  # device_ids[0]
    gt_heatmaps = Variable(gt_heatmaps).cuda(device_ids[0])
    l = module_parallel(imgs, gt_heatmaps) # 在这儿调用
    print 'loss is: {:.3f},and iter is {} with time {}'. \
        format(l.data[0], batch_iteration, time.time() - t)
    既然说到了GPU,顺便说一下加载数据时的多进程吧:
    data_loader = data.DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=6,
                                      pin_memory=True, drop_last=True, collate_fn=patch_data) #num_workers就是使用多进程
    顺便记录下遇到的奇怪问题:

    使用预训练的VGG网络,我需要再原有的结构上新增一个skip connection结构,我的skip结构conv4_3 feature map上运算会出现in_place原地操作错误,导致backward时候出错。而使用接下来的一层ReLu的skip结构则没有这种error出现。





    展开全文
  • 参考https://www.jianshu.com/p/98d3a23a2d62(在进行人脸识别模型训练时遇到),多线程读图,可以充分发挥GPU的利用率,加快训练速度; 2)tensorboard可视化 pytorch训练产生的日志文件,查看使用tensorboard,...

    目录

    多线程加载图片

    tensorboard可视化


     

    1)多线程加载图片

    参考https://www.jianshu.com/p/98d3a23a2d62(在进行人脸识别模型训练时遇到),多线程读图,可以充分发挥GPU的利用率,加快训练速度;

    2)tensorboard可视化

    pytorch训练产生的日志文件,查看使用tensorboard,conda虚拟环境激活安装使用以下命名行:

    pip install tensorflow==1.7.0

    然后终端进入日志文件夹目录下,执行:

    tensorboard --logdir="log/"

    终端出现:

    2019-05-30 16:28:12.638396: I tensorflow/core/platform/cpu_feature_guard.cc:140]
     Your CPU supports instructions that this TensorFlow binary was not compiled to 
    use: AVX2 FMA
    TensorBoard 1.7.0 at http://XXXXXping-PC:6006 (Press CTRL+C to quit)
    
    

    然后在浏览器中输入:

    http://XXXXXping-PC:6006

    就可以查看日志内容了。

    遇到的问题:开始安装   gpu版本的 tensorflow,而且没有加版本号,使用时报错:

    ImportError: libcublas.so.10.0: cannot open shared object file: No such file
    Failed to load the native TensorFlow runtime.

    查阅是gpu版本和tensorflow版本不匹配,后来想安装1.7.0版本的gpu版本,报错出现“网络不可达”,就干脆安装了cpu版本的。

    展开全文
  • Pytorch设置多线程进行dataloader

    千次阅读 2020-01-03 17:00:22
    使用 GPU 进行训练的时候, torch.utils.data.DataLoader ...(1条消息)Pytorch设置多线程进行dataloader时影响GPU运行_xiuxiuxiuxiul的博客-CSDN博客 https://blog.csdn.net/xiuxiuxiuxiul/article/details/...

    使用 GPU 进行训练的时候,

    torch.utils.data.DataLoader
    

    中的 num_workers 设置为0,设pytorch 自已决定

    参考文献
    (1条消息)Pytorch设置多线程进行dataloader时影响GPU运行_xiuxiuxiuxiul的博客-CSDN博客
    https://blog.csdn.net/xiuxiuxiuxiul/article/details/86233500

    (1条消息)PyTorch——num_workers参数的设置_墨门-CSDN博客
    https://blog.csdn.net/songyuc/article/details/103365591

    展开全文
  • Pytorch单机多卡训练

    2021-04-26 13:18:15
    DataParallel是单进程多线程控制GPU的实现方式,因此只能在一台机器上使用,而DistributedDataParallel则是多进程控制GPU,除了能实现单机多卡外,也能够实现分布式训练。 DataParallel一般会比...

    Pytorch单机多卡训练

    pytorch中单机多卡可以使用DataParallel和DistributedDataParallel 来实现。

    pytorch官网中推荐使用DistributedDataParallel。两者区别是:

    DataParallel是单进程多线程控制GPU的实现方式,因此只能在一台机器上使用,而DistributedDataParallel则是多进程控制GPU,除了能实现单机多卡外,也能够实现分布式训练。

    DataParallel一般会比DistributedDataParallel慢

    DistributedDataParallel支持model parallel

    DP有负载不均衡的现象

    DataParallel训练的原理

    并行训练有模型并行,数据并行和混合并行。数据并行即每个GPU上都有相同的模型参数,将一个batch的数据分给每个GPU,这样就可以设置更大的batchsize。假设有8个GPU,代码会将GPU0当做reducer,它的功能是分发给其他GPU数据和模型参数,参数更新。其他的GPU则是Maper,主要是进行前向传播和反向传播,向reducer传输自己的参数梯度。

    我们知道当batchsize为N时,单机单卡时我们计算loss时是将每个样本的loss求和取平均,这也就相当于把每个样本计算的梯度进行求和后再求平均得到最终的梯度,再进行参数更新。

    所以我们要清楚的是那些部分能够进行并行计算,前向传播和反向传播显然可以,因为其只依赖自己的样本,而参数更新不行。

    DistributedDataParallel

    DistributedDataParallel使用allreduce的方式,能够减少通信开销。并且每个GPU保存的参数都是一致的,在反向传播结束后,每个GPU中都有平均的梯度,这样确保模型参数保持同步

    一些参数的解释:

    nodes:结点数,也就是机器数对于单机多卡来说,其为1

    gpus:每个结点的GPU数

    world_size:需要运行的总进程数,nodes*gpus

    实战部分也是参考的这篇,因为是单机多卡,所以将process 0的ip设为127.0.0.1

    基本使用流程

    Pytorch 中分布式的基本使用流程如下:

    在使用 distributed 包的任何其他函数之前,需要使用 init_process_group 初始化进程组,同时初始化 distributed 包。
    如果需要进行小组内集体通信,用 new_group 创建子分组
    创建分布式并行模型 DDP(model, device_ids=device_ids)
    为数据集创建 Sampler
    使用启动工具 torch.distributed.launch 在每个主机上执行一次脚本,开始训练
    使用 destory_process_group() 销毁进程组

    展开全文
  • 在docker中运行的pytorch运行多线程训练,报如下错误: unexpected bus error encountered in worker. This might be caused by insufficient shared memory(shm) 解决方法,启动docker时,增加--ipc=host参数 ...
  • 当我使用pycharm运行 (https://github.com/Joyce94/cnn-text-classification-pytorch ) pytorch程序的时候,在Linux服务器上会开启...是因为在train.py中有大量的数据训练处理,会开启个进程,占用大量的CPU和进...
  • Pytorch 分布式训练

    2021-05-15 09:15:48
    文章目录Multi-GPUTCP 初始化ENV 初始化可选后端进程间通信操作Template...多线程:(具体教程见https://pytorch.org/tutorials/beginner/dist_overview.html) pytorch.nn.distributed # setup environment def setup
  • 看了网上很多的教程 ,都是 将线程数改为0, 一直不理解为什么同样的环境, 我另外一个代码 可以跑多线程, 后来发现是...我将所有的训练代码放在 train()里面 ,这样就可以使用多线程了, 我也不知道什么原因 。 ...
  • 软件实现方面,PyTorch本身的DataLoader有时候会不够用,需要额外操作,比如使用混合精度、数据预读取、多线程读取数据、多卡并行优化等策略也会给整个模型优化带来非常巨大的作用。那什么时候需要采取这篇文章的...
  • BigGAN-PyTorch-TPU-Parallel是用于训练BigGAN的并行版本。 它成功运行在batchsize = 8和16的情况下。由于xla团队强烈要求进行分布式培训,因此我选择了其中之一。 我已经解决了许多问题,当前回购协议的培训过程...
  • DP方式较为简单,但是多线程训练,并且主卡显存占用比其他卡会多很多。因此这里采用DDP方式来多卡计算。 DDP是多进程,将模型复制到多块卡上计算,数据分配较均衡。 使用DDP的一机多卡配置 1.加入local_rank参数...
  • 错误的原因:dataloader加载数据时,pytorch多线程共享tensor是通过打开文件的方式实现的,而打开文件的数量是有限制的,当需共享的tensor超过open files限制时,即会出现该错误。 解决方案: 1)修改多线程的...
  • 用torch tensor在GPU上运算来生成数据集,加速数据...如果构造dataset 时 是通过cuda tensor计算得到的,那么在创造dataloader 通过多线程加载数据时,请注意加上 import multiprocessing as mp,mp.set_start_method(.
  • 1、问题描述: 在PyTorch训练一个epoch时,...这个bug是和多线程有关系。 我自己的代码重写了dataloader,使用的是OpenCV的接口进行数据读取,而没有用PIL。 目前有三种可靠的解决方式 1、可能是因为OpenCV与Py...
  • 笔者在使用pytorch加载训练数据进行模型训练的时候,发现数据加载需要耗费太时间,该如何缩短数据加载的时间消耗呢?经过查询相关文档,总结实际操作过程如下: 1、尽量将jpg等格式的文件保存为bmp文件,可以降低...
  • - 问题描述 ...搜索文章发现,有人出现这种问题是和 cv2.imread 有关,用 OpenCV 的接口进行数据读取,而没有用 PIL,导致出现 OpenCV与Pytorch互锁的问题,关闭OpenCV的多线程即可解决问题1 2。 但
  • 因为用的线程, 打开文件太了导致的,如下步骤 1 num_workers变小有助于解决这个问题 train_loader = DataLoader( dataset=train_set, batch_size=args.batchsize, shuffle=True, num_workers=4, pin...
  • pytorch训练,gpu利用率不稳定

    千次阅读 2020-09-10 20:30:17
    单主机四gpu利用torch.nn.DataParallel进行gpu的训练;gpu的内存占有率没问题,但使用率很低,很长一段时间在百分之零。 问题原因: 读取每个batch size的图像时,cpu读取时间较长。(batch_size = 1024, 设置...
  • Ctrl+C之后呈现的信息表明,这个bug是和多线程有关系。 经过笔者实验,目前有三种可靠的解决方式 1).Dataloader里面不用cv2.imread进行读取图片,用cv2.imread还会带来一系列的不方便,比如不能结合tor...
  • Pytorch学习(三)定义自己的数据集及加载训练

    万次阅读 多人点赞 2019-06-06 14:58:14
    对于如何定义自己的Datasets我讲从以下几个方面进行解说 ...Pytorch中有工具函数torch.utils.Data.DataLoader,通过这个函数我们在准备加载数据集使用mini-batch的时候可以使用多线程并行处理,这样可以加快我...
  • torch.set_num_threads(35)用这句话可以设置线程数量,用设备管理器看自己电脑有多少个线程然后设置比总数稍微少一点就可以了。训练速度比之前快很,没有gpu就只能这样了。...
  • 目标:pytorch不管是训练还是推理时。cpu的使用率基本只有10%左右,尝试更好的利用cpu来加快训练和推理。 1.在搜索资料时很作者都提到了python的GIL问题,这边先了解下这个机制直接从例子入手。 本机的cpu是i5-...
  • pytorch锁死在dataloader(训练时卡死)

    千次阅读 2020-05-26 14:15:28
    1.问题描述 2.解决方案 (1)Dataloader里面不用cv2.imread进行读取图片,用cv2.imread还会带来一系列的不方便,比如不能...(3)如果用了cv2.imread,不想改代码的,那就加两条语句,来关闭Opencv的多线程:cv2.setNu
  • 在深度学习模型训练过程中,在服务器端或者本地pc端,输入nvidia-smi来观察显卡的GPU内存占用率(Memory-Usage),显卡的GPU利用率(GPU-util),然后采用top来查看CPU的线程数(PID数)和利用率(%CPU)。...
  • pytorch 学习1

    2021-05-19 17:30:30
    windows下DataLoader不支持多线程读取 num_workers=2 改成0 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data....
  • pytorch教程

    2019-01-18 00:34:18
    Pytorch 提供了更简单的方法来实现取 batch, shuffle 或者多线程去读取数据. torch.utils.data.DataLoader 来定义一个迭代器. dataiter = DataLoader(myDataset, batch_size=2, shuffle=True, collate_fn=default_...
  • 多线程数据加载 多GPU训练 记录仪 培训/测试结果可视化 安装 PyTorch(> = 0.4.1):请按照进行操作。 请注意,该代码是使用Python2开发的,尚未经过Python3的测试。 使用子模块克隆存储库 git clone --recursive ...
  • 多线程 将变形应用于图像以及注释 培训制度 加快培训体制 张量板 在多个暂停和播放中添加日志,加载并保存一致性。 仅维护“ n”个检查点 转移学习 评估码 DataParallel问题 使用OpenCV检测管道 支持PyTorch 0.4 ...
  • DDP训练大致是一个GPU开一个线程,如果有两个GPU,则将dataset分成2份,然后一个GPU读取一份 下面的代码能正确使用DDP分布式训练,直接参考即可 注:本代码只适用于单机多卡训练机多卡的由于资源有限还没试过 在...
  • 简介:这系列第一篇中讲了多线程和多进程的适用范围,写这篇的原因是遇到了进程池嵌套进程池的问题。(情况:我写的代码中使用了进程池,其中一个进程调用它他人写的使用进程池的函数。表现:他的函数直接跳过没有...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

pytorch多线程训练