如何使用火炬来加快一些常见的计算?

时间:2019-05-16 10:30:27

标签: gpu pytorch torch

我正在尝试进行一些常见的计算,例如矩阵乘法,但没有进行梯度计算。我的计算示例就像

import numpy as np
from scipy.special import logsumexp

var = 1e-8
a = np.random.randint(0,10,(128,20))
result = np.logsumexp(a, axis=1) / 2. + np.log(np.pi * var)

我想使用割炬(gpu)来加快计算速度。这是代码

import numpy as np
import torch

var = 1e-8
a = np.random.randint(0,10,(128,20))
a = torch.numpy_from(a).cuda()

result = torch.logsumexp(a, dim=1)/ 2. + np.log(np.pi*var)

但是我有一些问题:

  1. 上面的代码可以加快计算速度吗?我不知道它是否有效。

  2. 我是否需要将所有值转换为torch.tensor,例如从var转换为torch.tensor(var).cuda(),从np.log(np.pi*var)转换为torch.tensor?

  3. 我是否需要自己将所有张量转换为gpu,尤其是对于某些中间变量?

  4. 如果上述代码不起作用,如何使用gpu加快计算速度?

1 个答案:

答案 0 :(得分:0)

您只能使用割炬进行计算。

   import torch
   # optimization by passing device argument, tensor is created on gpu and hence move operation is saved
   # convert to float to use with logsumexp
   a = torch.randint(0,10, (128,20), device="cuda").float()
   result = torch.logsumexp(a, dim=1)/ 2.  

回答您的一些问题:

  

以上代码可以加快计算速度吗?

这取决于。如果矩阵乘法太多,使用gpu可以加快速度。

  

我是否需要将所有值都转换为torch.tensor,例如从var转换为torch.tensor(var).cuda(),从np.log(np.pi * var)转换为torch.tensor?

  

我是否需要自己将所有张量转换为gpu,尤其是对于某些中间变量?

仅叶子变量需要转换,中间变量将放置在完成操作的设备上。例如:如果ab在gpu上,则由于操作c=a+b,c也将在gpu上。