如何确保 Pytorch 中的所有内容都自动在 GPU 上运行?

Cha*_*ker 5 machine-learning neural-network conv-neural-network pytorch

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

torch.everything_to_gpu()
Run Code Online (Sandbox Code Playgroud)

然后它就“正常工作”了。我不关心手动将东西放入 GPU 等。我只是希望它自动完成它的事情(有点像张量流那样?)。我确实在 pytorch 论坛中看到了相关问题,但似乎他们没有直接解决我的问题。

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

dtype = torch.FloatTensor
# dtype = torch.cuda.FloatTensor # Uncomment this to run on GPU
Run Code Online (Sandbox Code Playgroud)

所以只要每个变量/张量都以dtype某种方式进行,例如

Variable(torch.FloatTensor(x).type(dtype), requires_grad=False)
Run Code Online (Sandbox Code Playgroud)

那么我们可以使用该单个变量来控制 GPU 中的内容和不包含的内容。如果存在这样一个命令,我遇到的问题是在使用torch.nn.Modulepackage.json 时遇到的问题。例如当使用

l = torch.nn.Linear(D_in,D_out)
Run Code Online (Sandbox Code Playgroud)

或服装 NN 类(继承自它)。这种情况似乎处理它的最好方法是使用:

torch.nn.Module.cuda(device_id=device_id) # device_id = None is the default
Run Code Online (Sandbox Code Playgroud)

函数/方法。然而,这似乎向我表明,可能还有其他我可能不知道的隐藏功能,以确保一切确实在 GPU 中运行。

因此:是否有一种集中方式来确保所有内容都在某个(最好是自动)分配的 GPU 中运行?


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

plt*_*rdy 2

我认为不存在这样的事情。

据我所知,人们通常创建的类:
i) 继承自nn.Module.
ii) 具有描述模型参数的属性(例如self.opt);
iii) 将每个变量/参数设置为属性(例如self.my_var
iv)如果设置了.cuda()某种参数,则调用它。-use_gpu

我还在maybe_cuda(variable)我的类中使用了一个函数,以便更轻松地创建变量(传递一个变量,variable.cuda()如果opt.cuda为 True,则返回。

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

class MyModule(nn.Module):
    def __init__(self, opt):
        super(MyModule, self).__init__()
        self.opt = opt

    def maybe_cuda(self, variable):
        if self.opt.cuda:
            return variable.cuda()
        return variable

class Model(MyModule):
    def __init__(self, opt, other_arg):
        super(Model, self).__init__(opt)

        self.linear = nn.Linear(opt.size1, opt.size2)
        self.W_out = nn.Parameter(_____)

    def forward(self, ____):
        # create a variable, put it on GPU if possible
        my_var = self.maybe_cuda(Variable(torch.zeros(___)))
Run Code Online (Sandbox Code Playgroud)