【问题标题】:will loop decrease the utilization of the GPU?循环会降低 GPU 的利用率吗?
【发布时间】:2020-08-11 01:55:24
【问题描述】:

在 PyTorch 中,我在 DeepLearning Pipeline 的前向部分中有一个循环来规范化中间结果。

它会在 CPU 上运行并降低 GPU 的利用率吗?

一些sn-p如下:

def forward(self):
    ...
    for b in range(batch_size):
        self.points[b] = self.unit_cube(self.points[b])
    ....

【问题讨论】:

  • Python 不能在 gpu 上运行,除非您使用库将 glsl 之类的东西编译到计算着色器并将其绑定到 python。否则,你对 python 所做的一切都是通过运行在 cpu 上的 python 解释器来完成的。
  • @AwesomeCronk 它被标记为 PyTorch,这是一个库,可为深度学习项目提供轻松的 GPU 访问。
  • @Multihunter 啊……我完全错过了。感谢您的纠正!

标签: python tensorflow pytorch gpu


【解决方案1】:

在 Pytorch 中,操作是在 GPU 上还是 CPU 上完成取决于数据在哪里。 Pytorch 的主要卖点之一是您(通常)不必关心数据在哪里;界面是一样的。

如果张量数据在 GPU 上,则操作在 GPU 上完成。如果它在 CPU 上,则操作在 CPU 上完成。您选择如何组织这些操作(ifs、for loops 等)对其没有影响。

>>> import torch
>>> a = torch.randn(3,4,5)
>>> b = a.cuda()
>>> a.device
device(type='cpu')
>>> b.device
device(type='cuda', index=0)
>>> c = b
>>> for x in range(10):
...   c = c * 2
... 
>>> c.device
device(type='cuda', index=0)

在上面的例子中,我使用了一个 for 循环将 b 翻倍 10 次,并将结果存储在 c 中。这一切都是在 GPU 上完成的,我同样可以在 a 上完成,让它在 CPU 上发生。

【讨论】:

  • 非常感谢!我还想知道“打印”功能是否会破坏 GPU 进程?例如,我将输出打印到 shell 或文件。
  • 很少有操作会就地修改张量,当它们这样做时,它们会被明确表示。打印 GPU 张量不会使张量不在 GPU 上,原因与 print(a*2) 不会使 a 等于打印的值相同。出于同样的原因,b = a.cuda() 会产生两个独立的张量,一个在 GPU 上,另一个在 CPU 上。但是,一般来说,你应该试试看。如果你有一个张量,而b.device 表示cuda,那么它总是是一个 GPU 张量。
  • 其实我在训练一个图像分割项目,GPU的利用率一直在从0到55%。我想知道是不是因为print函数。
  • 啊,调试 GPU 利用率很棘手,因为它都是异步且难以理解的。我最成功的方法是编写一个单独的脚本,重复运行一些操作并估计每个操作需要多长时间。例如制作一些假数据,然后循环执行model.forward 10000 次,看看有/没有相关操作需要多长时间。不过,一般来说,print 不太可能导致这种情况。低于最大 GPU 利用率通常是因为数据加载管道。确保你在几个线程中运行。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2013-05-13
  • 2018-06-29
相关资源
最近更新 更多