Machine learning 如何确保Pytorch中的所有东西都自动在GPU上运行?

Machine learning 如何确保Pytorch中的所有东西都自动在GPU上运行?,machine-learning,neural-network,conv-neural-network,pytorch,Machine Learning,Neural Network,Conv Neural Network,Pytorch,我想要一种代码量最少的方法,这样脚本中的所有内容都能在GPU中自动运行(或者是pytorch的标准方式)。比如: torch.everything_to_gpu() 然后它“就行了”。我不在乎手动将东西放入GPU等。我只想让它自动完成它的工作(就像tensorflow做的那个样?)。我确实看到了,但他们似乎没有直接解决我的问题 现在在我看来(从我所经历的例子来看),通过为每个torch变量/张量指定一个简单的类型,可以做我想要做的事情,如下所示: dtype = torch.FloatTens

我想要一种代码量最少的方法,这样脚本中的所有内容都能在GPU中自动运行(或者是pytorch的标准方式)。比如:

torch.everything_to_gpu()
然后它“就行了”。我不在乎手动将东西放入GPU等。我只想让它自动完成它的工作(就像tensorflow做的那个样?)。我确实看到了,但他们似乎没有直接解决我的问题

现在在我看来(从我所经历的例子来看),通过为每个torch变量/张量指定一个简单的类型,可以做我想要做的事情,如下所示:

dtype = torch.FloatTensor
# dtype = torch.cuda.FloatTensor # Uncomment this to run on GPU
因此,只要每一个变量/张量以某种方式取
dtype

Variable(torch.FloatTensor(x).type(dtype), requires_grad=False)
然后我们可以使用这个变量来控制GPU中的内容,而不是。在使用
torch.nn.Module
package时,我遇到了一个问题,即如果存在这样一个命令,就会使事情变得模棱两可。例如使用

l = torch.nn.Linear(D_in,D_out)
或类(从中继承的)。处理此类情况的最佳方法似乎是使用:

torch.nn.Module.cuda(device_id=device_id) # device_id = None is the default
功能/方法。然而,这似乎向我暗示,可能有其他隐藏的功能,我可能不知道,以确保一切确实运行在GPU

因此:是否有一种集中的方法来确保一切都在一些(理想情况下是自动)分配的GPU中运行



在反思中,我认为有一件事让我困惑,那就是我不理解Pytork载体在GPU上如何计算的模型。例如,我相当确定MATLAB的工作方式是,如果至少有一个东西在GPU上,那么所有进一步的计算都将在GPU上进行。所以我想,我在想,这就是pytorch的工作原理吗?如果可能的话,它与TensorFlow相比如何?

我认为没有这样的东西

据我所见,人们通常创建这样的类:
i) 继承自
nn.Module

ii)具有描述模型参数的属性(例如,
self.opt

iii)将每个变量/参数设置为属性(例如
self.my_var

iv)如果设置了一种
-use\u gpu
参数,则对其调用
.cuda()

我还在类中使用
maybe\u cuda(variable)
函数,以便更轻松地创建变量(如果
opt.cuda
为True,则返回
variable.cuda()

事实上,我做了这样的事情(可能并不完美,但觉得很实用):

类MyModule(nn.Module):
定义初始化(自我,选择):
超级(MyModule,self)。\uuuu init\uuuuu()
self.opt=opt
def/U cuda(自变量):
如果self.opt.cuda:
返回变量.cuda()
返回变量
类模型(MyModule):
定义初始值(自我、选择、其他参数):
超级(模型,自我).\uuuuu初始\uuuuuuuuuuuuu(可选)
self.linear=nn.linear(opt.size1,opt.size2)
self.W_out=nn.参数
def转发(自,自):
#创建一个变量,如果可能的话,把它放在GPU上
my_var=self.maybe_cuda(变量(torch.zeros(uuuuuu)))

据我所知,没有一个配置可以让将来所有与torch相关的计算都在GPU中进行。您需要明确指定它

此外,以下是在GPU中运行代码的另一种简单方法。创建一个
torch.device
变量,该变量包含要在其上运行代码的设备的设备信息

#假设您有一个cuda布尔标志
设备=火炬。设备('cuda'),如果cuda不是火炬。设备('cpu'))
some_tensor=torch.randn(2).to(设备)
some_model=ModelClass().to(设备)
#如果要使用多个GPU,请使用DataParallel
some_model=torch.nn.DataParallel(some_model)
至于最后一个问题,依赖于张量的新张量将自动驻留在父张量的设备中

GPU中的a=torch.randn(1.cuda()# b=a+2#也在GPU中
github上的文档似乎是一个开放的问题:。我来这里是因为我觉得这是一个愚蠢的问题,有很好的理由不这么做(这里他们提到了一些不可调试的场景,其中您有一个程序在多个设备上运行张量…)。似乎这是足够多的人想要的东西,他们可能会实现它。

我没有。我并没有真正解决这个问题。
可能_cuda
有用的是,你可以传递任何类型的张量(FloatTensor、LongTensor、ByteTensor等)或变量。两者都实现
.cuda()
。另一方面,如您所说,使用dtype需要i)有一个全局dtype变量或到处传递它,ii)不能解决一般问题,即对于其他类型,我想我感到困惑的是,如果至少有一个张量被指定为生活在GPU中,这是否意味着未来的每一个张量也会自动生活在GPU中?我相信MATLAB就是这样工作的,但我不明白pytorch中的GPU计算模型是什么(或者它与TensorFlow等其他流行框架相比如何)。