首页 > python教程

pytorch查看torch.Tensor和model是否在CUDA上的实例

时间:2020-12-18 python教程 查看: 812

今天训练faster R-CNN时,发现之前跑的很好的程序(是指在运行程序过程中,显卡利用率能够一直维持在70%以上),今天看的时候,显卡利用率很低,所以在想是不是我的训练数据torch.Tensor或者模型model没有加载到GPU上训练,于是查找如何查看tensor和model所在设备的命令。

import torch
import torchvision.models as models
model=models.vgg11(pretrained=False)
print(next(model.parameters()).is_cuda)#False

data=torch.ones((5,10))
print(data.device)#cpu

上述是我在自己的笔记本上(显然没有GPU)的打印情况。

上次被老板教授了好久,出现西安卡利用率一直很低的情况千万不能认为它不是问题,而一定要想办法解决。比如可以在加载训练图像的过程中(__getitem__方法中)设定数据增强过程中每个步骤的时间点,对每个步骤的时间点进行打印,判断花费时间较多的是哪些步骤,然后尝试对代码进行优化,因为torhc.utils.data中的__getitem__方法是由CPU上的一个num_workers执行一遍的,如果__getitem__方法执行太慢,则会导致IO速度变慢,即GPU在大多数时间都处于等待CPU读取数据并处理成torch.cuda.tensor的过程,一旦CPU读取一个batch size的数据完毕,GPU很快就计算结束,从而看到的现象是:GPU在绝大多数时间都处于利用率很低的状态。

所以我总结的是,如果GPU显卡利用率比较低,最可能的就是CPU数据IO耗费时间太多(我之前就是由于数据增强的裁剪过程为了裁剪到object使用了for循环,导致这一操作很耗时间),还有可能的原因是数据tensor或者模型model根本就没有加载到GPU cuda上面。其实还有一种可能性很小的原因就是,在网络前向传播的过程中某些特殊的操作对GPU的利用率不高,当然指的是除了网络(卷积,全连接)操作之外的其他的对于tensor的操作,比如我之前的faster R-CNN显卡利用率低就是因为RPN中的NMS算法速度太慢,大约2-3秒一张图,虽然这时候tensor特征图在CUDA上面,而且NMS也使用了CUDA kernel编译后的代码,也就是说NMS的计算仍然是利用的CPU,但是由于NMS算法并行度不高,所以对于GPU的利用不多,导致了显卡利用率低,之前那个是怎么解决的呢?

哈哈,说到底还是环境的问题非常重要,之前的faster R-CNN代码在python2  CUDA9.0 pytorch 0.4.0 环境下编译成功我就没有再仔细纠结环境问题,直接运行了,直到后来偶然换成python3 CUDA9.0 pytorch 0.4.1 环境才极大地提高了显卡利用率,并且通过设置了几十个打印时间点之后发现,真的就是NMS的速度现在基本能维持在0.02-0.2数量级范围内。

下图分别表示之前(显卡利用率很低)时的NMS处理单张图像所消耗的时间(之所以会有长有短是因为我支持不同分辨率的图像训练),后面一张图是GPU利用率一直能维持在很高的情况下NMS处理时间,由于数据增强部分的代码完全没有修改,故而换了环境之后我就没有再打印数据增强每个步骤所消耗的时间了。

以上这篇pytorch查看torch.Tensor和model是否在CUDA上的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

展开全文
上一篇:Pytorch提取模型特征向量保存至csv的例子
下一篇:PyTorch里面的torch.nn.Parameter()详解
输入字:
相关知识
Python 实现图片色彩转换案例

我们在看动漫、影视作品中,当人物在回忆过程中,体现出来的画面一般都是黑白或者褐色的。本文将提供将图片色彩转为黑白或者褐色风格的案例详解,感兴趣的小伙伴可以了解一下。

python初学定义函数

这篇文章主要为大家介绍了python的定义函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助,希望能够给你带来帮助

图文详解Python如何导入自己编写的py文件

有时候自己写了一个py文件,想要把它导入到另一个py文件里面,所以下面这篇文章主要给大家介绍了关于Python如何导入自己编写的py文件的相关资料,需要的朋友可以参考下

python二分法查找实例代码

二分算法是一种效率比较高的查找算法,其输入的是一个有序的元素列表,如果查找元素包含在列表中,二分查找返回其位置,否则返回NONE,下面这篇文章主要给大家介绍了关于python二分法查找的相关资料,需要的朋友可以参考下